Skip to content

FFmpeg 视频转码简单使用

因为业务需求涉及 FFmpeg 使用,所以简单记录一下 使用的笔记或者坑点

FFmpeg 是多媒体常用的开源软件,能够录制,解码,编码,转码等,而且支持跨平台。

官方文档

FFmpeg 命令行工具🤖

bash
# 格式为
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 支持的音/视频编码👇🏻

bash
ffmpeg -codecs

ffmpeg

webm 转 mp4

webm 是由 Google 提出的开放免费媒体格式格式。 现在大部分浏览器新版都已经支持。 ffmpeg

🖥️ 最简单的转码命令

如果不指定编码格式,FFmpeg 会自动判断输入文件的编码。

bash
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 。 如果我使用如下命令进行转码的话,可能报错。

bash
# 这条命令的意思是视频数据直接复制,只是更换容器,不转码
ffmpeg -i xxx.webm -c:v copy xxx.mp4

如果是 h.264 编码则没有问题,如果是其余两种则会报错,意思就是不认识这种编码。

✅ 正确

bash
ffmpeg -i xxx.webm -c:v libx264 xxx.mp4

扩展

🖥️ 查看视频信息

bash
ffmpeg -i xxx.mp4

🖥️ 提取音频

bash
ffmpeg -i xxx.mp4 -vn xxx.mp3

-vn 去掉视频流,同理使用 -an 去掉音频流。

🖥️ 将有声视频分拆为音频和无声视频

bash
ffmpeg -i xxx.mp4 -map 0:a xxx.mp3 -map 0:v xxx.mp4

🖥️ 将音频和无声视频合并成有声视频

注意:如果需要音频和画面同步的话,需要时长严格一致。

bash
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 是相对原视频中左上角的偏移值。

bash
# 表示 从 原视频 坐标为 (0, 200)开始,裁剪一个 480x480 的画面。
ffmpeg -i xxx.mp4 -vf "crop=480:480:0:200" xxx.mp4

🖥️ 裁剪视频时长

bash
# 表示从 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

🖥️ 截图

bash
# 表示从 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 的图片时,就无需设置额外参数了。

bash
ffmpeg -ss 01:07:11 -i xxx.mp4 -qscale:v 1 -vframes 1 xxx.jpg

-q:v 用于设置 jpeg 的压缩率,1是质量最高。听说这条命令输出的质量会比上面的好,本人还未试过这条。

bash
ffmpeg -ss 01:07:11 -i xxx.mp4 -q:v 1 -qmin 1 -qmax 1 -vframes 1 xxx.jpg

🖥️ 缩放

bash
# 表示 输出一张 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,则另一条边会自动计算,保持图片原先的宽高比。

Released under the MIT License.