在QAudioOutput中更改音量后的噪音

时间:2015-09-28 11:19:02

标签: c++ c qt audio wav

我正在尝试使用QAudioOutput和wav in" raw format"来播放声音。在计时器超时(每50ms)后,我做了以下事情:

QByteArray TempSBuffer;
short int *hi;

// Check if wav has reached their end and reset its position to the beginning if yes
if((m_timerStepNum+1)*m_audioOutput->periodSize()>=m_soundBuffer.size()) {
    m_timerStepNum=0;
}
// 2. Write the buffer data for the next timecycle into a temporary QByteArray TempSBuffer
TempSBuffer=m_soundBuffer.mid(m_timerStepNum*m_audioOutput->periodSize(), m_audioOutput->periodSize());
hi=(short int *)TempSBuffer.data();

for(int i=0;i < m_audioOutput->periodSize() / 2;i++) { hi[i]*= m_audioOutput->volume(); }

// 4. Play the resulting buffer
m_ioDevice->write(TempSBuffer, m_audioOutput->periodSize());
m_timerStepNum++;

一切都很好但是当我尝试改变音量时,例如QAudioOutput中的0.2(并且我的主音量是100%)我得到了可怕的噪音。我应该承认,这只发生在我的一个格式为:

的wav文件中
bitsPerSample: 8
channels: 1
frequency: 16000

正如我所说,其他文件播放正常。格式良好播放波形的示例:

bitsPerSample: 16
channels: 1
frequency: 22050

bitsPerSample: 16
channels: 2
frequency: 22050

bitsPerSample: 16
channels: 2
frequency: 22050

1 个答案:

答案 0 :(得分:1)

嗯,根据最终笔记中的The ABCs of PCM (Uncompressed) digital audio -

  

出于某种原因,WAV文件不支持带符号的8位格式,因此在读取和写入WAV文件时,请注意8位表示未签名,但在几乎所有其他情况下它都是安全的假设整数已签名。

我通过将原始wav转换为16位格式解决了一段时间我的问题。