FFmpeg常见指令的使用


ffplay

ffplay不仅仅是播放器,也可以作为音视频数据图形化分析工具,ffplay也可以看到视频图像的运动估计方向、音视频波形等,同时也是测试ffmpeg的codec引擎、format引擎、filter引擎工具,还可以进行可视化的媒体参数分析,可以通过ffplay –help来查看:

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

举个例:

1
2
//视频参数前需加: -
ffplay -window_title "我的视频播放窗口" output.mp4

ffprobe

ffprobe是ffmpeg中一个查看多媒体文件信息的模块。此模块可以用来查看多媒体文件格式以及编码。ffprobe的命令较多,这里只简单的列举了一些比较常用的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
-L 显示协议
-h/-?/-help/--help topic 帮助可以选择话题
-version 显示版本
-buildconf 展示编译配置选项
-formats 显示支持的编码
-muxers 展示支持的封装器
-demuxers 展示支持的解封装器
-devices 展示支持的设备
-codecs 展示支持的编码
-decoders 显示支持的解码器
-encoders 显示支持的编码器
-bsfs 显示支持的比特流过滤器
-protocols 展示支持的协议
-filters 展示支持的过滤器
-pix_fmts 显示支持的像素格式
-layouts 展示支持的声道格式
-sample_fmts 显示支持的采样格式
-colors 展示支持的颜色名称
-loglevel loglevel 设置日志级别
-v loglevel 设置日志级别
-report 生成报告
-max_alloc bytes 设置单个已分配块的最大大小
-cpuflags flags 指定cpu标志
-hide_banner hide_banner 不显示程序横幅
-sources device 列出源的输出设备
-sinks device 列出输出设备的接收器
-f format 指定格式
-unit 显示显示值的单位
-prefix 对显示的值使用SI前缀
-byte_binary_prefix 对字节单位使用二进制前缀
-sexagesimal 对时间单位使用六十进制格式 HOURS:MM:SS.MICROSECONDS
-pretty 美化显示输出的值,让人可读
-print_format format 设置打印格式 (available formats are: default, compact, csv, flat, ini, json, xml)
-of format -print_format的编码
-select_streams stream_specifier 选择指定的stream
-sections 打印节结构和节信息,然后退出
-show_data 显示数据包信息
-show_data_hash 显示数据包hash值
-show_error 显示探测中的错误
-show_format 显示格式/容器信息
-show_frames 显示帧信息
-show_format_entry entry 显示格式/容器信息中的特定条目
-show_entries entry_list 显示一组指定的项
-show_log 显示log
-show_packets 显示packet信息
-show_programs 显示程序信息
-show_streams 显示stream的信息
-show_chapters 显示chapters的信息
-count_frames 每个stream中的帧数
-count_packets 每个stream中的包数量
-show_program_version ffprobe的版本
-show_library_versions 库的版本
-show_versions 程序和库的版本号
-show_pixel_formats 展示像素格式描述
-show_private_data 显示私有数据
-private 和显示私有数据一样
-bitexact 强制提取bit输出
-read_intervals read_intervals 设置读取间隔
-default 默认所有选项
-i input_file 读取指定文件
-print_filename print_file 重新显示输入的文件名
-find_stream_info 读取并解码流,用启发式方法填充缺失的信息

举个例子说明一下:

1
ffprobe -show_format output.mp4 -print_format json

输出为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"format": {
"filename": "output.mkv",
"nb_streams": 3,
"nb_programs": 0,
"format_name": "matroska,webm",
"format_long_name": "Matroska / WebM",
"start_time": "0.000000",
"duration": "5611.648000",
"size": "3212871221",
"bit_rate": "4580289",
"probe_score": 100,
"tags": {
"ENCODER": "Lavf58.45.100"
}
}
}

ffmpeg

1
2
3
4
5
6
7
8
1、视频剪切
// * -ss 指定从什么时间开始
// * -t 指定需要截取多长时间
// * -i 指定输入文件
// 截取从头开始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
//截取从30s开始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4
1
2
3
4
5
6
7
8
9
2、视频合并
//在list.txt文件中,对要合并的视频片段进行了描述。
内容如下:
file ./split.mp4
file ./split1.mp4

// 进行视频的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4

