安装 FFmpeg

Windows

因为 FFmpeg 只提供源码需要编译,但有大神编译好的 FFmepg 可以直接使用仓库中的发行版,当然更具你的需求也可以Clone仓库后自己编译一份,编译方法就不多讲了,详细可以参考FFmpeg的wiki

Ubuntu

1
2
3
sudo add-apt-repository universe
sudo apt update
sudo apt install ffmpeg

概览

容器格式

我们常见的视频文件格式本身其实就是一个容器,容器里面再包括视频轨道、音频轨道、元数据、字幕、标题、封面等等…… 常见的视频容器格式有包括这些

格式 全称 特点
MP4 MPEG-4 Part 14 通用性最好,兼容性强
MKV Matroska 开放格式,支持多轨道
WebM Web Media 专为 Web 设计,开源免费
AVI Audio Video Interleave 微软开发,较老的格式
MOV QuickTime 苹果开发,专业领域常用

TOP: WebM 就是最近大火的 AV1、VP9、VP8 常用的容器,编解码需要特定的硬件加速

例如 AIN 22年新品都支持 AV1 编解码硬件加速

编码

常见的几种编码;包括了授权编码、无版权编码、音频编码格式

授权编码

  • H.262
  • H.264
  • H.265

无版权编码

  • VP8
  • VP9
  • AV1

音频编码格式

  • MP3
  • AAC

视频编码器

编码器 说明
libx264 最流行的开源 H.264 编码器
libx265 开源的 HEVC 编码器
libvpx 谷歌的 VP8 和 VP9 编码器
libaom AV1 编码器
h264_nvenc NVIDIA GPU 硬件加速 H.264 编码器
hevc_nvenc NVIDIA GPU 硬件加速 H.265 编码器

音频编码器

编码器 说明
libfdk_aac 高质量 AAC 编码器
aac FFmpeg 内置 AAC 编码器
libmp3lame MP3 编码器
libopus Opus 编码器

查看 FFmpeg 已安装的编码器

1
ffmpeg -encoders

使用方式

1
ffmpeg [1] [2] -i [3] [4] [5]

[1] 全局参数

[2] 输入文件参数

[3] 输入文件

[4] 输出文件参数

[5] 输出文件

参数

  • -c: 指定编码器
  • -c copy: 直接复制不经过重新编码,更快
  • -c:v: 指定视频编码器
  • -c:a: 指定音频编码器
  • -i: 指定输入文件
  • -an: 去除音频流
  • -vn: 去除视频流
  • -preset: 视频编码质量 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
  • -y: 不经过确认,输出时直接覆盖同名文件

更多请参考: https://zh.m.wikipedia.org/zh-hans/FFmpeg


文件信息

1
2
3
4
ffmpeg -i input.mp4

只显示元信息,干净
ffmpeg -i input.mp4 -hide_banner

转格式

1
2
3
4
ffmpeg -i input.avi output.mp4

直接复制速度最快
ffmpeg -i input.avi -c copy output.mp4

-i 输入文件

-c copy 直接复制不转码速度更快

转码

1
2
3
4
ffmpeg -i input.mp4 -c:v libx264 output.mp4

选择 H.265 编码器
ffmpeg -i input.mp4 -c:v libx265 output.mp4

-i 输入文件

-c:v 转换编码器

剪片

1
ffmpeg -ss 00:00:00 -t 00:00:30 -i input.mp4 -vcodec copy -acodec copy output.mp4

-ss 开始时间

-t 截取到时间

-i 输入文件

码率

本篇章过于专业,需要更深度的了解!这里只演示最简单的编码方式,不包括压片配置。

ABR (VBR)二次编码

1
2
3
4
5
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 output.mp4

当然也可以仅 VBR 一次
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 output.mp4

CBR 恒定码率

1
2
3
4
5
6
7
8
9
10
11
压缩到 2M 码率
ffmpeg -i input.mp4 -b:v 2M output.mp4

