免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/xjb2006/article/details/78980628
オーディオのデコード時のプレーヤーの同じ転送速度を最近やって命名では、私は、オーディオおよびビデオファイルの大多数のためのネットワーク上のいくつかの問題(速い再生速度ffmpegのオーディオ復号化問題)法の有効遭遇したが、1つこうした特定のADPCMでエンコードされたWAVオーディオファイルなどの一部のオーディオの問題があるでしょう。
それのオーディオデコード部に直接コードを貼り付けます。
int pkt_size = packet->size;
for(;;)//解码,必须解码完,因为可能不止一帧数据。改变packet->data的指针
{
int got_picture=0;
Lock.Lock();
int ret = avcodec_decode_audio4(pCodecCtx_A, pFrame_A, &got_picture, packet);
Lock.Unlock();
if(ret<0)
break;
if(got_picture<=0)
break;
if(got_picture&&ret>=0)//这里是resample
{
int bytes_per_sample=Getbytes_per_sample(out_sample_fmt);
int in_samples_per_channel=pFrame_A->nb_samples;
int out_samples_per_channel= av_rescale_rnd(128 +in_samples_per_channel , out_sample_rate, pFrame_A->sample_rate, AV_ROUND_UP);
int size_per_sample_with_channels = out_channels*bytes_per_sample;
int out_size = out_samples_per_channel*size_per_sample_with_channels;
unsigned char *out[] = {(unsigned char*)audio_out_buffer};
int converted_samplers_per_channel=swr_convert(audio_convert_ctx,out, out_samples_per_channel,(const uint8_t **)pFrame_A->extended_data , in_samples_per_channel);
if(converted_samplers_per_channel>0)
{
fifo.push((BYTE*)audio_out_buffer,converted_samplers_per_channel*size_per_sample_with_channels);
}
}
Lock.Lock();
packet->data+=ret; //重要!!,必须改变输入数据的指针
Lock.Unlock();
pkt_size-=ret;
if(pkt_size<=0)
break;
}
上記のコードは:コードのみINT RET = avcodec_decode_audio4(pCodecCtx_A、pFrame_Aの一般回線ことに留意すべきである ;、&got_picture、パケット)は、出力、ADPCM圧縮オーディオファイル、または他のAの方法に変換されたPCMフォーマットのswr_convertを呼び出しますこれらのファイルは、加速再生が表示されますのような効果音が鳴り壊すので、動作しません。この方法は、実際に、理想化された 音声フレームのうちav_read_frameによってINT = NREAD(pFormatCtx、パケット)を分離(DEMUX)は(pCodecCtx_A可能と復号サイクルはINT RET = avcodec_decode_audio4によって死んでなければならない一つ以上であります、pFrame_A、&got_picture、パケット)は 、 戻り値をデコードしてデコードされるデータの量を決定して、デコードされたデータポインタがデコードされるまで、デコードされたオーディオフレームの残りの部分を継続するように変更されました!
次に、レコード、後で使用するために、だけでなく、あなたが同じ問題に遭遇する手助けをしたいです!