我正在做一个需要解码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)
)。您可以往这个方向查。