美文网首页
音视频流媒体开发【三十九】FFmpeg媒体转换器3-命令行解析

音视频流媒体开发【三十九】FFmpeg媒体转换器3-命令行解析

作者: AlanGe | 来源:发表于2023-04-08 08:49 被阅读0次

    音视频流媒体开发-目录
    iOS知识点-目录
    Android-目录
    Flutter-目录
    数据结构与算法-目录
    uni-pp-目录

    对应代码 ffmpeg-pro-03
    对应代码 ffmpeg-pro-04

    03-命令行解析

    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 500kb 3.mp4 -y -loglevel 56
    

    当我们使⽤命令⾏来调⽤ FFmpeg 时,当命令⾏传⼊ FFmpeg 时,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;
    
    • 专属参数会先存储到 AVDictionary
    AVDictionary *codec_opts;
    AVDictionary *format_opts;
    AVDictionary *resample_opts;
    AVDictionary *sws_dict;
    AVDictionary *swr_opts;
    

    相关文章

      网友评论

          本文标题:音视频流媒体开发【三十九】FFmpeg媒体转换器3-命令行解析

          本文链接:https://www.haomeiwen.com/subject/dfgpddtx.html