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

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


目录

  1. 掌握ffmpeg.c的意义
  2. ffmpeg框架分析
    1. ffmpeg对应的⽂件
    2. ffmpeg程序框架流程
  3. 命令行解析

1. 掌握ffmpeg.c的意义

  1. ffmpeg.c本质是是基于FFmpeg库开发的多媒体⽂件转换器(multimedia converter)。
  2. ffmpeg.c的作⽤
    1. 转码:⽐如转成MP3/AAC/H264/H265等等;
    2. 压缩:⽐如将PCM进⾏⾳频编码,YUV进⾏视频编码;
    3. 提取:⽐如提前⾳频⽂件为AAC,提前视频⽂件为H264;
    4. 截取:⽐如从第5秒开始截取10秒的视频;
    5. 拼接:⽐如将多个⽂件拼接⻓⼀个⽂件;
    6. 合并:⽐如实现九宫格输出;
    7. 录屏:ffmpeg可以⽤来录屏,但效率不⾼。
  3. 市⾯是的格式⼯⼚⼯具,⼤部分都是基于ffmpeg.c⼆次开发,⽐如:
    1. 迅捷视频转换器
    2. 爱剪辑等等
  4. 掌握ffmpeg.c对于我们深⼊掌握FFmpeg⾮常有必要。

2. ffmpeg框架分析

1. ffmpeg对应的⽂件
  1. ffmpeg程序涉及的主要⽂件:
    1. cmdutils.c:解析命令相关的⼯具函数,不⽤太关注先;
    2. ffmpeg_opt.c:负责解析命令⾏输⼊的参数,以-vcodec copy的处理为例,对应了opt_video_codec函数(key-value的结构,-接下来的字符是代表key的开始,key后⾯紧跟着value)
  2. 我们重点关注的是解析出来的信息存储在 OptionsContext, ⽐如opt_video_codec函数
    在这里插入图片描述
  3. 然后在处理的时候 open_output_file -> choose_encoder -> new_video_stream ->new_output_stream -> choose_encoder的时候可以获取到对应的编码器到底应该使⽤什么。
    4.
  4. ffmpeg.c:多媒体⽂件转换器的主体
  5. ffmpeg_cuvid.c:CUDA硬件相关的加速;
  6. ffmpeg_filter.c:filter相关;
  7. ffmpeg_hw.c:硬件加速相关
2. ffmpeg程序框架流程
  1. 先忽略含有filter的情况。
  2. 解析命令⾏
    1. ffmpeg_parse_options 解析命令⾏的函数
    2. 对应的命令 const OptionDef options,例如
        { "vcodec",       OPT_VIDEO | HAS_ARG  | OPT_PERFILE | OPT_INPUT | OPT_OUTPUT,  
		{ .func_arg = opt_video_codec }, "force video codec ('copy' to copy stream)", "codec" },
		 /* data codec support */
        { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT,
        { .func_arg = opt_data_codec }, "force data codec ('copy' to copy stream)", "codec" },
  1. 打开输⼊⽂件 open_input_file
    1. avformat_open_input
    2. 分析码流 avformat_find_stream_info
    3. 查找对应的编码器
  2. 打开输出⽂件 open_output_file
    1. avformat_alloc_output_context2 先建⼀个输出⽂件
    2. avformat_new_stream 新建⼀个steam
  3. 读取输⼊⽂件
    1. av_read_frame 读取输⼊⽂件
  4. 解码编码
    1. 解码:avcodec_send_packet和avcodec_receive_frame
    2. 编码:avcodec_send_frame和avcodec_receive_packet
  5. 写⼊输出⽂件
    1. avformat_write_header写⼊头部
    2. av_interleaved_write_frame 交替写⼊packet
    3. av_write_trailer 写⼊尾部

3. 命令行解析

1. FFmpeg 命令⾏基础语法:
ffmpeg [global_options] {[input_file_options] -i input_file}...{[output_file_options] output_file}...
  1. global_options:全局参数
  2. input_file_options:输⼊⽂件相关参数
  3. output_file_options:输出⽂件相关参数
  4. 如下为⼀个简单的 FFmpeg 命令,将 input.avi 视频⽂件转换为 640kbps 码率的 output.avi
ffmpeg -i 3.flv -acodec copy -vcodec libx264 -g 30 -b 500kb 3.mp4 -y -loglevel 56
  1. 当我们使⽤命令⾏来调⽤ FFmpeg 时,当命令⾏传⼊ FFmpeg 时,FFmpeg内部是如何识别这些命令并进⾏解析和赋值的呢?
  2. 总结起来,解析命令⾏的⼤致流程就是:
    1. 跳过 “–xx xxx” 参数
    2. “-xx xxx” 格式的默认参数存⼊全局参数数组或临时参数数组
    3. “-noxx xxx”格式的参数,即默认值为“0”,将值存⼊全局参数数组或临时参数数组
    4. 解析专属参数,并存⼊专属数组结构体(AVDictionary)
    5. “-i xxx” 格式的输⼊⽂件路径参数,将临时参数数组的值、输⼊⽂件路径以及专属参数存⼊输⼊相关参数结构体,并清空临时参数数组
    6. “xxx” 格式的输出⽂件路径参数,将临时参数数组的值、输出⽂件路径以及专属参数存⼊输出相关参数结构体,并清空临时参数数组
  3. 有关全局参数、输⼊参数、输出参数都存储到 OptionParseContext *octx 中
typedef struct OptionParseContext {
    // 全局命令分组
    OptionGroup global_opts;
    // 输入和输出的命令分组 (groups[0] 存储与输出文件相关参数,groups[1] 存储与输入文件相关参数)
    OptionGroupList *groups;
    int nb_groups;

    /* 临时数组,存储输出、输入相关参数 parsing state */
    OptionGroup cur_group;
} OptionParseContext;
  1. 专属参数会先存储到 AVDictionary
AVDictionary *codec_opts;
AVDictionary *format_opts;
AVDictionary *resample_opts;
AVDictionary *sws_dict;
AVDictionary *swr_opts;
  1. 具体 split_commandline()函数⻅源码
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值