ffmpegのオーディオ復号化方法(符号付き)+ ffmpegの高速再生オーディオデコーダ問題(検査のために容易に利用可能で注意してください)

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。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、パケット)は 、 戻り値をデコードしてデコードされるデータの量を決定して、デコードされたデータポインタがデコードされるまで、デコードされたオーディオフレームの残りの部分を継続するように変更されました!

次に、レコード、後で使用するために、だけでなく、あなたが同じ問題に遭遇する手助けをしたいです!

おすすめ

転載: blog.csdn.net/xjb2006/article/details/78980628