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

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. 返回结果
    • 返回转码过程的最终状态码。
http://www.xdnf.cn/news/195193.html

相关文章:

  • 《Operating System Concepts》阅读笔记:p821-p897
  • awk之使用详解(Detailed Explanation of Using AWK)
  • python10天- 文件操作模式详解
  • C++高性能日志库spdlog
  • 深入浅出限流算法(二):更平滑的滑动窗口
  • Python 如何操作数据库,让你使用 DeepSeek 开发数据库应用更加快 (Orm Bee)
  • MySQL复合查询
  • HTML 从标签到动态效果的基础
  • react-navigation-draw抽屉导航
  • ArkTS基础实验 (二)
  • 数字人Live_Talking的搭建和使用
  • OpenResty深度解析:从卓伊凡的”隐形主流”论看其深度原理与应用生态-卓伊凡
  • 深入理解java线程池
  • stm32 阻塞式延时 与 非阻塞式延时
  • “数字驱动·智建未来——2025河北省建筑电气与智能化技术交流大会”
  • 【ACL系列论文写作指北14-科研心态与抗压管理】-走得远,比走得快更重要
  • 不同参数大小的DeepSeekR1模型对Java中new FileInputStream(“test.txt“).seek(100);语法错误的检查
  • 学习笔记:Qlib 量化投资平台框架 — MAIN COMPONENTS (Part I)
  • XrayR启动失败
  • 架构进阶:详解108页系统架构设计与详细设计知识讲座【附全文阅读】
  • 品融电商:全域电商代运营的领航者,驱动品牌长效增长
  • 第四章:Messaging and Memory
  • C语言中的指针详解
  • RSS‘25|CMU提出统一空中操作框架:以末端执行器为中心,无人机实现高精度遥操作
  • Cursor + Figma-Context-MCP ,让 Cursor 获取 Figma 设计图信息,实现 AI 生成页面的高度还原
  • 力扣面试150题--K 个一组翻转链表
  • 机器人--激光雷达
  • ESG跨境电商怎么样?esg跨境电商有哪些功用?
  • 阅读MySQL实战45讲第11天
  • uniapp打包apk如何实现版本更新