1
2
3
4
3、格式转换
//进入视频所在的目录,在终端中输入以下命令
转化为视频:ffmpeg -i video.m4s -c copy video.mp4
转化为音频:ffmpeg -i audio.m4s -c copy audio.aac
1
2
3
4
5
6
7
8
9
10
11
// -i	输入您要处理的视频文件路径
// -an 不使用音频纪录
// -vcodec 视频强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。
// -acodec 音频强制使用codec编解码方式。如果用copy表示原始编解码数据必须被拷贝。

4、将原有视频的音频消除
ffmpeg -i video原版.mp4 -vcodec copy -an video去音频版.mp4

5、加入新的音频
ffmpeg -i video去音频版.mp4 -i audio原版.mp3 -vcodec copy -acodec copy 音视频合并版.mp4

1
2
3
4
5
6
7
8
9
10
11
6、去除水印
delogo=x=0:y=0:w=100:h=77 (去除多个水印可以使用 ”,“ 分隔使用)
//参数说明:
//x、y:指定徽标的左上角坐标。它们必须指定。
//w、h:指定要清除的徽标的宽度和高度。它们必须指定。
//show:当设置为1时,屏幕上会绘制一个绿色矩形,以简化查找右侧x、y、w和h参数的过程。默认值为0。
//矩形绘制在最外层的像素上,这些像素将被(部分)替换为插值。每个方向紧挨着这个矩形的下一个像素的值将用于计算矩形内的插值。

//使用示例
ffmpeg -i output1.mp4 -vf "delogo=x=199:y=190:w=436:h=120:show=1,delogo=x=400:y=450:w=436:h=120:show=1,delogo=x=1400:y=950:w=436:h=120:show=1" -c:a copy test123.mp4

1
2
3
4
5
6
7
8
9
10
11
12
7、指定视频与指定音频合并生成新的视频文件
-map [-]input_file_id[:stream_specifier][?][,sync_file_id[:stream_specifier]] | [linklabel] (output)
//指定一个或多个输入流作为输出文件的源。每个输入流都由输入文件中的输入文件索引input_file_id和输入流索引input_stream_id标识。这两个指数都从0开始。如果指定,sync_file_id:stream_specifier设置用作表示同步引用的输入流

// 多个音频流时,指定视频与指定音频合并生成新的视频文件
// 第一个文件的第一个流:-map 0:0 第一个文件的第二个流:-map 0:1 第一个文件的第三个流:-map 0:2 .....
// 第二个文件的第一个流:-map 1:0 第二个文件的第二个流:-map 1:1 第二个文件的第三个流:-map 1:2 .....
ffmpeg -i input.mkv -map 0:0 -map 0:2 -c copy -y output.mkv

//要从输入文件中选择第一个视频流和第二个音频流:
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -c copy -y output.mkv

1
2
3
4
5
6
8、批量格式转换
//进入文件所在的文件夹中建立一个 .sh 文件 如:transform.sh
//以 mp4 转换 mp3 为例,其内容如下:
for i in *.mp4; do echo"${i%.*}.mp3"; ffmpeg -i "$i" "${i%.*}.mp3";done
//将以上内容放到transform.sh文件保存
//在终端中进入到当前的文件夹中执行指令:sh transform.sh 即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
9、修改多音轨视频的默认音轨
//当视频中含有多个音频轨道时,可用如下指令修改默认音频轨道
ffmpeg -i input.mkv -map 0:0 -map 0:2 -map 0:1 -c copy -disposition:a:0 default -y output.mkv

/*
input.mkv为输入的视频文件
output.mkv为输出的视频文件
第一个 -map 0:0 这里指的是处理视频的动画,
冒号前的0 指的是现在这个map参数要设置的是这个视频的动画,
冒号后的0 指的是将这个视频的动画, 设置为, 这个视频的动画
说人话就是, 处理后的视频, 动画还是这个动画, 不变

第二个 -map 0:2 这里处理的是视频第一个音轨,
冒号前的0 代表的是现在这个map参数要设置的是这个视频的第一个音轨
冒号后的2 指的是原视频本来的第二个音轨
说人话就是, 我现在要把原视频的第二个音轨设置成放在这个视频的第一个音轨上

第三个 -map 0:1 与上面同理
说人话就是, 我现在要把原视频的第一个音轨设置成放在这个视频的第二个音轨上
*/

更多指令感兴趣的可以前往 ffmpeg官网 查看