2015-09-28 343 views
2

我试图通过使用QAudioOutput和WAV以“原始格式”播放声音。定时器超时(每50ms)之后,我做以下操作:QAudioOutput更改音量后的噪音

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++; 

一切都扮演好,但是当我试图改变音量例如0.2 QAudioOutput说(和我的主音量为100%),我已经得到了可怕的噪音。我必须承认,这仅发生于具有格式我一个wav文件:

bitsPerSample: 8 
channels: 1 
frequency: 16000 

其他文件播放OK,像我说的。好打波的格式例子:

bitsPerSample: 16 
channels: 1 
frequency: 22050 

bitsPerSample: 16 
channels: 2 
frequency: 22050 

bitsPerSample: 16 
channels: 2 
frequency: 22050 

回答

1

那么,根据The ABCs of PCM (Uncompressed) digital audio最后说明 -

出于某种原因,WAV文件不支持符号的8位格式,所以当读取和写入WAV文件,请注意,8位表示无符号,但在几乎所有其他情况下,可以安全地假定整数已被签名。

我解决了,而我的问题,我的原始WAV转换为16位格式。

+1

您应该继续并将其标记为正确的答案。回答你自己的问题没有问题。干杯。 – jaket

+0

嗯,我认为这可能是不正确的答案,并决定等待一段时间 – user2123079