gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:13 25 4
gpt4 key购买 nike

我正在开发一个项目,需要将 AC3 音频解码为 PCM 编解码器。我正在使用 ffmpeg - libavcodec 来解码此 AC3 音频,但结果始终为 PCM 有符号 16 位浮点。由于我需要结果为 PCM Signed 16 Bit Big Endian,所以我现在要做的就是使用 libswscale 将其更改为 PCM Signed `16 Bit Little Endian,并将其编码为 PCM Signed 16 Bit Big Endian。这对我来说是 Not Acceptable ,因为我在 CPU 较低的嵌入式 Linux 环境中工作。

有没有办法直接将音频解码为特定的 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 格式完成(浮点,但平面:每个 channel 都在自己的缓冲区中)。如果您想要 S16 数据,则必须创建 SwrContext 并调用 swr_convert()

  • 上个月,FFmpeg 2.3 发布了。 AC3 解码器没有变化,但正如您在发行说明中看到的那样,他们添加了:

AC3 fixed-point decoding

这个新的解码器将 AC3 解码为 AV_SAMPLE_FMT_S16P 格式。我不确定如何激活 if:也许您必须强制解码编解码器,或者可能有一个 .configure 选项(我在源代码中看到很多 #if (USE_FIXED) )。您可以朝这个方向检查。

关于linux - 如何将音频(使用 ffmpeg - libavcodec)解码为特定的 PCM 编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25300049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com