当前位置: 首页 > news >正文

FFmpeg 根本API avcodec_open2函数内部调用流程分析

1、avcodec_open2 函数定义

avcodec_open2是FFmpeg库中的一个函数,用于打开音视频编解码器的上下文并进行初始化。这个函数是音视频编解码过程中的一个关键步骤,它使得编解码器准备好进行编解码操作。

int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);

参数说明:

  • AVCodecContext *avctx:音视频编解码器上下文,包含了一些编解码器的参数,如编码格式、帧率、分辨率等。
  • const AVCodec *codec:音视频编解码器,根据avctx->codec_id来确定。
  • AVDictionary **options:编解码器的配置参数,是一个字典(key-value键值对的集合),可以为空。

2、avcodec_open2 函数内部调用流程

2.1 基础检查

if (avcodec_is_open(avctx)) return 0;  // 已打开则跳过
if (!codec && !avctx->codec) return AVERROR(EINVAL);  // 无编解码器错误
if (codec && avctx->codec && codec != avctx->codec)
return AVERROR(EINVAL);  // 编解码器不匹配
// 确保上下文未初始化。
// 验证编解码器有效性(必须通过参数或上下文提供)。

2.2 编解码器设置

codec = avctx->codec ? avctx->codec : codec;
avctx->codec_type = codec->type;
avctx->codec_id = codec->id;
avctx->codec = codec;
// 绑定编解码器到上下文。
// 同步编解码器类型(音频/视频等)和ID。

2.3 参数校验

  • Extra Data 检查:avctx->extradata_size 需在 [0, FF_MAX_EXTRADATA_SIZE) 范围内。
  • 采样率/块对齐:负数检测(sample_rate < 0 或 block_align < 0 报错)。
  • 音频通道布局:
    • 非解码器时(如编码器)必须设置通道布局。
    • 通道布局有效性检查(av_channel_layout_check)。
    • 通道数上限(FF_SANE_NB_CHANNELS)。

2.4 分配内部资源

AVCodecInternal *avci = (
is_decoder) ? ff_decode_internal_alloc() :
ff_encode_internal_alloc();
avci->buffer_frame = av_frame_alloc();  // 缓存帧
avci->buffer_pkt = av_packet_alloc();   // 缓存包
// 根据编解码器类型(编码/解码)分配内部上下文 AVCodecInternal。
// 初始化帧/包缓存(用于中间数据处理)。

2.5 私有数据私有化

if (codec2->priv_data_size > 0) {
avctx->priv_data = av_mallocz(codec2->priv_data_size);  // 分配私有数据
*(const AVClass**)avctx->priv_data = codec->priv_class; // 绑定类
av_opt_set_defaults(avctx->priv_data);                 // 设默认选项
av_opt_set_dict(avctx->priv_data, options);            // 应用用户选项
}
// 为编解码器私有数据(如 H264Context)分配内存。
// 绑定类并初始化选项(通过 AVDictionary** options)。

2.6 流参数处理

if (!(特殊编解码器)) {
if (coded_width/height) ff_set_dimensions(avctx, coded_w, coded_h);
else if (width/height) ff_set_dimensions(avctx, width, height);
}
av_image_check_size2(...);  // 检查宽高有效性
av_image_check_sar(...);    // 检查宽高比有效性
// 设置宽高(跳过 H.264/VP6F/DXV 等特殊编解码器)。
// 校验尺寸和像素宽高比(SAR)的合理性。

2.7 实验行解码器检查

if ((codec->capabilities & AV_CODEC_CAP_EXPERIMENTAL) &&
avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
return AVERROR_EXPERIMENTAL;  // 实验性编解码器需明确启用
}
// 若编解码器标记为实验性,且用户未通过 -strict experimental 启用,则报错。

2.8 解码器|编码器与初始化

if (is_encoder) ret = ff_encode_preinit(avctx);
else ret = ff_decode_preinit(avctx);
// 调用编码器/解码器的预初始化逻辑(设置默认参数)。

2.9 错误处理

free_and_end:
ff_codec_close(avctx);  // 释放资源
end:
return ret;

3、avcodec_open2 函数调用流程图

在这里插入图片描述

http://www.jsqmd.com/news/313614/

相关文章:

  • HTML--img(图片标签)
  • 详细介绍:内网搭建邮件服务,打通 IDMP 通知途径
  • ‌基于 GitLab CI 的测试用例标签管理实践
  • 计算机毕设 java 基于协同算法的社区生鲜电商平台 基于 SpringBoot 的社区生鲜智能电商平台 Java 协同过滤生鲜购物与配送管理系统
  • 计算机毕设 java 基于协同过滤算法的新闻推荐系统 基于 SpringBoot 的智能新闻推荐平台 Java 协同过滤新闻推荐与交流系统
  • 全文 -- Chapter 5. “Smcsrind/Sscsrind“ Indirect CSR Access, Version 1.0 -- The RISC-V Inst Set Vol II
  • TestOps实战:如何让测试成为‘质量文化的载体’
  • 大数据领域数据分片:实现数据均衡的秘诀
  • ‌从手动脚本到声明式自治:Kubernetes Operator如何重塑测试环境管理
  • CI/CD中测试结果对比的价值与挑战
  • 从测试用例到自动化数据生成:JSON Schema的实战指南
  • 保姆级教程:用嘎嘎降AI把论文AI率从90%降到10%
  • LLM在AI Agent中的文本风格迁移应用
  • DeepSeek写的论文AI率太高?这5款工具一键搞定
  • 2026年养老巡检机器人关键技术解析与主流解决方案综述
  • 2026年8款降AI率工具实测推荐,亲测有效
  • DeepSeek写的论文AI率90%?实测这个方法降到15%以内
  • 知产代理必看:用AI工具批量生成软著材料,成本直降60%
  • SCI论文降AI率:5款学术级工具深度推荐
  • 2026软著申请攻略:30分钟搞定全套材料的AI工具实测
  • 毕业论文AI率太高被退回?这款工具实测降到10%
  • 知网AIGC检测不通过?这7款工具帮你稳过
  • SpringMVC运行流 从请求发起到底层执行
  • 全网热议!2026年二次元测量仪工厂TOP5推荐榜单,探寻最佳选择
  • 【零基础学MySQL】第二章:SQL类型 - 详解
  • 临床执医通关秘籍,我们选择哪一个医考机构?
  • 2026主管护师相关专业知识怎么备考?从基础到体系,一站式夯实备考功底
  • 微客云外卖霸王餐系统怎么样?有用过的吗
  • webpack - 常用的 CSS 加载器(webpack与其常见loader加载器使用方式)
  • 中医执助考试备考难?全网深度测评,帮你锁定最强机构!