压缩稳定到 2M 码率
ffmpeg -i input.mp4 -b:v 2M -bufsize 2M output.mp4

压缩稳定在 2M 比特率允许最大 2.5M 码率
ffmpeg -i input.mp4 -b:v 2M -bufsize 2M -maxrate 2.5M output.mp4

使用 libx264 解码器最小 1M 比特率,最大 2M 比特率,稳定在 1M 码率
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -minrate 1M -maxrate 2M -bufsize 1M output.mp4

-i 输入文件

-b:a 音频码率

-b:v 视频码率

-minrate 允许最小码率

-maxrate 允许最大码率

-bufsize 码率控制缓冲器

大小

1
ffmpeg -i input.avi -fs 114M output.mp4

-i 输入文件

-fs 控制文件大小

分辨率

1
2
3
4
ffmpeg -i input.mp4 -vf scale=1920:1080 output.mp4

保持长宽比是 -1
ffmpeg -i input.mp4 -vf scale=1920:-1 output.mp4

-i 输入文件 [保持长宽比 -1]

FPS

1
ffmpeg -i input.avi -r 30 output.mp4

-i 输入文件

-r 帧率值

提取音频

1
ffmpeg -i input.mp4 -f mp3 -vn output.mp3
1
ffmpeg -i input.mp4 -acodec aac -vn output.mp3

-i 输入文件

-f 输出格式

-vn 不包含视频

-acodec 设定声音编解码器

分离音视频

分离视频

1
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

分离 acc 格式

1
ffmpeg -i input.mp4 -acodec copy -vn output.m4a ffmpeg -i m.m4a m.mp3

直接提取音频

1
ffmpeg -i mavel4.mp4 m.mp3

音视频合并

1
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -strict experimental output.mp4

-i 输入文件

-c:a 音频编码方式

-c:v 视频编码方式

压缩音频

1
ffmpeg -i input.wav -b:a 64k -acodec mp3 -ar 44100 -ac 1 output.mp3

-i 输入文件

-b 码率

-ar 采样率

截图

指定时间截图

1
ffmpeg -ss 00:11:45 -i input.mp4 -r 1 output.jpg

从头开始抽帧截图

1
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 output.jpg

-i 输入文件
-r 几秒一帧
-q:v 图像质量
-f 输出格式

封面

视频封面

1
ffmpeg -i input.mp4 -i input.jpg -map 0 -map 1:0 -c copy -disposition:v:1 output.mp4

音频封面

1
2
ffmpeg -i input.mp3 -i input.jpg -map 0:0 -map 1:0 -codec copy -id3v2_version 3 \ 
-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" output.mp3

性能优化

多线程处理

1
2
# 使用 5 个线程加速处理
ffmpeg -threads 5 -i input.mp4 -c:v libx264 output.mp4

硬件加速(NVIDIA GPU)

1
2
3
4
5
# 使用 NVENC 硬件编码
ffmpeg -i input.mp4 -c:v h264_nvenc -preset fast output.mp4

# 使用 CUDA 硬件解码 + 编码
ffmpeg -hwaccel cuda -i input.mp4 -c:v h264_nvenc output.mp4

快速预览(降低质量换取速度)

1
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -crf 28 output.mp4

基础抽帧操作

1. 指定时间点抽取单帧

1
ffmpeg -i d:\工作目录\***\01.mp4 -ss 00:01:30.000 -vframes 1 -an test.jpg

读取 01.MP4 视频中的 1 分 30 秒位置抽帧,图片名称保存为 test.jpg,图像分辨率与视频分辨率一致

参数说明:

  • -ss 00:01:30.000:定位到指定时间点(时:分:秒.毫秒)
  • -vframes 1:只抽取 1 帧
  • -an:禁用音频流

2. 每秒抽帧(均匀抽帧)

1
ffmpeg -i d:\01.mp4 -r 1 -q:v 2 -f image2 d:\***\%05d.00000000.jpg

