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

Posted

技术标签:

【中文标题】音频 MP2 编码和解码产生半数据 C++ 和 FFMPEG【英文标题】:Audio MP2 encoding and decoding producing half data C++ and FFMPEG 【发布时间】:2016-07-07 06:17:10 【问题描述】:

我有 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】:

应使用audio_decodecContext->request_sample_fmt 设置请求的解码器样本格式。 sample_fmt 是解码器自己设置的,可能会有所不同,此时应使用 libswresample 进行样本格式之间的转换。

【讨论】:

以上是关于音频 MP2 编码和解码产生半数据 C++ 和 FFMPEG的主要内容,如果未能解决你的问题,请参考以下文章

基于RK3399OpenHarmony富设备软件音频解码方案

HRESULT:尝试使用 NAudio 库播放 mp2 编码的 wav 文件时出现 0xC00D5212

Windows Phone 使用 NSpeex 编码和解码音频。解码有问题?

如何在 Java 中播放 Opus 编码的音频?

LAME -- 解码和编码音频文件

Android 提取解码编码多路复用音频