资讯详情

Linux FFmpeg深度解析之avcodec_find_encoder_by_name调用流程与实战(二十四)

📅 2026/11/4 19:51:59 | 华诺云谱 👁 阅读
Linux FFmpeg深度解析之avcodec_find_encoder_by_name调用流程与实战(二十四)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮点击获取二维码文章目录1.前言2.应用场景和用法2.1按具体编码器实现选择2.2函数原型与返回语义3.调用流程剖析3.1按名称遍历注册表3.2从名称查找进入编码任务4.实战案例4.1准备编码器名称4.2按名称查找并创建上下文4.3完整代码5.总结1.前言本篇目的理解avcodec_find_encoder_by_name()如何按编码器名称精确查找AVCodec描述符并通过创建编码上下文验证查找结果。按AVCodecID查找时FFmpeg会从匹配格式的实现中选择一个编码器。如果应用已经确定要使用哪个具体实现例如构建中注册的mpeg4编码器就可以按名称查找。avcodec_find_encoder_by_name()只查找名称完全匹配的编码器描述符不会创建上下文也不会打开或运行编码器。编码器名称avcodec_find_encoder_by_name遍历已注册编码器并精确比较返回AVCodec或NULL2.应用场景和用法2.1按具体编码器实现选择按名称查找适合应用需要固定编码器实现的情况例如针对特定硬件编码器或明确指定软件编码器。编码器名称取自AVCodec.name必须与当前构建实际注册的名称一致。场景按名称查找的作用注意事项固定软件实现选择指定的软件编码器名称需精确匹配选择硬件编码器定位某个已注册的硬件编码器还要检查设备和像素格式支持产品配置指定编码器将配置项映射到FFmpeg编码器名名称不存在时应提供错误或回退诊断构建能力验证目标编码器是否被编译和注册查找成功仍不等于编码参数可用2.2函数原型与返回语义constAVCodec*avcodec_find_encoder_by_name(constchar*name);参数或返回值含义name编码器的注册名称返回值名称匹配的编码器描述符无匹配项时返回NULL内部查找先判断名称是否为NULL然后遍历注册的编码器过滤解码器并使用区分大小写的字符串比较匹配AVCodec.name。它不会按long_name查找也不会把类似的名称自动转换为目标编码器。返回的AVCodec由FFmpeg管理不需要调用者释放。创建运行上下文仍需调用avcodec_alloc_context3()设置参数后再调用avcodec_open2()。3.调用流程剖析3.1按名称遍历注册表avcodec_find_encoder_by_name()把名称和编码器类型判断函数传给内部find_codec_by_name()。遍历中只有满足编码器类型且AVCodec.name与输入字符串完全相同的条目才会返回。是否传入名称名称是否为空返回NULL遍历注册编码器比较AVCodec.name返回匹配项或NULL3.2从名称查找进入编码任务名称匹配成功后返回值仍然只是描述符。调用者把它传给avcodec_alloc_context3()然后配置编码参数并调用avcodec_open2()。如果名称不存在查找函数返回NULL。如果名称存在但当前硬件、像素格式或其他参数不匹配错误会在后续编码器打开阶段出现不能把两类失败混为一谈。4.实战案例4.1准备编码器名称案例使用FFmpeg常见的软件编码器名称mpeg4。具体名称是否可用取决于当前构建注册的编码器。4.2按名称查找并创建上下文程序通过名称获取描述符再创建编码上下文并配置视频参数。avcodec_open2()用于确认该描述符能否按当前参数初始化。4.3完整代码#includelibavcodec/avcodec.h#includelibavutil/pixfmt.hintmain(void){constchar*encoder_namempeg4;constAVCodec*codecNULL;AVCodecContext*contextNULL;intret1;/* 名称需要与注册的AVCodec.name完全匹配 */codecavcodec_find_encoder_by_name(encoder_name);if(codecNULL)gotodone;/* 查找只返回描述符编码上下文需要单独创建 */contextavcodec_alloc_context3(codec);if(contextNULL)gotodone;context-width640;context-height480;context-time_base(AVRational){1,25};context-framerate(AVRational){25,1};context-pix_fmtAV_PIX_FMT_YUV420P;/* 验证编码器能否按当前参数打开 */if(avcodec_open2(context,codec,NULL)0)gotodone;ret0;done:/* 上下文由调用者释放编码器描述符由FFmpeg管理 */avcodec_free_context(context);returnret;}5.总结avcodec_find_encoder_by_name()按AVCodec.name精确查找编码器描述符编码器上下文创建和运行仍由后续API负责。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