当前位置: 首页 > news >正文

【FFmpeg从入门到精通】第二章-FFmpeg工具使用基础

1 ffmpeg常用命令

ffmpeg在做音视频编解码时非常方便,所以在很多场景下转码使用的是ffmpeg,通过 ffmpeg --help可以看到 ffmpeg 常见的命令大概分为6个部分,具体如下。

  • ffmpeg信息查询部分
  • 公共操作参数部分
  • 文件主要操作参数部分
  • 视频操作参数部分
  • 音频操作参数部分
  • 字幕操作参数部分

ffmpeg信息查询部分的主要参数具体如下:

ffmpeg [options] [[infile options]-i infile]... {[outfile options] outfile}..

通过ffmpeg --help查看到的help信息是ffmpeg命令的基础信息,如果想获得高级参数部分,那么可以通过使用ffmpeg --help long参数来查看,如果希望获得全部的帮助信息,那么可以通过使用ffmpeg --help full参数来获得。

ffmpeg --help
ffmpeg --help long
ffmpeg --help full

通过-L参数,可以看到ffmpeg目前所支持的license协议;通过-version可以查看 ffmpeg的版本,包括子模块的详细版本信息,如libavformat、libavcodec、libavutillibavfilter、libswscale、libswresample 的版本:

使用ffmpeg转码,有时候可能会遇到无法解析的视频文件或者无法生成视频文件,报错提示不支持生成对应的视频文件,这时候就需要查看当前使用的fmpeg是否支持对应的视频文件格式,需要使用ffmpeg -formats参数来查看:

ffmpeg -formats

根据上面输出的信息可以看到,输出的内容分为3个部分,具体如下

  • 第一列是多媒体文件封装格式的Demuxing支持与Muxing 支持
  • 第二列是多媒体文件格式
  • 第三列是文件格式的详细说明

使用ffmpeg命令时,可能会出现fmpeg不支持某种编码格式或者某种解码格式的错误提示信息,这种错误常见于并未将该编码器或者解码器集成到ffmpeg中,若想查看ffmpeg是否支持H.264编码或者解码,可以通过ffmpeg -codecs 查看全部信息,也可以通过 ffmpeg -encoders査看 ffmpeg是否支持H.264编码器,或者通过 ffmpeg -decoders查看ffmpeg是否支持H.264解码器。

ffmpeg -decoders 命令行执行后,输出如下:

输出信息中包含了三部分内容,具体如下。

  • 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕,第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
  • 第二列是编码格式
  • 第三列是编码格式的详细说明

ffmpeg -encoders 命令执行后,输出如下

输出信息中同样包含了三部分内容,具体如下

  • 第一列包含6个字段,第一个字段用来表示此编码器为音频、视频还是字幕,第二个字段表示帧级别的多线程支持,第三个字段表示分片级别的多线程,第四个字段表示该编码为试验版本,第五个字段表示 draw horiz band 模式支持,第六个字段表示直接渲染模式支持
  • 第二列是编码格式
  • 第三列是编码格式的详细说明

除了查看ffmpeg支持的封装(Muxer)格式与解封装(Demuxer)格式、编码(Encoder)类型与解码(Decoder)类型,还可以通过ffmpeg -flters查看 ffmpeg 支持哪些滤镜:

输出信息的内容分为四列,具体如下

  • 第一列总共有3个字段,第一个字段是时间轴支持,第二个字段是分片线程处理支持,第三个字段是命令支持
  • 第二列是滤镜名
  • 第三列是转换方式,如音频转音频,视频转视频,创建音频,创建视频等操作
  • 第四列是滤镜作用说明

通过 ffmpeg --help full命令,可以査看ffmpeg 支持的所有封装(demuxer、muxer)格式,编解码器(encoders、decoders)和滤镜处理器(filters)。如果要了解 ffmpeg 支持的具体某一种 demuxer、muxer类型,可以通过 ffmpeg -h查看该类型的详细参数,包括encoder、decoder 所支持的操作参数,fiter所支持的参数,下面就列举几个对应的例子。

1)查看FLV封装器的参数支持(ffmpeg -h muxer=flv):

ffmpeg -h muxer=flv

从输出的帮助信息中可以看到,FLV的muxer的信息包含两大部分,具体如下

  • 第一部分为FLV封装的默认配置描述,如扩展名、MIME类型、默认的视频编码格式、默认的音频编码格式
  • 第二部分为FLV 封装时可以支持的配置参数及相关说明

2)查看 flv解封装器的参数支持(ffmpeg -h demuxer=flv):

