用C ++和QT播放wav音频文件

时间:2012-10-14 20:32:12

标签: c++ qt audio wav

我正在用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 ms(使用一个定时器)我将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

1 个答案:

答案 0 :(得分:3)

我认为问题在于您使用的是QTimer。无论您使用何种平台,QTimer绝对不允许您每三毫秒准确运行一次代码。如果你只是一个样本,你的音频听起来会很糟糕。根据{{​​3}}:

  

......他们无法保证以指定的确切值超时。在   在很多情况下,他们可能会在一段时间内迟到   取决于系统计时器的准确性。

  

...在许多实际情况下,计时器的准确度不会等于[1 ms]。

尽管我喜欢Qt,但我不会尝试将其用于信号处理。我会使用另一个框架,例如QTimer docs