FFmpeg 视频转码简单使用
因为业务需求涉及
# 格式为ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
很好理解,分别代表全局参数、输入文件参数、输入文件、输出文件参数、输出文件。
插叙
常见的媒体格式有
实现某种编码格式,就需要用到对应的编码器,比如
h.264 对应libx264 。 查看FFmpeg 已安装的编码器ffmpeg -encoders
。
可以通过命令查看
ffmpeg -codecs

webm 转mp4

🖥️ 最简单的转码命令
如果不指定编码格式,
ffmpeg -i xxx.webm xxx.mp4
常用的参数
-c
: 指定编码器。-c:v
: 指定视频编码器,等价于-vcodec
。-c:a
: 指定音频编码器,等价于-acodec
。-y
: 无需确认,输出同名时直接覆盖。-an
: 去除音频流。-vn
: 去除视频流。-crf
: 量化器,用来控制视频质量,取值范围是[0-51] ,越小越视频质量越好,理论上18 ~ 28 范围比较合适。-r
: 帧率FPS 。-b:v
: 设置视频码率。-b:a
: 设置音频码率。
但值得注意的是
# 这条命令的意思是视频数据直接复制,只是更换容器,不转码ffmpeg -i xxx.webm -c:v copy xxx.mp4

✅ 正确
ffmpeg -i xxx.webm -c:v libx264 xxx.mp4
扩展
🖥️ 查看视频信息
ffmpeg -i xxx.mp4
🖥️ 提取音频
ffmpeg -i xxx.mp4 -vn xxx.mp3
-vn
去掉视频流,同理使用 -an
去掉音频流。
🖥️ 将有声视频分拆为音频和无声视频
ffmpeg -i xxx.mp4 -map 0:a xxx.mp3 -map 0:v xxx.mp4
🖥️ 将音频和无声视频合并成有声视频
注意:如果需要音频和画面同步的话,需要时长严格一致。
ffmpeg -i xxx.mp4 -i xxx.mp3 -c:v copy -c:a aac xxx.mp4
🖥️ 裁剪画面
-vf "crop=w:h:x:y"
# 表示 从 原视频 坐标为 (0, 200)开始,裁剪一个 480x480 的画面。ffmpeg -i xxx.mp4 -vf "crop=480:480:0:200" xxx.mp4
🖥️ 裁剪视频时长
# 表示从 00:00:10.100 开始,截取到 00:00:30ffmpeg -i xxx.mp4 -ss 00:00:10.100 -to 00:00:30 -c copy xxx.mp4
时间也可以不使用 这种格式(00:00:30
-t
。
🖥️ 截图
# 表示从 01:07:11 开始,截取一帧ffmpeg -ss 01:07:11 -i xxx.mp4 -vframes 1 xxx.jpg
# 表示从 01:07:11 开始,连续对一秒截图,输出的文件名为 xxx_1.jpg ...ffmpeg -ss 01:07:11 -i xxx.mp4 -t 00:00:01 xxx_%d.jpg
# 表示对视频截图,每秒截图24张ffmpeg -i xxx.mp4 xxx_%d.jpg -vf fps=24/1
这里把 -ss
前置是因为处理的速度会更快,因为命令会直接从 目标时间点开始处理;如果把它放在后面的话,命令会把视频 解析到目标时间点 再开始处理。
🖥️ 提高提取的图片质量
-qscale:v n
用于设置质量等级,
ffmpeg -ss 01:07:11 -i xxx.mp4 -qscale:v 1 -vframes 1 xxx.jpg
-q:v
用于设置
ffmpeg -ss 01:07:11 -i xxx.mp4 -q:v 1 -qmin 1 -qmax 1 -vframes 1 xxx.jpg
🖥️ 缩放
# 表示 输出一张 480x360 分辨率的图片ffmpeg -ss 01:07:11 -i xxx.mp4 -vframes 1 -vf scale=480:360 xxx.jpg
# 表示 输出一张 480x360 分辨率的视频ffmpeg -i xxx.mp4 -vf scale=480:360 xxx.mp4
如果想要只指定480:-1
,则另一条边会自动计算,保持图片原先的宽高比。