Skip to content

如何用 FFmpeg 查看支持的编码和硬件加速

在使用 FFmpeg 处理视频时,我们经常需要知道它到底支持哪些编码格式,以及我们的电脑硬件(如显卡)能否用来加速视频处理。如果能用上硬件加速,处理视频的速度会快很多。这篇文章就用最直接的方式,教你如何查看这些信息。

一、查看所有支持的编解码器

想知道你的 FFmpeg 能处理哪些音视频格式,最简单的办法就是让它自己列出来。

1. 查看全部编解码器

打开你的命令行终端(Windows 里的 CMD 或 PowerShell,macOS 或 Linux 里的终端),输入以下命令:

bash
ffmpeg -codecs

执行后,你会看到一个长长的列表。每一行的格式都差不多,关键是看懂开头的那些字母:

Codecs:
 D..... = 支持解码 (Decoding)
 .E.... = 支持编码 (Encoding)
 ..V... = 视频 (Video)
 ..A... = 音频 (Audio)
 ..S... = 字幕 (Subtitle)
 ...I.. = 仅帧内压缩 (Intra frame-only)
 ....L. = 有损压缩 (Lossy)
 .....S = 无损压缩 (Lossless)
 -------
 D.V.L. h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
 DEV.LS h264_amf              AMD AMF H.264 Encoder (codec h264)
 DEV.L. h264_nvenc            NVIDIA NVENC H.264 encoder (codec h264)
 D.A.L. aac                   AAC (Advanced Audio Coding)

怎么看这个列表?

  • 第一列的字母 是最重要的。比如 D.V.L. 就表示它是一个支持码的、频的、损压缩的编解码器。
  • 如果同时有 DE,就表示这个格式既能解码(读取),也能编码(生成)。
  • 第二列是编解码器的名字,比如 h264h264_nvencaac。在 FFmpeg 命令里,我们就是用这些名字来指定编解码器的。
  • 第三列是描述,帮助你理解这是什么东西。

2. 只看编码器或解码器

如果列表太长,你也可以只看你想看的部分。

  • 只看支持的编码器 (Encoders):

    bash
    ffmpeg -encoders
  • 只看支持的解码器 (Decoders):

    bash
    ffmpeg -decoders

这会让你找东西更方便。

二、查看硬件加速支持

硬件加速通常分为两个层面:一是 FFmpeg 本身支不支持某种硬件加速技术,二是有没有对应的编解码器能用上这个技术。

第一步:检查 FFmpeg 支持哪些硬件加速技术

这个命令会告诉你,你安装的这个 FFmpeg 版本在编译时都加入了哪些硬件加速功能。

bash
ffmpeg -hwaccels

你可能会看到这样的输出:

Hardware acceleration methods:
vaapi
qsv
cuda
cuvid
d3d11va
videotoolbox

这些名字分别对应不同的技术和厂商:

  • cuda, cuvid, nvenc: 基本都是 NVIDIA 显卡用的。nvenc 主要管编码,cuvid 主要管解码。
  • qsv: Intel 核显的 Quick Sync Video 技术。
  • vaapi, vdpau: Linux 系统下常用的视频加速接口,Intel 和 AMD 显卡都可能用到。
  • d3d11va, dxva2: Windows 系统专用的,基于 DirectX 的加速技术,主要用于解码。
  • videotoolbox: macOS 系统专用的。
  • amf: AMD 显卡用的。

如果这个列表是空的,那就说明你的 FFmpeg 版本不支持任何硬件加速。

第二步:找到与硬件技术对应的编解码器

知道了支持哪种技术,我们就可以去找能用上这个技术的具体编解码器了。这些编解码器通常有个特殊的后缀,比如 _nvenc (NVIDIA编码)、_qsv (Intel编码)、_cuvid (NVIDIA解码)。

我们可以用 grep (Linux/macOS) 或 findstr (Windows) 来快速筛选。

