我正在读取 C 中的 .wav 文件,然后尝试使用一些 QT 函数播放音频文件。这是我读取文件的方式:
FILE *fhandle=fopen("myAudioFile.wav","rb");
fread(ChunkID,1,4,fhandle);
fread(&ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk1Size,4,1,fhandle);
fread(&AudioFormat,2,1,fhandle);
fread(&NumChannels,2,1,fhandle);
fread(&SampleRate,4,1,fhandle);
fread(&ByteRate,4,1,fhandle);
fread(&BlockAlign,2,1,fhandle);
fread(&BitsPerSample,2,1,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
fread(&Subchunk2Size,4,1,fhandle);
Data=new quint16 [Subchunk2Size/(BitsPerSample/8)];
fread(Data,BitsPerSample/8,Subchunk2Size/(BitsPerSample/8),fhandle);
fclose(fhandle);
所以我的音频文件在里面Data
。的每个元素Data
都是无符号的 16 位整数。
为了播放声音,我将每个 16 位无符号整数分成两个字符,然后每 3 毫秒(使用计时器)向声卡发送 256 个字符。假设myData
是一个包含 256 个字符的字符数组,我这样做(每 3 毫秒)来播放声音:
m_output->write(myData, 256);
也m_output
被定义为:
m_output = m_audioOutput->start();
并m_audioOutput
定义为:
m_audioOutput = new QAudioOutput(m_Outputdevice, m_format, this);
并且音频格式正确设置为:
m_format.setFrequency(44100);
m_format.setChannels(2);
m_format.setSampleSize(16);
m_format.setSampleType(QAudioFormat::UnSignedInt );
m_format.setByteOrder(QAudioFormat::LittleEndian);
m_format.setCodec("audio/pcm");
但是,当我尝试运行代码时,我听到了一些与真实音频文件非常不同的噪音。有什么我做错了吗?
谢谢, TJ