博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ffmpeg 如何选择具有相同AVCodecID的编解码器 (AVCodec)
阅读量:6294 次
发布时间:2019-06-22

本文共 1782 字,大约阅读时间需要 5 分钟。

AVStream 指明的码流的基本信息。对一个码流来说最基本的是 AVCodecID。AVCodecID 指明码流对应的标准,比如h264/h263/mp3/aac。同一个 AVCodecID 可能对应多个不同的编解码器 (AVCodec),他们有不同的 AVCodec.name。ffmpeg在选择时除了优先选择non-EXPERIMENTAL的codec, 不会试图去做其它优先选择,只是简单选取最早注册的那个:

下面是根据AVCodecID寻找编码器的代码选段:

static AVCodec *find_encdec(enum AVCodecID id, int encoder){    AVCodec *p, *experimental = NULL;    p = first_avcodec;    id= remap_deprecated_codec_id(id);    while (p) {        if ((encoder ? av_codec_is_encoder(p) : av_codec_is_decoder(p)) && p->id == id)        {            if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {                experimental = p;            } else                return p;        }        p = p->next;    }    return experimental;}

 

以AAC为例,若不在命令行手动指定 "-acodec xxxx", ffmpeg 会优先选择内部的 ff_aac_decoder 作为解码器:

AVCodec ff_aac_decoder = {    .name            = "aac",    .id              = AV_CODEC_ID_AAC,    .priv_data_size  = sizeof(AACContext),};AVCodec ff_libfdk_aac_decoder = {    .name           = "libfdk_aac",    .id             = AV_CODEC_ID_AAC,    .priv_data_size = sizeof(FDKAACDecContext),};void avcodec_register_all(void){    ...    REGISTER_ENCDEC (AAC,               aac);    REGISTER_DECODER(AAC_LATM,          aac_latm);    REGISTER_ENCODER(LIBFAAC,           libfaac);    REGISTER_ENCDEC (LIBFDK_AAC,        libfdk_aac);    REGISTER_ENCODER(LIBVO_AACENC,      libvo_aacenc);    REGISTER_ENCODER(LIBAACPLUS,        libaacplus);    REGISTER_PARSER(AAC,                aac);    REGISTER_PARSER(AAC_LATM,           aac_latm);    REGISTER_BSF(AAC_ADTSTOASC,         aac_adtstoasc);    ...}

 

ffmpeg 内部倒是有一个寻找所有AVCodecID对应的AVCodec的函数,但只用于print cmdl help.

static const AVCodec *next_codec_for_id(enum AVCodecID id, const AVCodec *prev,int encoder);

 

转载于:https://www.cnblogs.com/jogh/p/4970977.html

你可能感兴趣的文章
React源码学习——ReactClass
查看>>
电脑爱好者GHOSTWIN764位V4.0
查看>>
MYSQL——常用运算符和函数
查看>>
JS获取上传文件的大小
查看>>
Lync Server 2010迁移至Lync Server 2013故障排错Part1:缺少McsStandalone.msi
查看>>
域控制器建立教程
查看>>
RHCE 学习笔记(20) ACL
查看>>
Django 和 Ajax 简介
查看>>
Qt的一个颜色选取按钮QColorButton
查看>>
perl 散列数组
查看>>
puppet之service管理
查看>>
Exchange2010server证书申请及分配服务
查看>>
Cassandra 处理客户端请求
查看>>
[WinApi]邮槽通信C/S实例
查看>>
linux NFS配置:NFS相关概念及其配置与查看
查看>>
需求转化到文档维护
查看>>
《互联网运营智慧》第7章“简单cdn”正式版下载
查看>>
如何解决SQL Server 2008 R2中“阻止保存要求重新创建表的更改”的问题!
查看>>
基于Xcode原型驱动的iOS应用设计
查看>>
SOA标准之----SCA架构思想
查看>>