ffmpeg -h demuxer=flv

从帮助信息中可以看到,FLV的demuxer的信息包含两大部分,具体如下

  • 第一部分为 FLV 解封装默认的扩展文件名
  • 第二部分为FLV 解封装设置的参数及相关说明

3)查看H.264(AVC)的编码参数支持(ffmpeg -h encoder=h264):

ffmpeg -h encoder=h264

从帮助信息可以看到,H.264(AVC)的编码参数包含两大部分,具体如下。

  • 第一部分为H.264所支持的基本编码方式、支持的多线程编码方式(例如帧级别多线程编码或 Slice 级别多线程编码)、编码器所支持的像素的色彩格式
  • 第二部分为编码的具体配置参数及相关说明

4)查看H.264(AVC)的解码参数支持(ffmpeg -h decoder=h264):

ffmpeg -h decoder=h264

从帮助信息可以看到,H.264(AVC)的解码参数查看包含两大部分,具体如下

  • 第一部分为解码H.264时可以采用的常规支持、多线程方式支持(帧级别多线程解码或Slice级别多线程解码)
  • 第二部分为解码 H.264时可以采用的解码参数及相关说明

5)查看 colorkey 滤镜的参数支持(ffmpeg -h filter=colorkey),输出内容如下

ffmpeg -h filter=colorkey

从帮助信息中可以看到,colorkey滤镜参数查看信息包含两大部分,具体如下

  • colorkey所支持的色彩格式信息,colorkey所支持的多线程处理方式,输入或输出支持
  • colorkey所支持的参数及说明

1.1 ffmpeg 的封装转换

ffmpeg的封装转换(转封装)功能包含在AVFormat模块中,通过libavformat库进行Mux和Demux操作;多媒体文件的格式有很多种,这些格式中的很多参数在Mux与Demux的操作参数中是公用的,下面就来详细介绍一下这些公用的参数。 

参数类型说明
avioflags标记format 的缓冲设置,默认为 0,就是有缓冲
direct标记无缓冲状态
probesize整数在进行媒体数据处理前获得文件内容的大小,可用在预读取文件头时提高速度,也可以设置足够大的值来读取到足够多的音视频数据信息
fflags标记
flush_packets标记立即将 packets 数据刷新写入文件中
genpts标记输出时按照正常规则产生 pts
nofillin标记不填写可以精确计算缺失的值
igndts标记忽略 dts
discardcorrupt标记丢弃损坏的帧
sortdts标记尝试以 dts 的顺序为准输出
keepside标记不合并数据
fastseek标记快速 seek(定位)操作,但是不够精确
latm标记设置 RTP MP4_LATM 生效
nobuffer标记直接读取或写出,不存入 buffer,用于在直播采集时降低延迟
bitexact标记不写入随机或者不稳定的数据
seek2any整数支持随意位置 seek,这个 seek 不以 keyframe 为参考
analyzeduration整数指定解析媒体所需要花费的时间,这里设置的值越高,解析越准确,如果在直播中为了降低延迟,这个值可以设置得低一些
codec_whitelist列表设置可以解析的 codec 的白名单
format_whitelist列表设置可以解析的 format 的白名单
output_ts_offset整数设置输出文件的起始时间

1.2 ffmpeg 的转码参数

ffmpeg编解码部分的功能主要是通过模块AVCodec来完成的,通过libavcodec库进行Encode与 Decode 操作。多媒体编码格式的种类有很多,但是还是有很多通用的基本操作参数设置,下面就来详细介绍一下这些公用的参数。

参数类型说明
b整数设置音频与视频码率,可以认为是音视频加起来的码率,默认为 200kbit/s。使用这个参数可以根据 b:v 设置视频码率,b:a 设置音频码率
ab整数设置音频的码率,默认是 128kbit/s
g整数设置视频 GOP(可以理解为关键帧间隔)大小,默认是 12 帧一个 GOP
ar整数设置音频采样率,默认为 0
ac整数设置音频通道数,默认为 0
bf整数设置连续编码为 B 帧的个数,默认为 0
maxrate整数最大码率设置,与 bufsize 一同使用即可,默认为 0
minrate整数最小码率设置,配合 maxrate 与 bufsize 可以设置为 CBR 模式,平时很少使用,默认为 0
bufsize整数设置控制码率的 buffer 的大小,默认为 0
keyint_min整数设置关键帧最小间隔,默认为 25
sc_threshold整数设置场景切换支持,默认为 0
me_threshold整数设置运动估计阈值,默认为 0
mb_threshold整数设置宏块阈值,默认为 0
profile整数设置音视频的 profile,默认为 -99
level整数设置音视频的 level,默认为 -99
timecode_frame_start整数设置 GOP 帧的开始时间,需要在 non-drop-frame 默认情况下使用
channel_layout整数设置音频通道的布局格式
threads整数设置编解码工作的线程数

