我想在这里简单总结一些常用的 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。