本文先开始从 FFprobe 工程的 命令行解析 开始讲解,一步一步分析 命令行参数是如何解析到 FFprobe 工程变量里面的。
如果之前看过 FFmpeg 工程的源码分析,可以发现,FFprobe 的命令行参数解析跟 FFmpeg 工程是非常类似的。
本文以 ffprobe -show_streams -i a.mp4
命令来介绍。
a.mp4 下载链接:百度网盘 ,提取码:nl0s
命令行解析最重要的就是 OptionDef 这个结构,如下图代码:
如上图所示,主要有两种类型。
- 直接把命令行参数赋值到全局变量,例如 -unit 会直接赋值给 show_value_unit。
- 把命令行参数映射到自定义函数,就是前面带.func_arg 的,调用自定义函数来做一些操作。不过大部分都是设置 section 里面的 show_all_entries 变量,这个会影响到 do_show_xxx 全局变量的设置。
FFprobe 工程里面有一个重要的概念,就是Section,我翻译成区。他还定义了一个很大的 sections 数组。
与section 一同使用的还有level,section 跟 level 是用来做什么的呢?如下图所示,他可以实现这种嵌套的打印。
[stream]
[Tag]
[/Tag]
[/stream]
上面说到,命令行参数可以影响到 section::show_all_entries
变成 1。例如 -show_streams
会导致 sections[SECTION_ID_STREAMS]::show_all_entries 变成1。
section
里面有个 children_ids
参数,可以内嵌子 section
,所以 -show_streams 会导致 SECTION_ID_STREAM, SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, SECTION_ID_STREAM_SIDE_DATA_LIST 这些 section 的 show_all_entries
也变成1。
最后会调用 SET_DO_SHOW()
这个宏函数来根据 show_all_entries
设置 do_show_streams
全局变量 为 1。
所以,即使命令行参数映射到自定义函数,他最后也是设置全局变量,只是这些全局变量是以 do_show_xxx 格式出现的。
©版权所属:知识星球:弦外之音,QQ:2338195090。
由于笔者的水平有限, 加之编写的同时还要参与开发工作,文中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有任何宝贵意见,可以加我微信 Loken1。