参数说明:

  • -r 1:设置输出帧率为每秒 1 帧
  • -q:v 2:设置视频质量(1-31,数值越小质量越高)
  • -f image2:指定输出格式为图片序列
  • %05d:5 位数字序号(00001, 00002…)

3. 每 N 秒抽取一帧

1
ffmpeg -i d:\01.mp4 -vf "fps=1/5" -q:v 2 d:\output\%05d.jpg

每 5 秒抽取一帧

4. 指定总帧数均匀抽取

1
ffmpeg -i d:\01.mp4 -vf "select=not(mod(n\,100))" -vsync vfr -q:v 2 d:\output\%05d.jpg

每隔 100 帧抽取一帧

关键帧操作

5. 打印关键帧信息

1
ffprobe -i d:\01.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type

参数说明:

  • -v quiet:静默模式,减少输出信息
  • -select_streams v:只选择视频流
  • -show_entries frame=pkt_pts_time,pict_type:显示时间戳和帧类型

6. 抽取关键帧(I帧)

1
ffmpeg -i d:\01.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -qscale:v 2 -f image2 d:\***\%08d.jpg

参数说明:

  • -vf:视频过滤器
  • select=eq(pict_type\,I):选择帧类型等于 I 的帧
  • -vsync vfr:可变帧率,阻止每个关键帧产生多余的拷贝
  • -qscale:v 2:视频质量参数(2 为高质量)
  • -f image2:输出为图片序列
  • %08d:8 位数字序号

关键帧原理:I/B/P 帧

帧类型说明

帧类型 名称 说明 特点
I帧 Intra-coded Frame(关键帧) 完整编码的独立图像帧 可独立解码,数据量最大,是随机访问点
P帧 Predictive Frame(预测帧) 参考前面的 I 帧或 P 帧进行编码 只存储与参考帧的差异,数据量中等
B帧 Bi-directional Frame(双向预测帧) 同时参考前后帧进行编码 压缩率最高,数据量最小,解码顺序与显示顺序不同

帧结构示意图

1
2
3
4
5
6
7
TEXTGOP (Group of Pictures) 示例:
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ I │ B │ B │ P │ B │ B │ P │ B │ B │ P │ B │ B │ I │ B │ B │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
↑ ↑
关键帧 下一个关键帧
└─────────────── GOP ──────────────────┘

常用输入选项

  • -i filename:指定输入文件名。
  • -f fmt:强制设定 文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
  • -ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。

-对于输入,以下选项通常是自动识别的,但也可以强制设定。

  • -c codec:指定解码器,需使用能力集列表中的名称。
  • -acodec codec:指定声音的解码器,需使用能力集列表中的名称。
  • -vcodec codec:指定视频的解码器,需使用能力集列表中的名称。
  • -b:v bitrate:设定视频流的比特率,整数,单位bps。
  • -r fps:设定视频流的帧率,整数,单位fps。
  • -s WxH : 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
  • -pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。
  • -ar sample rate:设定音频流的采样率,整数,单位Hz。
  • -ab bitrate:设定音频流的比特率,整数,单位bps。
  • -ac channels:设置音频流的声道数目。

常用输出选项

  • -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
  • -c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
  • -acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
  • -vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
  • -r fps:设定视频编码器的帧率,整数,单位fps。
  • -pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。
  • -ar sample rate:设定音频编码器的采样率,整数,单位Hz。
  • -b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
  • -ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
  • -ac channels:设置音频编码器的声道数目。
  • -an 忽略任何音频流。
  • -vn 忽略任何视频流。
  • -t hh:mm:ss[.xxx]:设定输出文件的时间长度。
  • -to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。

参考文档

FFmpeg 视频处理入门教程

使用 ffmpeg 分离视频流和音频流

ffmpeg常用参数说明及例子

码率控制(一):理解码率控制模式(x264,x264,vpx)