FFmpeg 视频转码基本用法
0. 查看视频信息
ffmpeg -i input.mp4
查询结果如下:
Stream #0:00x1: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1280x720, 1734 kb/s, 30 fps, 30 tbr, 16k tbn (default)
Stream #0:10x2: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 313 kb/s (default)
可以得到如下有用的信息:
- 视频流信息:Stream #0:0,视频编码格式为h264(High Profile),分辨率为1280x720,帧率为30 fps。
- 音频流信息:Stream #0:1,音频编码格式为AAC(LC),采样率为48000 Hz,声道为立体声。
1. 视频裁剪
1.1 指定开始时间和裁剪时长
从 45 秒开始,裁剪 15 秒。
# 更常用的方式
ffmpeg -i input.mp4 -c:v libx264 -ss 00:00:45 -t 15 output.mp4
# 指定开始的秒数
# ffmpeg -i input.mp4 -c:v libx264 -ss 45 -t 15 output.mp4
1.2 指定裁剪开始时间和结束时间
从 45 秒开始,裁剪到 1 分钟。
# 更常用的方式
ffmpeg -i input.mp4 -c:v libx264 -ss 00:00:45 -to 00:01:00 output.mp4
# 视频比较短的时候,指定开始的秒数和结束的秒数
# ffmpeg -i input.mp4 -c:v libx264 -ss 45 -to 60 output.mp4
2. 视频格式转换
可以转换成各种格式,如 avi、mkv、mov、flv、wmv、gif 等等,经测试 mp4 转各种格式都没有出现问题,只是发现有些默认播放器不支持某些格式。
ffmpeg -i input.mp4 -c:v libx264 output.avi
注意这里转换成 gif 应该使用 gif 编码器作为输出格式,而不是 libx264。
ffmpeg -i output.mp4 output.gif
3. 视频画质转换
3.1 指定高度和宽度
ffmpeg -i input.mp4 -vf "scale=1280:720" -c:v libx264 output.mp4
3.2 指定宽度,高度自动调整
ffmpeg -i input.mp4 -vf "scale=1280:-1" -c:v libx264 output.mp4
3.3 指定高度,宽度自动调整
ffmpeg -i input.mp4 -vf "scale=-1:720" -c:v libx264 output.mp4
3.4 指定比例调整
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" -c:v libx264 output.mp4
#ffmpeg -i input.mp4 -vf "scale=iw*0.5:ih*0.5" -c:v libx264 output.mp4
4. 调整视频帧率
ffmpeg -i input.mp4 -r 24 output.mp4
5. 视频压缩
5.1 preset参数
preset 参数用于指定视频编码器的预设选项,它可以影响视频编码的速度和质量。常见的参数有 ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow,编码速度越慢,压缩率越高,文件就越小。
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow output.mp4
5.2 crf参数
CRF(Constant Rate Factor)参数用于控制视频编码的质量。CRF参数的取值范围通常是0到51,其中0表示无损压缩,51表示最差的质量。默认值是23。
ffmpeg -i input.mp4 -c:v libx264 -crf 40 output.mp4
6. 视频加减速
6.1 仅加减速视频
这意味这音频不会和视频同步。
# 视频加速
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -c:v libx264 -c:a copy output.mp4
下面的命令将视频播放调整为 0.5 倍。
# 视频减速
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" -c:v libx264 -c:a copy output.mp4
6.2 视音频同步加减速
使用 -filter_complex 选项来分别处理音频和视频,然后再将它们合并成一个新的视频文件。
# 将视频加速为原来的2倍
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
值得注意的是 atempo 对音频速度调整限制在0.5 到 2.0 之间。
# 将视频减速为原来的两倍
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
[0:v]
表示输入文件中的第一个视频流。在 FFmpeg 中,输入文件可以包含多个音频流和视频流,它们被编号为索引。索引从0开始,表示第一个流。因此,[0:v]
表示第一个输入文件的视频流。
类似地,[0:a]
表示输入文件的第一个音频流,[1:v]
表示第二个输入文件的视频流,[1:a]
表示第二个输入文件的音频流,依此类推。
7. 视频合并
7.1 方式一
创建一个文本文件
file 'input.mp4'
file 'input2.mp4'
运行命令:
ffmpeg -f concat -i input.txt -c copy output.mp4
7.2 方式二
ffmpeg -i video1.mp4 -i video2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" -map "[v]" -map "[a]" output.mp4
在上述命令中,使用了 -i
选项两次来指定要合并的两个视频文件,即 video1.mp4
和 video2.mp4
。然后,使用 -filter_complex
选项指定复杂的过滤器图表。
[0:v][0:a][1:v][1:a]
表示将第一个视频文件的视频流 [0:v]
、音频流 [0:a]
,以及第二个视频文件的视频流 [1:v]
、音频流 [1:a]
作为输入。
concat=n=2:v=1:a=1[v][a]
表示使用 concat 过滤器将这四个输入流串联起来。n=2
表示总共有两个输入文件,v=1
表示输出一个视频流,a=1
表示输出一个音频流。结果视频流保存在 [v]
,音频流保存在 [a]
。
最后,使用 -map
选项将处理后的视频流 [v]
和音频流 [a]
映射到输出文件。
8. 视频添加水印
使用系统默认字体,发现中文乱码。
ffmpeg -i input.mp4 -vf "drawtext=text='watermark':fontsize=30:fontcolor=white:x=20:y=20" -c:a copy output.mp4
windows 下使用字体的绝对路径似乎不生效,只好将字体复制到当前目录。
ffmpeg -i input.mp4 -vf "drawtext=text='watermark水印':fontfile=msyh.ttc:fontsize=30:fontcolor=white:x=20:y=20" -c:a copy output.mp4
9. 提取视频缩略图
fps=1/10
意思是每秒 1/10 帧,即 10 秒才一帧,这条命令的意思是每 10 秒产生一张缩略图。
ffmpeg -i input.mp4 -vf "fps=1/10,scale=-1:720" t-%03d.jpg