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. 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()函数⻅源码

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

  1. NASM学习(二)——从命令行获取参数

    NASM学习(二)--从命令行获取参数 学习汇编的目的是增强自己对硬件体系的熟悉与编译.链接等等阶段的熟悉 上文我们已经学会了怎么使用NASM来打印HELLO,WORLD了,总结一下,主要是使用系统调 ...

  2. docker命令行解析以及如何向服务器端发送请求(docker源码学习一)

    最近在看doccker的源码,最新的master分支(估计是1.12.4,因为最新的release是1.12.3)命令行解析全部都使用了第3方的包https://github.com/spf13/co ...

  3. python 命令行解析模块_Python命令行解析模块详解

    python2.7 怎么解析命令行输入的中文参数 本文实例讲述了python读取命令行参数的方法.分享给大家供大家参考.具体分析如下: 如果想对python脚本传参数,python中对应的argc, ...

  4. linux c 命令行解析 getopt getopt_long optarg optind opterr optopt 简介

    目录 getopt 函数 测试代码 getopt_long函数 代码示例 getopt 函数 头文件 #include<unistd.h> 定义函数 int getopt(int argc ...

  5. python:argparse命令行解析模块详解

    argparse命令行解析模块学习 import argparse parser = argparse.ArgumentParser() #类似于初始化吧 parser.parse_args() #解 ...

  6. .NET:命令行解析器介绍

    背景 经常需要开发一下小工具,之前都是自己解析命令行参数,接触过动态语言社区以后,发现命令行解析有特定的模式和框架可以利用,本文介绍一个 .NET 平台的类库. 示例 需求 拷贝文件,如:CopyFi ...

  7. Py之argparse:Python库之argparse(命令行解析)简介、安装、使用方法之详细攻略

    Py之argparse:Python库之argparse(命令行解析)简介.安装.使用方法之详细攻略 导读 python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用a ...

  8. python getopt argparse_python OptParse模块和argparse命令行解析的用法详解

    https://www.cnblogs.com/wj-1314/p/8974021.html OptParse模块的简单介绍 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只 ...

  9. Go语言 命令行解析(二)

    今天我们继续讲解Go语言中命令行,当我们在解析命令行传递的参数时通常会想用最简单的方法来解析自己行用到的命令行参数,那么urfave/cli可以帮助我们快速的解析命令行参数,它是一个简单快速的命令行包 ...

最新文章

  1. php对应 c int16,PHP中十进制 和十六进制的转换问题
  2. Android开发环境搭建与起步--太详细了,一步一步图文教你
  3. 使用Movie Maker制作视频相册
  4. 【CyberSecurityLearning 24】kali中间人攻击
  5. Git复习(十一)之常见命令用法
  6. vue-cli 项目配置路径别名
  7. Consumer接口练习之按要求打印信息
  8. 送一点GMail的邀请
  9. css三种引入方式以及其优先级的说法
  10. efuse 加密文件 linux,乐鑫关于“故障注入”和 “eFuse 保护”的安全建议 (CVE-2019-17391)...
  11. codevs3143 二叉树的序遍历
  12. python编程首选_Java程序员值得探索的五种新编程语言,Python是首选?
  13. Markdown:继续编号列表
  14. Redis集群功能配置以及Redis Sentinel配置
  15. jQuery点击文本框复制其内容到剪贴板上
  16. 拓端tecdat|R语言用局部加权回归(Lowess)对logistic逻辑回归诊断和残差分析
  17. Activiti学习(二)之工作流的入门与流程实列
  18. python 字符编码识别及转换
  19. python爬LOL英雄皮肤
  20. 想学明白PostgreSQL,得先捋一捋体系架构

热门文章

  1. 【算法】K-Means聚类算法(k-平均或k-均值)
  2. Linux运维工程师面试题第三套
  3. 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
  4. .Net 事件类型的实现和推荐做法
  5. AOJ - 邻家割草(最小割)
  6. CH - 6802 車的放置(二分图最大匹配)
  7. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)
  8. mysql 5.6 初始化_MySQL 5.6 关于登陆的初始化设置
  9. uva 816(经典bfs例子)
  10. MMDetection-运行时