FFmpeg 视频转码简单使用
因为业务需求涉及 FFmpeg 使用,所以简单记录一下 使用的笔记或者坑点。
FFmpeg 是多媒体常用的开源软件,能够录制,解码,编码,转码等,而且支持跨平台。
FFmpeg 命令行工具🤖
# 格式为
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
很好理解,分别代表全局参数、输入文件参数、输入文件、输出文件参数、输出文件。
插叙
常见的媒体格式有 mp4、mkv、webm、avi、rmvb、mp3、wav、flac等。 常见的编码格式有h.264、h.265、vp8、vp9、aac等。
实现某种编码格式,就需要用到对应的编码器,比如 h.264 对应 libx264。 查看 FFmpeg 已安装的编码器
ffmpeg -encoders
。
可以通过命令查看 FFmpeg 支持的音/视频编码👇🏻
ffmpeg -codecs
webm 转 mp4
webm 是由 Google 提出的开放免费媒体格式格式。 现在大部分浏览器新版都已经支持。
🖥️ 最简单的转码命令
如果不指定编码格式,FFmpeg 会自动判断输入文件的编码。
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
: 设置音频码率。
但值得注意的是 webm 的视频编码可能是 vp8、vp9、h.264 。 如果我使用如下命令进行转码的话,可能报错。
# 这条命令的意思是视频数据直接复制,只是更换容器,不转码
ffmpeg -i xxx.webm -c:v copy xxx.mp4
如果是 h.264 编码则没有问题,如果是其余两种则会报错,意思就是不认识这种编码。
✅ 正确
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"
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:30
ffmpeg -i xxx.mp4 -ss 00:00:10.100 -to 00:00:30 -c copy xxx.mp4
时间也可以不使用 这种格式(00:00:30
),直接传入 秒 也是支持的,如 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
用于设置质量等级,n 的范围是 1~31,越小质量越好,同时文件也就越大。但如果输出的是 无损 PNG 的图片时,就无需设置额外参数了。
ffmpeg -ss 01:07:11 -i xxx.mp4 -qscale:v 1 -vframes 1 xxx.jpg
-q:v
用于设置 jpeg 的压缩率,1是质量最高。听说这条命令输出的质量会比上面的好,本人还未试过这条。
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
如果想要只指定 width 或 height 的话,只需将另一个值设置为 -1,如 480:-1
,则另一条边会自动计算,保持图片原先的宽高比。