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.mp4video2.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
阅读剩余
THE END