【问题标题】:how to decode audio (using ffmpeg - libavcodec) to specific PCM codec如何将音频(使用 ffmpeg - libavcodec)解码为特定的 PCM 编解码器
【发布时间】:2014-10-07 15:10:58
【问题描述】:

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

有什么方法可以直接将音频解码为特定的 PCM 编解码器,我应该设置哪些设置?

非常感谢大家

【问题讨论】:

    标签: linux audio ffmpeg decode libavcodec


    【解决方案1】:

    这取决于您使用的 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))。你可以往这个方向检查。

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 2012-11-15
      • 1970-01-01
      • 2021-03-01
      • 2010-11-18
      • 2011-01-25
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      相关资源
      最近更新 更多