如何解码音频(使用ffmpeg - libavcodec)到特定的PCM编解码器

时间:2014-08-14 04:22:22

标签: linux audio ffmpeg decode libavcodec

我正在开发一个需要将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编解码器,我应该设置什么设置?

非常感谢你们

1 个答案:

答案 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))。你可以查看这个方向。