2012-12-20 61 views
1

我有一個基於桌面Qt的應用程序,它從網絡中獲取聲音流並使用QAudioOutput播放。我想爲用戶提供音量控制,以便減小音量。我的代碼如下所示:如何更改音頻的音量AVPacket

float volume_control = get_user_pref(); // user provided volume level {0.0,1.0} 

for (;;) { 
    AVPacket *retrieved_pkt = get_decoded_packet_stream(); // from network stream 

    AVPacket *work_pkt 
     = change_volume(retrieved_pkt, volume_control); // this is what I need 

    // remaining code to play the work_pkt ... 
} 

如何實現change_volume()或有任何關,我可以使用貨架功能?

編輯:添加編解碼器相關的信息作爲評論

QAudioFormat format; 
format.setFrequency(44100); 
format.setChannels(2); 
format.setSampleSize(16); 
format.setCodec("audio/pcm"); 
format.setByteOrder(QAudioFormat::LittleEndian); 
format.setSampleType(QAudioFormat::SignedInt); 
+0

是包含pcm數據的數據包嗎? '0 UmNyobe

+0

我不確定數據是否是PCM。我如何發現? –

+0

雖然我想減少在這種特殊情況下的體積,但我會對兩種(增加和減少)通用解決方案感興趣。 –

回答

0

下面的代碼只是正常工作要求。

// audio_buffer is a byte array of size data_size 
// volume_level is a float between 0 (silent) and 1 (original volume) 

int16_t * pcm_data = (int16_t*)(audio_buffer); 
int32_t pcmval; 
for (int ii = 0; ii < (data_size/2); ii++) { // 16 bit, hence divided by 2 
    pcmval = pcm_data[ii] * volume_level ; 
    pcm_data[ii] = pcmval; 
} 

編輯:我認爲這裏有一個很大的優化範圍,因爲我的解決方案是計算密集型的。我想avcodec_decode_audio()可以用來加速它。

相關問題