2015-09-28 91 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