ffmpeg命令行功能强大,本文简单介绍一下命令行解析过程。 命令行解析函数如下 我们以下面命令行为例ffmpegyss4i1。tsvframes1fimage2s640x360out。jpg 在ffmpegopt。c文件中通过两个函数splitcommandline、parseoptgroup解析命令行参数并保存在OptionParseContext结构体中。typedefstructOptionParseContext{OptionGroupglobalopts;OptionGroupListgroups;intnbgroups;parsingstateOptionGroupcurgroup;}OptionParseContext; OptionParseContext中globalopts保存全局参数,比如y参数。 nbgroups表示有多少个OptionGroupList选项组列表,数据保存在groups数组中。 按输入参数还是输出参数进行分组,groups〔0〕保存输出参数选项组列表, groups〔1〕保存输入参数选项组列表。 typedefstructOptionGroupList{constOptionGroupDefgroupdef;OptionGroupgroups;intnbgroups;}OptionGroupList; 选项组列表保存一系列选项组,选项组个数保存在nbgroups字段,groups是选项组数组首地址。 从上面调试截图可以看出针对举例的命令行,输出和输入选项组都只有一个。typedefstructOptionGroup{constOptionGroupDefgroupdef;constchararg;Optionopts;intnbopts;AVDictionarycodecopts;AVDictionaryformatopts;AVDictionaryswsdict;AVDictionaryswropts;}OptionGroup; 选项组包含若干选项,每一个选项都是保存在Option结构体中。 输出选项组包含3个选项, 从keyvalue值可以看出和我们在命令行里设置的输出参数一样,vframes1fimage2s640x360。 输出选项组包含1个选项, 从keyvalue值可以看出和我们在命令行里设置的输入参数一样,ss4。typedefstructOption{constOptionDefopt;constcharkey;constcharval;}Option;typedefstructOptionDef{constcharname;intflags;defineHASARG0x0001defineOPTBOOL0x0002defineOPTEXPERT0x0004defineOPTSTRING0x0008defineOPTVIDEO0x0010defineOPTAUDIO0x0020defineOPTINT0x0080defineOPTFLOAT0x0100defineOPTSUBTITLE0x0200defineOPTINT640x0400defineOPTEXIT0x0800defineOPTDATA0x1000defineOPTPERFILE0x2000theoptionisperfile(currentlyffmpegonly)。impliedbyOPTOFFSETorOPTSPECdefineOPTOFFSET0x4000optionisspecifiedasanoffsetinapassedoptctxdefineOPTSPEC0x8000optionistobestoredinanarrayofSpecifierOpt。ImpliesOPTOFFSET。Nextelementaftertheoffsetisanintcontainingelementcountinthearray。defineOPTTIME0x10000defineOPTDOUBLE0x20000defineOPTINPUT0x40000defineOPTOUTPUT0x80000union{voiddstptr;int(funcarg)(void,constchar,constchar);sizetoff;}u;constcharhelp;constcharargname;}OptionDef; 选项主要数据保存在OptionDef结构体中。name是选项名,flags是选项标志(比如选项值类型、是否包含参数、输入参数还是输出参数、视频参数还是音频参数还是字幕参数等),联合体u中可以包含三种数据之一, dstptr 全局控制变量的地址 funcarg 选项对应的处理函数 off OptionsContext结构体中对应的字段