音频 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