如何使用配置文件FF_PROFILE_AAC_LOW将音频编码为AAC

时间:2016-05-15 13:53:25

标签: encoding ffmpeg aac

我尝试通过以下设置将音频编码到配置文件FF_PROFILE_AAC_LOW的AAC。

oc_cxt->profile = FF_PROFILE_AAC_LOW;

同样来自av_dump_format的输出,我得到了这个

Metadata:
encoder         : Lavf57.36.100
Stream #0:0: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 192 kb/s

但输出不同。一切都很好,除了输出是AAC,而不是AAC (LC)。通过使用ffprobe进行检测,输出信息为

$ ffprobe o.m4a
...
Stream #0:0(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 195 kb/s (default)
...

AAC (LC)是我需要的理想结果。

但是从命令行,ffmpeg可以生成AAC (LC)输出。以下是一个小测试。

$ ffmpeg -f lavfi -i aevalsrc="sin(440*2*PI*t):d=5" aevalsrc.m4a
$ ffprobe aevalsrc.m4a
...
Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
...

如何选择FF_PROFILE_LOW来获取AAC (LC)输出?

1 个答案:

答案 0 :(得分:2)

这是由我没注意到的新ffmpeg api引起的。

额外数据需要在AVStream->codecpar->extradata之后复制回avcodec_open2。之后,ffprobe可以检测输出是我需要的格式AAC (LC)

以下是ffmpeg.c

的代码段
if (!ost->st->codecpar->extradata && avctx->extradata) {
    ost->st->codecpar->extradata = av_malloc(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
    if (!ost->st->codecpar->extradata) {
        av_log(NULL, AV_LOG_ERROR, "Could not allocate extradata buffer to copy parser data.\n");
        exit_program(1);
    }    
    ost->st->codecpar->extradata_size = avctx->extradata_size;
    memcpy(ost->st->codecpar->extradata, avctx->extradata, avctx->extradata_size);
}

希望任何人都使用最新版本的ffmpeg(3.x)会有所帮助。