- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个项目,需要将 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/
我是一名优秀的程序员,十分优秀!