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_optsformat_optssws_dictswr_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 OptionGroupListOptionGroup 的列表。

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命令行解析相关推荐

  1. ffmpeg.c学习-1-框架分析及命令行解析

    ffmpeg.c学习-1-框架分析及命令行解析 目录 掌握ffmpeg.c的意义 ffmpeg框架分析 ffmpeg对应的⽂件 ffmpeg程序框架流程 命令行解析 1. 掌握ffmpeg.c的意义 ...

  2. linux c 命令行解析 getopt getopt_long optarg optind opterr optopt 简介

    目录 getopt 函数 测试代码 getopt_long函数 代码示例 getopt 函数 头文件 #include<unistd.h> 定义函数 int getopt(int argc ...

  3. python解析库_Python命令行解析库argparse

    原博文 2014-08-13 05:48 − 2.7之后python不再对optparse模块进行扩展,python标准库推荐使用argparse模块对命令行进行解析. 1.example 有一道面试 ...

  4. docker命令行解析以及如何向服务器端发送请求(docker源码学习一)

    最近在看doccker的源码,最新的master分支(估计是1.12.4,因为最新的release是1.12.3)命令行解析全部都使用了第3方的包https://github.com/spf13/co ...

  5. python:argparse命令行解析模块详解

    argparse命令行解析模块学习 import argparse parser = argparse.ArgumentParser() #类似于初始化吧 parser.parse_args() #解 ...

  6. .NET:命令行解析器介绍

    背景 经常需要开发一下小工具,之前都是自己解析命令行参数,接触过动态语言社区以后,发现命令行解析有特定的模式和框架可以利用,本文介绍一个 .NET 平台的类库. 示例 需求 拷贝文件,如:CopyFi ...

  7. python之命令行解析工具argparse

    以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效 ...

  8. Python命令行解析:sys.argv[]函数的简介、案例应用之详细攻略

    Python命令行解析:sys.argv[]函数的简介.案例应用之详细攻略 目录 sys.argv[]函数的简介 sys.argv[]函数的案例应用 1.基础测试 2.进阶用法 3.sys.argv[ ...

  9. TF之TF flags:TF flags(命令行解析)的简介、安装、使用方法之详细攻略

    TF之TF flags:TF flags(命令行解析)的简介.安装.使用方法之详细攻略 目录 TF flags的简介 TF flags的安装 TF flags的使用方法 TF flags的简介 1.f ...

最新文章

  1. finereport 登录界面的代码文件_Confluence 6 自定义登录界面
  2. java发布sevlet_发布一个java Servlet (静态发布)
  3. 在iOS平台上使用TensorFlow教程(上)
  4. OpenCV添加图像轨迹轨迹条 Adding Images Trackbar的实例(附完整代码)
  5. H3C——路由策略和策略路由实例配置
  6. maven 打包报错 surefire-reports for the individual test results.
  7. 通信线路工程验收规范 gb51171-2016_老杨一建通信学堂通信线路工程施工技术
  8. 7-110 吃火锅 (15 分)
  9. OpenShift 4 - 安全上下文 SecurityContext
  10. Cisco IOS Site-to-Site Pre-share Key ×××
  11. 互联网产品总监的经验总结:从0-1为你讲明白BI与数据可视化
  12. 计算机算法设计与分析 旅行售货员问题
  13. 283、移动零(python)
  14. ORBSLAM2 文章翻译
  15. twaver html5 2d demo,TWaver 2D+GIS+3D的试用和在线Demo
  16. 如何查看Safari浏览器network里Request的Payload
  17. 唐朝疆域地图[中亚势力范围(公元660年
  18. POS打印机设置字体大小
  19. 【转帖】M1、M2增速
  20. 自动关机win10_如何设置电脑自动关机

热门文章

  1. (续)Visual Studio 连接SQL Server数据库,代码连接
  2. 计蒜客:求迷宫解法方案数---dfs
  3. 微型计算机数据传输接口40,微型計算机系统.ppt
  4. 你应该知道 装备克制!学会通过出装针对对面!
  5. 听君一席话,如听一席话
  6. Geant4程序 T1program
  7. 教你一步步如何用Gradle来搭建Vert.x 4 应用
  8. 服务器重启docker命令
  9. openocd目录_openOCD的使用
  10. cadence SPB17.4 - 用元件管理器来更新原理图中的元件属性信息