FFmpeg与FFplay解析命令行的区别—ffmpeg.c源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
在前面的一章《FFplay播放器分析》,讲过 ffplay.exe 命令行参数的处理。
其实 ffmpeg.exe 跟 ffplay.exe 处理命令行参数是有相似的逻辑的。
ffmpeg.exe 跟 ffplay.exe 都用了 parse_option() 来解析命令行参数,但是两者调用的用法有点奇怪。
回顾一下前文《FFplay是如何解析命令行参数的》, ffplay.exe 处理命令行参数的流程,如下:

可以看到,是从 parse_option() 里面调的 write_option(),而且在 ffplay.exe 里面 write_option() 的第一个参数 optctx,永远传的是 NULL。
下面是 ffplay -x 400 -i juren.mp4 命令的调试截图:

上图中的 func_arg 函数 就是 opt_width()。
我们再来调试一下 ffmpeg ,命令如下:
ffmpeg -i juren.mp4 -vcodec h263 juren.flv

上图是解析 -vcodec h263 选项的调试截图,上面的 func_arg 是 opt_video_codec() 函数。
可以看到,是从 write_option() 里面调的 parse_option(),然后 parse_option() 再调一次 write_option(),流程图如下:

这个逻辑非常绕,我看了好几遍,用上调试器看函数调用才搞明白。
而且注意,optctx 不是 NULL,所以 value 会被保存进去 optctx 结构体的某个字段里面。
上面这些就是 ffplay.exe 与 ffmpeg.exe 调用 parse_option() 的区别。
广告:本人罗上文现在是声网的渠道合作商,各位如果有需要使用声网的产品,请通过我的渠道邀请链接注册,我会给与一定的优惠折扣。欢迎加我微信Loken1咨询。
