1

ネットワークからサウンド ストリームを取得し、QAudioOutput. ユーザーが音量を下げることができるように、ユーザーに音量コントロールを提供したいと考えています。私のコードは次のようになります。

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);
4

1 に答える 1

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()高速化に使えそうです。

于 2013-01-03T17:43:33.010 に答える