FFmpeg源码学习---ffmpeg

1、ffmpeg源码主函数

┌────────────────────┐

│ main() │

└─────────┬───────────┘

┌────────────────────┐

│ 初始化 (日志/网络等) │

│ init_dynload() │

│ avformat_network_init() │

└─────────┬───────────┘

┌────────────────────────┐

│ 解析命令行参数 options │

│ ffmpeg_parse_options() │

└─────────┬──────────────┘

┌────────────────────────┐

│ 检查输入输出文件 │

└─────────┬──────────────┘

┌────────────────────────┐

│ 记录基准测试起点 │

│ get_benchmark_time_stamps() │

└─────────┬──────────────┘

┌────────────────────────┐

│ 核心转码处理 │

│ transcode() │

└─────────┬──────────────┘

┌────────────────────────┐

│ 记录基准测试终点 │

│ 并打印用时信息 │

└─────────┬──────────────┘

┌────────────────────────┐

│ 清理资源释放内存 │

│ ffmpeg_cleanup(), sch_free() │

└─────────┬──────────────┘

┌────────────────────┐

│ return 退出程序 │

└────────────────────┘

1.1初始化网络设备及日志

1.2解析命令行参数

步骤 作用 解释
GlobalOptionsContext go = { .sch = sch }; 初始化全局选项 go 是一个保存全局选项的结构体,把 Scheduler *sch 传进去,后面需要用。
OptionParseContext octx; 初始化参数解析上下文 octx 负责临时保存解析中间状态,比如分组后的参数。
memset(&octx, 0, sizeof(octx)); 清零初始化 确保 octx 是干净的。
split_commandline() 切分命令行参数成内部结构 argc/argv 这些参数,按输入、输出、滤镜、解码器分类,放到 octx 里。如果失败就跳 goto fail
parse_optgroup() 解析全局参数 把命令行里的一些全局设置(比如 -y, -loglevel, -filter_complex)应用到程序状态里。
term_init() 初始化终端 配置终端行为,比如是否处理 Ctrl+C 这种信号。
for (i = 0; i < go.nb_filtergraphs; i++) 创建复杂滤镜链 如果命令行有 -filter_complex,需要提前建好滤镜图(filtergraph)。
open_files(...GROUP_INFILE...) 打开所有输入文件 找到所有输入文件,比如 -i input.mp4,调用 ifile_open() 打开。
open_files(...GROUP_OUTFILE...) 打开所有输出文件 找到所有输出文件,比如 output.avi,调用 of_open() 打开。
open_files(...GROUP_DECODER...) 创建 loopback 解码器 少见功能,一般是给特殊 case 用的(比如自定义解码器)。
fg_finalise_bindings() 绑定滤镜链输入输出 让滤镜链知道自己接收哪个流,输出到哪里。
correct_input_start_times() 校正输入流时间戳 修正各种输入流的起始时间,比如音频、视频同步问题。
apply_sync_offsets() 应用同步偏移 如果设置了 -itsoffset 这类参数,需要调整同步。

1.3转码

  1. 初始化
    • 打印流映射信息。
    • 设置转码初始化完成的标志。
  2. 启动调度器
    • 调用 sch_start(sch) 启动调度器,开始转码任务。
    • 如果启动失败,直接返回错误码。
  3. 用户交互
    • 如果启用了标准输入交互(stdin_interaction),提示用户可以通过键盘输入控制转码过程(例如按 q 停止转码)。
  4. 转码主循环
    • 进入主循环,等待调度器完成转码任务。
    • 在循环中,检查用户输入(例如按 q 停止转码)。
    • 定期打印转码状态报告。
  5. 停止调度器
    • 调用 sch_stop(sch, &transcode_ts) 停止调度器。
    • 写入输出文件的尾部信息(trailer)。
  6. 清理资源
    • 调用 term_exit() 进行资源清理。
    • 打印最终的转码状态报告。
  7. 返回结果
    • 返回转码过程的最终状态码。
相关推荐
ha204289419423 分钟前
Linux操作系统学习记录之----自定义协议(网络计算器)
linux·网络·学习
振华说技能30 分钟前
SolidWorks学习大纲-从基础到全面精通,请看详情
学习
曦月逸霜30 分钟前
离散数学-学习笔记(持续更新中~)
笔记·学习·离散数学
im_AMBER42 分钟前
Leetcode 101 对链表进行插入排序
数据结构·笔记·学习·算法·leetcode·排序算法
Mr -老鬼1 小时前
Rust与Go:从学习到实战的全方位对比
学习·golang·rust
laplace01231 小时前
# 第四章|智能体经典范式构建 —— 学习笔记(详细版)
笔记·学习
程序猿零零漆1 小时前
Spring之旅 - 记录学习 Spring 框架的过程和经验(十四)SpringMVC的请求处理
学习·spring·pandas
别了,李亚普诺夫1 小时前
PCB设计大师篇笔记
笔记·嵌入式硬件·学习
西瓜堆1 小时前
提示词工程学习笔记: IT技术行业提示词推荐
笔记·学习
IT=>小脑虎1 小时前
PHP零基础衔接进阶知识点【详解版】
开发语言·学习·php