1.3 ffmpeg 的基本转码原理

ffmpeg 工具的主要用途为编码、解码、转码以及媒体格式转换,ffmpeg 常用于进行转码操作。

通过前两节介绍的参数,可以设置转码的相关参数,如果转码操作涉及封装的改变,则可以通过设置AVCodec与AVFormat的操作参数进行封装与编码的改变。

ffmpeg -i input.mp4 -vcodec mpeg4 -b:v 200k -r 15 -an output.avi

从输出信息中可以看到,以上输出的参数中使用了前面介绍过的参数,具体如下。

  • 转封装格式从MP4格式转换为AVI格式
  • 视频编码从 MPEG4转换为 MPEG4 格式
  • 视频码率从原来的1027kbit/s转换为200kbit/s
  • 视频帧率从原来的23.98fps转换为15fps
  • 转码后的文件中不包括音频(-an 参数)

2 ffprobe 常用命令

ffprobe的参数较多

3 ffplay 常用命令

3.1 ffplay 常用参数

参数类型说明
x整数强制设置视频显示窗口的宽度
y整数强制设置视频显示窗口的高度
s整数设置视频显示的宽高
fs整数强制全屏显示
an整数屏蔽音频
vn整数屏蔽视频
sn整数屏蔽字幕
ss整数根据设置的秒进行定位拖动
t整数设置播放视频 / 音频的长度
bytes整数设置定位拖动的策略,0 为不可拖动,1 为可拖动,-1 为自动
nodisp整数关闭图形化显示窗口
f整数强制使用设置的格式进行解析
window_title整数设置显示窗口的标题
af整数设置音频的滤镜
codec整数强制使用设置的 codec 进行解码
autorotate整数自动旋转视频

3.2 ffplay 高级参数

参数类型说明
ast整数设置将要播放的音频流
vst整数设置将要播放的视频流
sst整数设置将要播放的字幕流
stats整数输出多媒体播放状态
fast整数非标准化规范的多媒体兼容优化
sync整数音视频同步设置可根据音频时间、视频时间或者外部扩展时间进行参考
autoexit整数多媒体播放完毕之后自动退出 ffplay,ffplay 默认播放完毕之后不退出播放器
exitonkeydown整数当有按键按下事件产生时退出 ffplay
exitonmousedown整数当有鼠标按键事件产生时退出 ffplay
loop整数设置多媒体文件循环播放的次数
framedrop整数当 CPU 资源占用过高时,自动丢帧
infbuf整数设置无极限的播放器 buffer,这个选项常见于实时流媒体播放场景
vf整数视频滤镜设置
acodec整数强制使用设置的音频解码器
vcodec整数强制使用设置的视频解码器
scodec整数强制使用设置的字幕解码器

3.3 ffplay 的数据可视化分析应用

相关文章:

  • Java虚拟机(JVM)平台无关?相关?
  • BFC详解
  • uniapp上传图片时(可选微信头像、相册、拍照)
  • 基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
  • ETL数据集成平台在电商行业五大应用场景
  • 阅读分析Linux0.11 /boot/head.s
  • kotlin + spirngboot3 + spring security6 配置登录与JWT
  • Java如何在遍历集合时删除特定元素
  • 【Pandas】pandas DataFrame get
  • 2025.04.17【Stacked area】| 生信数据可视化:堆叠区域图深度解析
  • 国内外汽车行业供应链导入EDI方式的差异
  • UE5 UE循环体里怎么写延迟
  • Vue 和 Spring boot 和 Bean 不同生命周期
  • Oracle测试题目及笔记(多选)
  • OpenAI发布GPT-4.1系列模型,主打编程能力提升
  • 泛型算法——只读算法(一)
  • Oracle 处理“不允许长度为0的列”(ORA-01723)问题解析
  • Oracle_00000
  • Spring Boot 学习总结(35)—— 使用 SpringAI 实现 MCP 服务并与 Qwen 集成使用?
  • 图形变换算法
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?
  • 基金经理调仓引发大金融板块拉升?公募新规落地究竟利好哪些板块
  • 联合国秘书长欢迎中美经贸高层会谈成果
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营
  • 牛市早报|中美经贸高层会谈达成重要共识,取得实质性进展
  • 匈牙利史专家阚思静逝世,享年87岁