如果你用的是 NVIDIA 显卡:

  • 查找硬件编码器:

    bash
    # Linux 或 macOS
    ffmpeg -encoders | grep nvenc
    # Windows
    ffmpeg -encoders | findstr "nvenc"
    
    # 输出类似
    V....D av1_nvenc            NVIDIA NVENC av1 encoder (codec av1)
    V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
    V....D hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
  • 查找硬件解码器:

    bash
    # Linux 或 macOS
    ffmpeg -decoders | grep cuvid
    # Windows
    ffmpeg -decoders | findstr "cuvid"
    
    # 输出类似
    
     V..... av1_cuvid            Nvidia CUVID AV1 decoder (codec av1)
     V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
     V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
     V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
     V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg
     V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg
     V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
     V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
     V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
     V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)

如果你用的是 Intel 核显:

  • 查找 QSV 相关的编解码器:
    bash
    # Linux 或 macOS
    ffmpeg -codecs | grep qsv
    # Windows
    ffmpeg -codecs | findstr "qsv"
    
    # 输出类似
     DEV.L. av1                  Alliance for Open Media AV1 (decoders: libdav1d libaom-av1 av1 av1_cuvid av1_qsv) (encod
    : libaom-av1 librav1e libsvtav1 av1_nvenc av1_qsv av1_amf av1_vaapi)
     DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_cuvid) (encoders
    ibx264 libx264rgb h264_amf h264_mf h264_nvenc h264_qsv h264_vaapi h264_vulkan)
     DEV.L. hevc                 H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid) (encode
     libx265 hevc_amf hevc_d3d12va hevc_mf hevc_nvenc hevc_qsv hevc_vaapi hevc_vulkan)
     DEVIL. mjpeg                Motion JPEG (decoders: mjpeg mjpeg_cuvid mjpeg_qsv) (encoders: mjpeg mjpeg_qsv mjpeg_vaa
    
     DEV.L. mpeg2video           MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_qsv mpeg2_cuvid) (encoders: mpeg2vide
    peg2_qsv mpeg2_vaapi)
     D.V.L. vc1                  SMPTE VC-1 (decoders: vc1 vc1_qsv vc1_cuvid)
     DEV.L. vp8                  On2 VP8 (decoders: vp8 libvpx vp8_cuvid vp8_qsv) (encoders: libvpx vp8_vaapi)
     DEV.L. vp9                  Google VP9 (decoders: vp9 libvpx-vp9 vp9_cuvid vp9_qsv) (encoders: libvpx-vp9 vp9_vaapi
    _qsv)
     DEV.L. vvc                  H.266 / VVC (Versatile Video Coding) (decoders: vvc vvc_qsv) (encoders: libvvenc)

如果你用的是 macOS:

  • 查找 VideoToolbox 相关的编解码器:
    bash
    # macOS
    ffmpeg -codecs | grep videotoolbox

三、综合实例:一个完整的检查流程

假设你用的是一块 NVIDIA 显卡,想把一个 HEVC (H.265) 格式的视频,用硬件加速转换成 H.264 格式。

1. 检查能否硬解 HEVC:

运行 ffmpeg -decoders | grep cuvid。如果在结果里看到 hevc_cuvid,就说明可以。

V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)

2. 检查能否硬编 H.264:

运行 ffmpeg -encoders | grep nvenc。如果在结果里看到 h264_nvenc,就说明可以。

V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)

3. 使用硬件加速

既然检查下来都支持,那你就可以在 FFmpeg 命令里大胆地使用它们了。一个典型的命令会长这样:

bash
# -hwaccel cuvid               # 全局开启cuvid硬件解码加速
# -c:v hevc_cuvid              # 指定用 hevc_cuvid 解码器来处理输入视频
# -c:v h264_nvenc              # 指定用 h264_nvenc 编码器来生成输出视频
# -c:a copy                    # 音频直接复制,不重新编码

ffmpeg -hwaccel cuvid -c:v hevc_cuvid -i input.mkv -c:v h264_nvenc -c:a copy output.mp4

通过上面这几个简单的命令,你就能对自己电脑上的 FFmpeg 的能力有个全面的了解,也能写出更高效的视频处理命令。