1

我想在这里简单总结一些常用的 FFmpeg 使用方法。内容会不定期更新。

基本操作

ffmpeg -i input.flv output.mp4

以下参数可以放在输出文件前:

# 设定编码方式 h264 / h265 / 直接复制
-vcodec libx264 / libx265 / copy
# 设定视频码率
-b:v 4M / 2000K
# 设定音频码率
-b:a 128k
# 设定分辨率(宽x高)
-s 1920x1080
# 设定分辨率(宽x高),可以将其中一个值写为 -1,表示根据另一个值来等比例缩放
-vf scale=640:-1
# 设定帧率(不会改变视频的播放速度)
-r 29.97
# 静音 / 去除画面
-an / -vn
# 隐藏 ffmpeg 编译信息
-hide_banner
# 设置总帧数
-vframe 200

-vf-filter:v 的缩写,表示对视频(video)施加的滤镜。其参数可以是一个,也可以是多个,用逗号隔开。参数可以加引号,虽然一般情况下并不需要这么做。同理,-af-filter:a 的缩写。

长度裁剪

# 设置开始时间,形如hh:mm:ss[.mss],或单独一个数字表示秒数,下同
-ss 0:0:20
# 设置结束时间
-to 0:0:40
# 设置持续时间(可以与 -ss 一起使用,会无视 -to)
-t 00:00:10
-t 10

由于通常不需要重新编码,因此可以设置从原文件中直接复制:

-vcodec copy -acodec copy

加速/减速

视频和音频需要分别使用不同的 filter 进行处理:

ffmpeg -i video.mp4
       -filter:v "setpts=0.5*PTS"
       -filter:a "atempo=2.0"
       output.mp4

# 视频借助 setpts 来实现加减速
# 0.5 为加速 2 倍,2.0 则为减速 0.5 倍
# 加速之后会丢帧,可以通过手动设置输出帧率为 2 倍来避免
# 如果原始视频的帧率为 25
ffmpeg -i video.mp4 -filter:v "setpts=0.5*PTS" -r 50 -an output.mp4

# 音频借助 atempo 来实现加减速,并不会改变音调
ffmpeg -i video.mp4 -filter:a "atempo=2.0" -vn output.mp4
# 范围只能是 0.5~2.0,但是可以叠加多个 atempo 来实现超出范围的变速效果
# 下面的方法可以加速 4 倍
ffmpeg -i audio.mp3 -filter:a "atempo=2.0,atempo=2.0" output.mp3

合并视频与音频

# 最基本的方法
ffmpeg -i video.mp4 -i audio.mp3 output.mp4
# 不编码,只是合并为 .mkv 文件
ffmpeg -i video.mp4 -i audio.mp3 -c copy output.mkv
# 取两个之中最短的作为总时长
ffmpeg -i video.mp4 -i audio.mp3 -shortest output.mp4
# 如果使用 FFmpeg 自己的 aac 编码,需要带上 -strict 一项,其中 experimental 还可以简写为 2
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

翻转视频

# 水平/垂直翻转
ffmpeg -i input.mp4 -vf hflip output.mp4
ffmpeg -i input.mp4 -vf vflip output.mp4
# 同时翻转(相当于旋转 180°)
ffmpeg -i input.mp4 -vf "hflip,vflip" output.mp4

旋转视频

可以通过修改视频文件的 metadata 来简单地实现视频的旋转:

# 顺时针 90
# 逆时针为正数
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=-90 output.mp4
# 保留原始视频的所有 metadata(比如拍摄信息等)
ffmpeg -i input.mp4 -map_metadata 0 -metadata:s:v rotate=90 -codec copy output.mp4

如果想要借助重新编码(速度较慢)的方式来彻底地旋转视频,那么可以:

# 顺时针旋转 90°
ffmpeg -i input.mp4 -vf transpose=1 -c:a copy output.mp4
# 旋转两次 90° 来实现旋转 180°
ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4

其中,transpose 可以为:

  • 0 - 沿左上右下对角线转置(逆时针旋转 90°,然后上下翻转)
  • 1- 顺时针旋转 90°
  • 2 - 逆时针旋转 90°
  • 3 - 沿右上左下对角线转置(顺时针旋转 90°,然后上下翻转)

特殊操作

视频转为 gif 动图

# 简易方法,但是图片质量一般
ffmpeg -i input.mp4 -r 12 output.gif
# 输出高质量图片
ffmpeg -i input.mp4 -vf "fps=12,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

参考:视频转为高质量 GIF

视频转为连续图片

ffmpeg -i video.mp4 thumb%04d.jpg
# 设置输出的帧数,否则默认情况下会输出非常多的图片
ffmpeg -i video.mp4 -vf fps=1 thumb%04d.jpg

参考:视频转为连续图片

反之,如果想将连续的图片(名称具有类似上面展示的规律)转为视频,可以:

# 帧数 30,分辨率 1920x1080
ffmpeg -r 30 -f image2 -s 1920x1080 -i thumb%04d.jpg -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4

云无月
1 声望1 粉丝