文章目录
1 FFmpeg基本工具
FFmpeg 中常用的工具主要是ffmpeg、ffprobe、ffplay,它们分别用作多媒体的编解码工具、内容分析工具和播放器,重点介绍这三个工具的常用命令。
ffmpeg命令,介绍ffmpeg常用的参数用法并举例说明,例如如何查看ffmpeg 的帮助信息,如何通过ffmpeg 的帮助信息快速了解转码参数并快速上手使用。
ffprobe命令,介绍ffprobe进行音视频数据分析的常用参数,并通过实例介绍如何分析视频文件的流信息、包信息、帧信息、导出数据等。
ffplay命令,介绍ffplay常用的参数使用及示例,例如,如何使用ffplay 定制化窗口播放视频、输出音频可视化数据、输出视频可视化数据等。
2 ffmpeg的使用
ffmpeg在做音视频编解码时非常方便,所以在很多场景下转码使用的是ffmpeg,通过ffmpeg --help可以看到ffmpeg常见的命令大概分为6个部分,具体如下。
- ffmpeg信息查询部分
- 公共操作参数部分
- 文件主要操作参数部分
- 视频操作参数部分
- 音频操作参数部分
- 字幕操作参数部分
2.1 ffmpeg常用命令
使用:ffmpeg [options] [ [infile options] -i infile]…{[outfile options ]outfile}…
命令参数 | 内容 | 命令参数 | 内容 |
---|---|---|---|
-buildconf | 显示构建配置 | -bsfs | 显示可用的比特流过滤器 |
-formats | 显示可用的格式 | -protocols | 显示可用的协议 |
-muxers | 显示可用的复用器 | -filters | 显示可用的过滤器 |
-demuxers | 显示可用的解复用器 | -pix_fmts | 显示可用的像素格式 |
-devices | 显示可用的设备 | -layouts | 显示标准通道布局 |
-codecs | 显示可用的编解码器 | -sample_fmts | 显示可用的音频采样格式 |
-decoders | 显示可用的解码器 | -dispositions | 显示可用的流配置 |
-encoders | 显示可用的编码器 | -colors | 显示可用的颜色名称 |
-y | 控制覆盖输出文件(即使输出文件已经存在,也会直接覆盖输出文件,而不会提示是否允许覆盖。) | -f(-fformat) | 用于指定输入或输出文件的格式image2(一种格式) |
-ss | 用于指定从输入文件中的哪个时间点开始处理 | -vframes | 用于指定要处理的视频帧数称 |
3 ffplay的使用
ffplay不仅仅是播放器,同时也是测试ffmpeg 的codec引擎、format引擎,以及filter引擎的工具,并且还可以进行可视化的媒体参数分析,其可以通过ffplay --help进行查看。
3.1 ffplay播放控制
选项 | 说明 | 选项 | 说明 |
---|---|---|---|
q,Esc | 退出播放 | t | 循环切换字幕流 |
f,鼠标左键双击 | 全屏切换 | c | 循环切换节目 |
p,Space | 暂停 | w | 循环切换过滤器或显示模式 |
m | 静音切换 | s | 逐帧播放 |
9,0 | 9 减少音量,0 增加音量 | ← / → | 向后/向前拖动10秒 |
/,***** | / 减少音量,***** 增加音量 | ↑ / ↓ | 向后/向前拖动1分钟 |
a | 循环切换音频流 | 鼠标右键单击 | 拖动与显示宽度对应百分比的文件进行播放 |
v | 循环切换视频流 |
3.2 fplay常用命令
使用:ffplay [ options ] input_file
ffplay基本参数
命令参数 | 内容 | 命令参数 | 内容 |
---|---|---|---|
-x | 强制设置视频显示窗口的宽度 | -nodisp | 关闭图形化显示窗口 |
-y | 强制设置视频显示窗口的高度 | -noborder | 无边框窗口 |
-s | 设置视频显示的宽高 | -af | 设置音频的滤镜 |
-f | 强制使用设置的格式进行解析 | -vf | 设置视频的滤镜 |
-fs | 强制全屏显示 | -window_title | 设置显示窗口的标题 |
-an | 屏蔽音频 | -codec | 强制使用设置的codec进行解码 |
-vn | 屏蔽视频 | -autorotate | 自动旋转视频 |
-sn | 屏蔽字幕 | -video_size | 帧尺寸设置显示帧存储(WxH格式),仅适用于类似原始YUv等没有包含帧大小(WxH)的视频。比如:ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv-pixel_format format格式设置像素格式。 |
-ss | 根据设置的秒进行定位拖动注意时间单位:比如’55’=55 seconds, ‘12:03:45’=12 hours,03 minutes and 45 seconds, ‘23.189’=23.189 second | -bytes | 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动 |
-t | 设置播放视频/音频的长度 | -volume | 设置起始音量。音量范围[0~100] |
-showmode | 设置显示模式,可用的模式值:0显示视频,1显示音频波形,2显示音频频谱。缺省为0,如果视频不存在则自动选择2. | -seek_interval | 自定义左/右键定位拖动间隔(以秒为单位),默认值为10秒(代码没有看到实现) |
fplay高级参数
命令参数 | 内容 | 命令参数 | 内容 |
---|---|---|---|
-ast | 指定音频流索引,比如-ast 3,播放流索引为3的音频流。 | -autoexit | 视频播放完毕后退出。 |
-vst | 指定视频流索引,比如-vst 4,播放流索引为4的视频流。 | -autorotate | 根据文件元数据自动旋转视频。值为o或1,默认为1。 |
-sst | 指定字幕流索引,比如-sst 5,播放流索引为5的字幕流。 | -framedrop | 当CPU资源占用过高时,自动丢帧。 |
-stats | 打印多个回放统计信息,包括显示流持续时间,编解码器参数,流中的当前位置,以及音频/视频同步差值。默认情况下处于启用状态,要显式禁用它则需要指定-nostats。 | -infbuf | 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景。 |
-genpts | 生成pts。 | -fast | 非标准化规范的多媒体兼容优化。 |
-exitonkeydown | 当有按键按下事件产生时退出ffplay | -sync type | 同步类型将主时钟设置为audio (type=audio) , video(type=video)或external (type=ext),默认是audio为主时钟。 |
-exitonmousedown | 当有鼠标按键事件产生时退出ffplay | -loop | 设置播放循环次数 |
-codec:media_specifier | 强制使用设置的多媒体解码器,media_specifier可用值为a(音频),v(视频)和s字幕。比如-codec:v h264_qsv强制视频采用h264_qsv解码 | -scodec | 强制使用设置的字幕解码器进行字幕解码 |
-acodec | 强制使用设置的音频解码器进行音频解码 | -vcodec | 强制使用设置的视频解码器进行视频解码 |
4 ffprobe的使用
在FFmpeg 套件中,除了ffmpeg作为多媒体处理工具之外,还有ffprobe多媒体信息查看工具,ffprobe主要用来查看多媒体文件的信息。ffprobe常用的参数比较多,可以通过ffprobe --help来查看详细的帮助信息。
4.1 ffprobe常用命令
使用:ffprobe [ OPTIONS ][ INPUT_FILE ]
命令参数 | 内容 | 命令参数 | 内容 |
---|---|---|---|
-buildconf | 显示构建配置 | -pix_fmts | 显示可用的像素格式 |
-formats | 显示可用格式 | -layouts | 显示标准通道布局 |
-muxers | 显示可用的复用器 | -sample_fmts | 显示可用的音频采样格式 |
-demuxers | 显示可用的解复用器 | -dispositions | 显示可用的流配置 |
-devices | 显示可用设备 | -filters | 显示可用的过滤器 |
-codecs | 显示可用编解码器 | -protocols | 显示可用的协议 |
-bsfs | 显示可用的位流过滤器 | -colors | 显示可用的颜色名称 |
字段 | 说明 |
---|---|
codec_type | 多媒体类型,如视频包、音频包等 |
stream_index | 多媒体的stream索引 |
pts | 多媒体的显示时间值 |
pts_time | 根据不同格式计算过后的多媒体的显示时间 |
dts | 多媒体解码时间值 |
dts_time | 根据不同格式计算过后的多媒体解码时间 |
duration | 多媒体包占用的时间值 |
duration_time | 根据不同格式计算过后的多媒体包所占用的时间值 |
size | 多媒体包的大小 |
pos | 多媒体包所在的文件偏移位置 |
flags | 多媒体包标记,如关键包与非关键包的标记 |
字段 | 说明 |
---|---|
filename | 文件名 |
nb_streams | 媒体中包含的流的个数 |
nb_programs | 节目数 |
format_name | 使用的封装模块的名称 |
format_long_name | 封装的完整名称 |
start_time | 媒体文件的起始时间 |
duration | 媒体文件的总时间长度 |
size | 媒体文件的大小 |
bit_rate | 媒体文件的码率 |
属性 | 说明 |
---|---|
media_type | 帧的类型(视频、音频、字幕等) |
stream_index | 帧所在的索引区域 |
key_frame | 是否为关键帧 |
pkt_pts | Frame包的pts |
pkt_pts_time | Frame包的pts 的时间显示 |
pkt_dts | Frame包的dts |
pkt_dts_time | Frame包的dts的时间显示 |
pkt_duration | Frame包的时长 |
pkt_duration_time | Frame包的时长时间显示 |
pkt_pos | Frame包所在文件的偏移位置 |
width | 帧显示的宽度 |
height | 帧显示的高度 |
pix_fmt | 帧的图像色彩格式 |
pict_type | 帧类型 |
sample_fmt | 采样格式 |
nb_samples | 每帧的样本数 |
channels | 通道数 |
channel_layout | 通道布局 |
属性 | 说明 |
---|---|
index | 流所在的索引区域 |
codec_name | 编码名 |
codec_long_name | 编码全名 |
profile | 编码的profile |
level | 编码的 level |
has_b_frames | 包含B帧信息 |
codec_type | 编码类型 |
codec_time_base | 编码的时间戳计算基础单位 |
pix_fmt | 图像显示的色彩格式 |
coded_width | 图像的宽度 |
coded_height | 图像的高度 |
codec_tag_string | 编码的标签数据 |
r_frame_rate | 实际帧率 |
avg_frame_rate | 平均帧率 |
time_base | 时间基数(用来进行timestamp计算) |
bit_rate | 码率 |
max_bit_ratc | 最大码率 |
nb_frames | 帧数 |
ffprobe除了使用前面的参数可以获得key-value格式的显示方式,还可以格式化的显示,需要用到ffprobe -print_format或者ffprobe -of参数来进行相应的格式输出,而-print_format支持多种格式输出,包括XML、INI、JSON、CSV、FLAT等。
5 ffmpeg命令练习
5.1 音视频录制
在Windows下使用ffmpeg的录制操作需要安装dshow设备
查看可用设备名称:ffmpeg -list_devices true -f dshow -i dummy
-
录制视频
桌面:ffmpeg -f dshow -i video=“screen-capture-recorder” desktop.mp4
摄像头:ffmpeg -f dshow -i video=“Integrated Webcam” record.mp4 -
录制声音
系统声音:ffmpeg -f dshow -i audio=“virtual-audio-capturer” audio.aac
系统+麦克风:ffmpeg -f dshow -i audio=“麦克风阵列 (Realtek® Audio)” -f dshow -i audio=“virtual-audio-capturer” -filter_complex amix=inputs=2:duration=first:dropout_transition=2 audio2.aac -
录制视频+声音
ffmpeg -f dshow -i audio=“麦克风阵列 (Realtek® Audio)” -f dshow -i audio=“virtual-audio-capturer” -filter_complex amix=inputs=2:duration=first:dropout_transition=2 -f dshow -video_size 1536x864 -framerate 30 -pixel_format yuv420p -i video=“screen-capture-recorder” -vcodec libx264 -b:v 3M -y test.flv -
查看录制音视频可选参数
视频:ffmpeg -f dshow -list_options true -i video=“screen-capture-recorder”
音频:ffmpeg -f dshow -list_options true -i audio=“麦克风阵列 (Realtek® Audio)”