FFmpeg中的硬件加速编码器

使用下面的命令可以列出 #ffmpeg 中所有的编码器

ffmpeg -encoders

这个帖子整理一下ffmpeg中支持GPU硬件加速的码器。

如果你的GPU支持硬件加速,则可以使用右侧的非默认编码器来提高转码速度。就我本人在笔记本平台Intel低压U的使用经验,ffmpeg在开启核显硬件加速后可以降低30%的CPU占用,并且节约70%~80%的转码时间。

三大桌面GPU厂商的硬件编、解码器进化历程表

在下面的三组表格中,可以查询到自己GPU硬件支持的编码格式:

看起来Intel的核显虽然性能一直拉跨,硬件编码器却一直给得非常厚道,某些特殊编码的视频剪辑似乎是得独显核显全都要才能最大化效率

Windows

(版本:ffmpeg 4.3)

默认编码器 AMD硬件加速 Intel硬件加速 Nvidia硬件加速
H.264/AVC libx264 h264_amf h264_qsv h264_nvenc
nvenc
nvenc_h264
H.265/HEVC libx265 hevc_amf hevc_qsv hevc_nvenc
nvenc_hevc
MJPEG mjpeg mjpeg_qsv
MPEG-2 mpeg2video mpeg2_qsv
VP8 libvpx
VP9 libvpx-vp9 vp9_qsv
AV1 libaom-av1

对比本表格与上面的硬件支持表格,可以发现其中的一些格式,例如VP8编码,Intel最新的GPU硬件上支持,但ffmpeg软件上并没有做适配

Linux (x86)

(版本:ffmpeg 4.3)

默认编码器 AMD硬件加速 Intel硬件加速 Nvidia硬件加速
H.264/AVC libx264 h264_vaapi
h264_omx
h264_vaapi h264_nvenc
nvenc
nvenc_h264
H.265/HEVC libx265 ?hevc_vaapi hevc_vaapi hevc_nvenc
nvenc_hevc
MJPEG mjpeg mjpeg_vaapi
MPEG-2 mpeg2video mpeg2_vaapi
VP8 libvpx vp8_vaapi
VP9 libvpx-vp9 vp9_vaapi
AV1 libaom-av1

注:ffmpeg对于Intel GPU有完整的VAAPI支持,而对于AMD GPU的支持是不完整的:

https://trac.ffmpeg.org/wiki/Hardware/VAAPI

H.264 encode is working on GCN GPUs, but is still incomplete. No other codecs are supported by Mesa for encode yet.

Encoding and interlacing support in Mesa are incompatible because of the data layout in GPU memory. By default, frames are separated into fields and interlaced video is supported but encoding is not. Set the environment variable VAAPI_DISABLE_INTERLACE to 1 to be able to use the encoder (but without any interlaced video support.

不过考虑到ffmpeg的官方Wiki并不是实时更新,我也不确定最新的AMD GPU在最新的Linux驱动下是不是已经支持HEVC硬件加速编码了

树莓派

树莓派并不是一个设计来转码的设备,其GPU的硬件编码器部分只支持非4K分辨率的H.264视频

默认编码器 树莓派硬件加速
H.264/AVC libx264 h264_omx

macOS

可以执行这个命令查看mac版ffmpeg支持硬件加速的编码器

ffmpeg -encoders | grep videotoolbox

楼主没有macOS设备,因此大概永远不会整理。欢迎有macOS的同学编辑更新

2 Likes

Haswell看了沉默,Haswell看了流泪

赞赞赞。。

现在最常用的编码和解码格式是 h264/h265 两种,vp9 好处是开源免专利费,但用的人不多,只有 google 自己在做。

linux 的适配很麻烦,跟发行版可能有关。实际我在 openSUSE 上基本上都是软解码和软解码。

用软件版和硬件加速版在相同参数下出来的视频质量是一样的吗?

我的4590也是haswell。。。。怎么正好什么都不支持??
实际使用,好像也支持 h264_qsv ?

那一列是每个架构新添加的支持啊,从它自己那行往上的都支持

这和有损无损无关,和算法有关。
硬件压缩质量会差一点点。

其实我很好奇,Intel有jpeg硬件编码器,Photoshop导出时能不能用得上…

能在这里碰到 openSUSE 用户有点神奇,不过好像在tg群组那边没看到过你?

比较少用tg,不喜欢IM频繁打扰。我喜欢每天固定时间刷论坛。

有损压缩算法理论上就算是同样的画面用同一个编码器编码两次,结果都不会完全一样吧…反正我肉眼看不出来差别……