ffmpeg_parse_options命令行解析
ffmpeg_parse_options()
是 ffmpeg.exe
解析命令行参数的主函数,它的流程图如下:
main()
在调 ffmpeg_parse_options()
之前还有一些初始化的准备工作,不过不是重点。
从上图可以看到,ffmpeg_parse_options()
内部有 4 个重要的函数调用,如下:
1,split_commandline()
,作用是把命令行的参数先解析到一个中间结构(OptionParseContext)里面,这个中间结构就是 octx
变量,
2,parse_optgroup(NULL, &octx.global_opts)
,把 octx
里面的 global_opts
字段解析到全局变量。
3,open_files(&octx.groups[GROUP_INFILE],...)
,octx.groups[GROUP_INFILE]
里面会有一个或者多个输入文件,需要用这些信息打开一个或者多个输入文件。
4,open_files(&octx.groups[GROUP_OUTFILE],...)
,octx.groups[GROUP_OUTFILE]
里面会有一个或者多个输出文件,需要用这些信息打开一个或者多个输出文件。
命令行参数解析模块,主要用到 3 个数据结构,如下:
1,struct OptionParseContext
,存储命令行参数的中间状态。定义如下:
typedef struct OptionParseContext {OptionGroup global_opts;OptionGroupList *groups;int nb_groups;/* parsing state */OptionGroup cur_group;
} OptionParseContext;
ffmpeg.exe
在使用 OptionParseContext
结构的时候,只定义了两个组,输入组跟输出组,如下:
static const OptionGroupDef groups[] = {[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
};
//初始化 octx
init_parse_context(octx, groups, nb_groups);
ffmpeg.exe
初始化 octx
变量是在 init_parse_context()
函数里面的,这个比较简单,不过多介绍。
输入组 里面是可以有多个输入文件的,输出组也可以有多个输出文件。
2,struct OptionGroup
,存储单个输入或者输出文件的信息。
typedef struct OptionGroup {const OptionGroupDef *group_def;const char *arg; //这个字段是输入或者输出的文件名Option *opts; // ffmpeg_opt.c 里面定义的选项int nb_opts;AVDictionary *codec_opts; //编码器选项AVDictionary *format_opts; //容器选项AVDictionary *resample_opts; //重采样选项 应该是快废弃的AVDictionary *sws_dict; //图像转换选项AVDictionary *swr_opts; //重采样选项
} OptionGroup;
OptionGroup
是一个非常重要的数据结构,存储单个输入或者输出文件的命令行参数信息,之前在《ffmpeg命令参数类型》讲过,每个输出文件都可以有自己的独立参数,不同的输出文件的参数是分开的。不同的输出文件可以指定不同的编码器等等。
codec_opts
,format_opts
,sws_dict
,swr_opts
这些字段存储的是组件库的参数。
Option *opts
字段存储的才是 ffmpeg.exe
工具自身的参数。
OptionGroup
里面的 arg
是文件名,然后 opts
存储的是 ffmpeg_opt.c
里面的 options[]
变量中的某些选项,如下:
typedef struct Option {const OptionDef *opt; //ffmpeg_opt.c 里面的选项const char *key; //命令行参数的 keyconst char *val; //命令行参数的 value
} Option;
如果你命令行使用了 -f 888
,那 Option
的内容就是下面这样的:
const OptionDef *opt = options[1] // f 选项的下标是 1
const char *key = f
const char *val = 888
OptionDef
结构在分析 ffplay
的时候讲过了,推荐阅读《FFplay是如何解析命令行参数的》。
ffplay.exe
跟 ffmpeg.exe
都是用的 OptionDef
结构来定义自身支持的参数。
3,struct OptionGroupList
,OptionGroup
的列表。
typedef struct OptionGroupList {const OptionGroupDef *group_def;OptionGroup *groups;int nb_groups;
} OptionGroupList;
static const OptionGroupDef groups[] = {[GROUP_OUTFILE] = { "output url", NULL, OPT_OUTPUT },[GROUP_INFILE] = { "input url", "i", OPT_INPUT },
};
通常 OptionGroup
裸露在外面直接用,例如 OptionParseContext::global_opts
,那就是全局组,如果 OptionGroup
包在 OptionGroupList
使用的,OptionGroup
的属性就由 OptionGroupDef
确定,确定他是输入组还是输出组。
上面这些数据结构的关系如下图所示:
不过 OptionGroup
跟 OptionGroupList
的结构设计得有点奇怪,他们里面都有一个 OptionGroupDef
。
全局组的定义如下:
static const OptionGroupDef global_group = { "global" };
相关的数据结构已经了解了,后面的文章会继续分析 ffmpeg_parse_options()
里面各个子函数的内部逻辑。
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:
Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习
ffmpeg_parse_options命令行解析相关推荐
- ffmpeg.c学习-1-框架分析及命令行解析
ffmpeg.c学习-1-框架分析及命令行解析 目录 掌握ffmpeg.c的意义 ffmpeg框架分析 ffmpeg对应的⽂件 ffmpeg程序框架流程 命令行解析 1. 掌握ffmpeg.c的意义 ...
- linux c 命令行解析 getopt getopt_long optarg optind opterr optopt 简介
目录 getopt 函数 测试代码 getopt_long函数 代码示例 getopt 函数 头文件 #include<unistd.h> 定义函数 int getopt(int argc ...
- python解析库_Python命令行解析库argparse
原博文 2014-08-13 05:48 − 2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse模块对命令行进行解析. 1.example 有一道面试 ...
- docker命令行解析以及如何向服务器端发送请求(docker源码学习一)
最近在看doccker的源码,最新的master分支(估计是1.12.4,因为最新的release是1.12.3)命令行解析全部都使用了第3方的包https://github.com/spf13/co ...
- python:argparse命令行解析模块详解
argparse命令行解析模块学习 import argparse parser = argparse.ArgumentParser() #类似于初始化吧 parser.parse_args() #解 ...
- .NET:命令行解析器介绍
背景 经常需要开发一下小工具,之前都是自己解析命令行参数,接触过动态语言社区以后,发现命令行解析有特定的模式和框架可以利用,本文介绍一个 .NET 平台的类库. 示例 需求 拷贝文件,如:CopyFi ...
- python之命令行解析工具argparse
以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效 ...
- Python命令行解析:sys.argv[]函数的简介、案例应用之详细攻略
Python命令行解析:sys.argv[]函数的简介.案例应用之详细攻略 目录 sys.argv[]函数的简介 sys.argv[]函数的案例应用 1.基础测试 2.进阶用法 3.sys.argv[ ...
- TF之TF flags:TF flags(命令行解析)的简介、安装、使用方法之详细攻略
TF之TF flags:TF flags(命令行解析)的简介.安装.使用方法之详细攻略 目录 TF flags的简介 TF flags的安装 TF flags的使用方法 TF flags的简介 1.f ...
最新文章
- finereport 登录界面的代码文件_Confluence 6 自定义登录界面
- java发布sevlet_发布一个java Servlet (静态发布)
- 在iOS平台上使用TensorFlow教程(上)
- OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例(附完整代码)
- H3C——路由策略和策略路由实例配置
- maven 打包报错 surefire-reports for the individual test results.
- 通信线路工程验收规范 gb51171-2016_老杨一建通信学堂通信线路工程施工技术
- 7-110 吃火锅 (15 分)
- OpenShift 4 - 安全上下文 SecurityContext
- Cisco IOS Site-to-Site Pre-share Key ×××
- 互联网产品总监的经验总结:从0-1为你讲明白BI与数据可视化
- 计算机算法设计与分析 旅行售货员问题
- 283、移动零(python)
- ORBSLAM2 文章翻译
- twaver html5 2d demo,TWaver 2D+GIS+3D的试用和在线Demo
- 如何查看Safari浏览器network里Request的Payload
- 唐朝疆域地图[中亚势力范围(公元660年
- POS打印机设置字体大小
- 【转帖】M1、M2增速
- 自动关机win10_如何设置电脑自动关机