我正在开发一个需要将AC3音频解码为PCM编解码器的项目。我使用ffmpeg - libavcodec解码此AC3音频但结果始终在PCM签名的16位浮点中。由于我需要将结果作为PCM签名16位Big Endian,我现在所做的是使用libswscale将其更改为PCM Signed`16 Bit Little Endian并将其编码为PCM签名的16位Big Endian。在我的情况下这是不可接受的,因为我在低CPU的嵌入式Linux环境中工作。
有没有办法直接将音频解码到特定的PCM编解码器,我应该设置什么设置?
非常感谢你们
答案 0 :(得分:0)
这取决于您使用的FFmpeg版本。
在非常旧的版本中,所有AC3解码(以及我认为的所有音频)都以SAMPLE_FMT_S16
格式完成,因此没有问题。
从FFmpeg版本0.7开始,最高版本为1.0.x,默认值仍为SAMPLE_FMT_S16
,但您可以选择以浮点格式(AV_SAMPLE_FMT_FLT
)进行解码,方法是更改AVCodecContext::request_sample_fmt
成员。
在版本0.7中查看此代码,在AC3解码初始化中:
/* set scale value for float to int16 conversion */
if (avctx->request_sample_fmt == AV_SAMPLE_FMT_FLT) {
s->mul_bias = 1.0f;
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
} else {
s->mul_bias = 32767.0f;
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
}
从版本1.1开始,您别无选择:解码以AV_SAMPLE_FMT_FLTP
格式完成(浮点,但平面:每个通道都在自己的缓冲区中)。如果您需要S16数据,则必须创建SwrContext
并致电swr_convert()
。
上个月,FFmpeg 2.3退出了。 AC3解码器没有改变,但正如你在其发行说明中所看到的,他们补充说:
AC3定点解码
这个新的解码器将AC3解码为AV_SAMPLE_FMT_S16P
格式。我不确定如何激活if:也许你必须强制解码编解码器,或者可能有.configure选项(我在源代码中看到很多#if (USE_FIXED)
)。你可以查看这个方向。