ffmpeg 参数_超详细ffmpeg.c命令行分析

cfaf1715bf95969493659966c3bcce81.png
342f1b35d943aa3c20918c1753ce95ac.png

1.命令行解析

FFmpeg 命令⾏基础语法:

ffmpeg [global_options] {[input_file_options] -i input_file}...{[output_file_options] output_file}...

global_options:全局参数。

input_file_options:输⼊⽂件相关参数。

output_file_options:输出⽂件相关参数。

如下为⼀个简单的 FFmpeg 命令,将 input.avi 视频⽂件转换为 640kbps 码率的 output.avi。

ffmpeg -i 3.flv -acodec copy -vcodec libx264 -g 30 -b 640kb 3.mp4 -y -loglevel 56

这里的-acodec copy和-g 30就表示一组key-value值。

FFmpeg内部是如何识别这些命令并进⾏解析和赋值的呢?

总结起来,解析命令⾏的⼤致流程就是:

(1)跳过 “--xx xxx” 参数。

(2)“-xx xxx” 格式的默认参数存⼊全局参数数组或临时参数数组。

(3)“-noxx xxx”格式的参数,即默认值为“0”,将值存⼊全局参数数组或临时参数数组。

(4)解析专属参数,并存⼊专属数组结构体(AVDictionary)。

(5)“-i xxx” 格式的输⼊⽂件路径参数,将临时参数数组的值、输⼊⽂件路径以及专属参数存⼊输⼊相关参数结构体,并清空临时参数数组。

(6)“xxx” 格式的输出⽂件路径参数,将临时参数数组的值、输出⽂件路径以及专属参数存⼊输出相关参数结构体,并清空临时参数数组。

参数解析后存放在哪?

有关全局参数输⼊参数输出参数存储到 OptionParseContext *octx 中。

typedef struct OptionParseContext {   // 全局命令分组   OptionGroup global_opts;    // 输⼊和输出的命令分组 (groups[0] 存储与输出⽂件相关参数,groups[1] 存储与 输⼊⽂件相关参数)   OptionGroupList *groups; int nb_groups;  /* 临时数组,存储输出、输⼊相关参数 */    OptionGroup cur_group;  } OptionParseContext;

输入和输出分别对应这个枚举值。

9bcb4891eb3550446b8c72806da35ec2.png

专属参数会先存储到 AVDictionary

AVDictionary *codec_opts; AVDictionary *format_opts; AVDictionary *resample_opts; AVDictionary *sws_dict; AVDictionary *swr_opts;

现在来剖析下,这个find_option是干什么?它主要是解析命令参数。

e26c7b243e0f51bd754b554600cfec17.png

option是[]这里有个共用体,就是把解析后的数据保存到全局变量。使用一个回调函数进行解析。计算偏移位置,一般是指在optionsContext位置。

12a88bd1893ed7a971580b84918fbb43.png

key-value对应的值:

dd7bd2569a0c1d1b4616625880c381b0.png

这些命令对应的函数列表。执行不同的命令,可以执行不同的函数。

e908dee55ef639b7a5a685eb1d667941.png

每个输入、输出文件都对应一个OptionGroup,并且正真将命令解析到对应输入输出文件时,对应的是OptionParserContext结构体。

7bc731ae2ca8df6de7e4740d87c85010.png

向列表里添加相关字符串。通过grow_array方法。

dd5aef9b909af3ad91bc90a99c79e124.png

关于命令解析的文章,本次就分享到这里,欢迎关注、点赞、转发、分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值