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



我正在做一个需要解码AC3音频到PCM编解码器的项目。我使用ffmpeg - libavcodec来解码这个AC3音频,但结果总是在PCM Signed 16位浮点数。由于我需要结果是PCM Signed 16位大端字节数,我现在所做的是使用libswscale将其更改为PCM Signed ' 16位小端字节数,并将其编码为PCM Signed 16位大端字节数。这在我的情况下是不可接受的,因为我在嵌入式linux环境下工作,CPU低。

是否有办法直接将音频解码为特定的PCM编解码器,我应该设置什么设置?

谢谢大家

这取决于您正在使用的FFmpeg版本。

  • 在非常旧的版本中,所有AC3解码(以及所有音频)都是在SAMPLE_FMT_S16格式中完成的,所以对你来说没有问题。

  • 从FFmpeg版本0.7开始,直到版本1.0。x,默认仍然是SAMPLE_FMT_S16,但您可以通过更改AVCodecContext::request_sample_fmt成员选择以浮点格式(AV_SAMPLE_FMT_FLT)解码。

参见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格式。我不确定如何激活它:也许你必须强制解码编解码器,或者可能有一个.configure选项(我在源代码中看到很多#if (USE_FIXED))。您可以往这个方向查。

相关内容

最新更新