【问题标题】:How to encode audio to AAC with profile FF_PROFILE_AAC_LOW如何使用配置文件 FF_PROFILE_AAC_LOW 将音频编码为 AAC
【发布时间】:2016-05-15 13:53:25
【问题描述】:

我尝试通过以下设置使用配置文件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) 输出?

【问题讨论】:

    标签: encoding ffmpeg aac


    【解决方案1】:

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

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

    以下是来自ffmpeg.c的代码sn-p

    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) 的人有所帮助。

    【讨论】:

    • 要使用它 ffmpeg 4.x 应该用 AV_INPUT_BUFFER_PADDING_SIZE 替换 FF_INPUT_BUFFER_PADDING_SIZE
    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多