FFprobe源码分析-1 - 弦外之音

/ 0评 / 0

本文先开始从 FFprobe 工程的 命令行解析 开始讲解,一步一步分析 命令行参数是如何解析到 FFprobe 工程变量里面的。

如果之前看过 FFmpeg 工程的源码分析,可以发现,FFprobe 的命令行参数解析跟 FFmpeg 工程是非常类似的。

本文以 ffprobe -show_streams -i a.mp4 命令来介绍。

a.mp4 下载链接:百度网盘 ,提取码:nl0s

命令行解析最重要的就是 OptionDef 这个结构,如下图代码:

如上图所示,主要有两种类型。


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。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注