音频MP2编码和解码产生半数据C ++和FFMPEG

时间:2016-07-07 06:17:11

标签: c++ audio encoding ffmpeg decoding

我有16位PCM数据和立体声设置,我从麦克风上抓取。

获取数据后,我使用以下编码器设置对其进行编码

AVCodec* audio_codec = avcodec_find_encoder(AV_CODEC_ID_MP2);

AVCodecContext* audio_codec_ctx = avcodec_alloc_context3(audio_codec);
audio_codec_ctx->bit_rate = 64000;
audio_codec_ctx->channels = 2;
audio_codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO;
audio_codec_ctx->sample_rate = 44100;
audio_codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16;

当我将音频数据传递到编码器时,我发现每次需要4608个字节的数据,并将其正确编码为MP2数据。麦克风抓取的PCM数据为88320字节,编码器每次占用4608字节并进行压缩。

如果我将已经编码的每个4608字节部分传递给解码器并使用与上述相同的设置但是使用解码器。

AVCodecID audio_codec_id = AV_CODEC_ID_MP2;
AVCodec * audio_decodec = avcodec_find_decoder(audio_codec_id);

audio_decodecContext = avcodec_alloc_context3(audio_decodec); 
audio_decodecContext->bit_rate = 64000;
audio_decodecContext->channels = 2;
audio_decodecContext->channel_layout = AV_CH_LAYOUT_STEREO;
audio_decodecContext->sample_rate = 44100;
audio_decodecContext->sample_fmt = AV_SAMPLE_FMT_S16;

解码工作并且成功但是当我查看数据大小时,它正好是编码的2034。我不明白为什么会这样。考虑到编码器和解码器是相同的,我会想象我会得到4608。

任何人都可以了解为什么会发生这种情况。我应该设置什么?

1 个答案:

答案 0 :(得分:1)

应使用audio_decodecContext->request_sample_fmt设置所请求的解码器样本格式。 sample_fmt由解码器本身设置,可能不同,在这种情况下,您应该使用libswresample在样本格式之间进行转换。