强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

FFmpeg 多媒体处理教程 / 硬件加速

硬件加速

概述

硬件加速(Hardware Acceleration)利用 GPU 或专用硬件进行视频编解码,相比 CPU 编码可大幅提升处理速度。FFmpeg 支持多种硬件加速方案,包括 NVIDIA NVENC、Intel QSV、AMD VAAPI 等。

硬件加速原理

CPU vs GPU 编码

方面 CPU 编码 GPU 编码
速度 较慢 极快
质量 较高 略低
功耗
并行度 有限 极高
压缩效率
适用场景 质量优先 速度优先

硬件加速类型

类型 说明 厂商
NVENC NVIDIA 编码器 NVIDIA
NVDEC NVIDIA 解码器 NVIDIA
QSV Quick Sync Video Intel
VAAPI Video Acceleration API AMD/Intel
VideoToolbox Apple 硬件加速 Apple
RKMPP Rockchip MPP Rockchip
V4L2 M2M Video4Linux2 Memory-to-Memory 通用
MediaCodec Android MediaCodec Google

NVIDIA 硬件加速

NVENC 编码器

NVENC 是 NVIDIA 的硬件编码器,支持 H.264、H.265、AV1 编码。

基本使用

# H.264 编码
ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4

# H.265 编码
ffmpeg -i input.mp4 -c:v hevc_nvenc output.mp4

# AV1 编码(RTX 40 系列)
ffmpeg -i input.mp4 -c:v av1_nvenc output.mp4

NVENC 参数

参数 说明 推荐值
-preset 编码预设 medium
-tune 调优参数 hq
-rc 码率控制 vbr
-cq 恒定质量 23
-b:v 视频码率 根据需求
-maxrate 最大码率 与 b:v 相同
-bufsize 缓冲区大小 2× maxrate
-profile:v 配置 high
-level 级别 4.1
-gpu GPU 索引 0

编码预设

预设 速度 质量 说明
p1 最快 最低 超高速
p2 很快 很低 高速
p3 快速
p4 中等
p5 较慢 较高 较慢
p6 慢速
p7 最慢 最高 最高质量

码率控制模式

模式 说明 适用场景
constqp 恒定 QP 测试
vbr 可变码率 通用
cbr 恒定码率 流媒体
cbr_hq 高质量 CBR 高质量流媒体
cbr_ld_hq 低延迟 CBR 实时通信
vbr_hq 高质量 VBR 高质量通用

完整示例

# 高质量编码
ffmpeg -i input.mp4 \
    -c:v h264_nvenc \
    -preset p5 \
    -tune hq \
    -rc vbr \
    -cq 23 \
    -b:v 5M \
    -maxrate 5M \
    -bufsize 10M \
    -profile:v high \
    -level 4.1 \
    output.mp4

# 快速编码
ffmpeg -i input.mp4 \
    -c:v h264_nvenc \
    -preset p1 \
    -tune ll \
    -rc cbr \
    -b:v 2M \
    output.mp4

# H.265 高质量编码
ffmpeg -i input.mp4 \
    -c:v hevc_nvenc \
    -preset p5 \
    -tune hq \
    -rc vbr \
    -cq 28 \
    -b:v 3M \
    -tag:v hvc1 \
    output.mp4

NVDEC 解码器

# 使用 NVDEC 解码
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc output.mp4

# 指定 GPU
ffmpeg -hwaccel cuda -hwaccel_device 0 -i input.mp4 -c:v h264_nvenc output.mp4

# 硬件解码 + 软件编码
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v libx264 output.mp4

CUDA 滤镜

# 使用 CUDA 缩放
ffmpeg -hwaccel cuda -i input.mp4 -vf "scale_cuda=1280:720" -c:v h264_nvenc output.mp4

# 使用 CUDA 去噪
ffmpeg -hwaccel cuda -i input.mp4 -vf "nlmeans_cuda=7" -c:v h264_nvenc output.mp4

# CUDA 格式转换
ffmpeg -hwaccel cuda -i input.mp4 -vf "hwdownload,format=nv12" -c:v libx264 output.mp4

Intel QSV

QSV 编码器

QSV(Quick Sync Video)是 Intel 的硬件编解码技术。

基本使用

# H.264 编码
ffmpeg -i input.mp4 -c:v h264_qsv output.mp4

# H.265 编码
ffmpeg -i input.mp4 -c:v hevc_qsv output.mp4

# AV1 编码(Arc GPU)
ffmpeg -i input.mp4 -c:v av1_qsv output.mp4

QSV 参数

参数 说明 推荐值
-preset 编码预设 medium
-look_ahead 前瞻编码 1
-look_ahead_depth 前瞻深度 40
-b:v 视频码率 根据需求
-maxrate 最大码率 与 b:v 相同
-bufsize 缓冲区大小 2× maxrate
-profile:v 配置 high
-level 级别 4.1

编码预设

预设 速度 质量 说明
veryfast 最快 最低 实时
faster 很快 很低 高速
fast 快速
medium 默认
slow 高质量
slower 很慢 很高 更高质量
veryslow 最慢 最高 最高质量

完整示例

# 高质量编码
ffmpeg -i input.mp4 \
    -c:v h264_qsv \
    -preset medium \
    -look_ahead 1 \
    -look_ahead_depth 40 \
    -b:v 5M \
    -maxrate 5M \
    -bufsize 10M \
    -profile:v high \
    -level 4.1 \
    output.mp4

# 快速编码
ffmpeg -i input.mp4 \
    -c:v h264_qsv \
    -preset veryfast \
    -b:v 2M \
    output.mp4

# H.265 编码
ffmpeg -i input.mp4 \
    -c:v hevc_qsv \
    -preset medium \
    -b:v 3M \
    -tag:v hvc1 \
    output.mp4

QSV 解码器

# 使用 QSV 解码
ffmpeg -hwaccel qsv -i input.mp4 -c:v h264_qsv output.mp4

# 指定设备
ffmpeg -hwaccel qsv -hwaccel_device /dev/dri/renderD128 -i input.mp4 -c:v h264_qsv output.mp4

# 硬件解码 + 软件编码
ffmpeg -hwaccel qsv -i input.mp4 -c:v libx264 output.mp4

QSV 滤镜

# 使用 QSV 缩放
ffmpeg -hwaccel qsv -i input.mp4 -vf "scale_qsv=1280:720" -c:v h264_qsv output.mp4

# 使用 QSV 去噪
ffmpeg -hwaccel qsv -i input.mp4 -vf "vpp_qsv=denoise=25" -c:v h264_qsv output.mp4

AMD VAAPI

VAAPI 编码器

VAAPI(Video Acceleration API)是 AMD/Intel 的硬件加速接口。

基本使用

# H.264 编码
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf "format=nv12,hwupload" -c:v h264_vaapi output.mp4

# H.265 编码
ffmpeg -vaapi_device /dev/dri/renderD128 -i input.mp4 -vf "format=nv12,hwupload" -c:v hevc_vaapi output.mp4

VAAPI 参数

参数 说明 推荐值
-qp 量化参数 23
-b:v 视频码率 根据需求
-maxrate 最大码率 与 b:v 相同
-bufsize 缓冲区大小 2× maxrate
-profile:v 配置 high
-level 级别 4.1

完整示例

# 高质量编码
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -i input.mp4 \
    -vf "format=nv12,hwupload" \
    -c:v h264_vaapi \
    -qp 23 \
    -profile:v high \
    -level 4.1 \
    output.mp4

# 指定码率
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -i input.mp4 \
    -vf "format=nv12,hwupload" \
    -c:v h264_vaapi \
    -b:v 5M \
    -maxrate 5M \
    -bufsize 10M \
    output.mp4

# H.265 编码
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -i input.mp4 \
    -vf "format=nv12,hwupload" \
    -c:v hevc_vaapi \
    -qp 28 \
    -tag:v hvc1 \
    output.mp4

VAAPI 解码器

# 使用 VAAPI 解码
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i input.mp4 -c:v h264_vaapi output.mp4

# 硬件解码 + 硬件编码
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi \
    -i input.mp4 -c:v h264_vaapi output.mp4

VAAPI 滤镜

# 使用 VAAPI 缩放
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -i input.mp4 \
    -vf "format=nv12,hwupload,scale_vaapi=1280:720,hwdownload,format=nv12" \
    -c:v libx264 output.mp4

# 使用 VAAPI 去噪
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -i input.mp4 \
    -vf "format=nv12,hwupload,vpp_vaapi=n=denoise:mode=auto,hwdownload,format=nv12" \
    -c:v libx264 output.mp4

Apple VideoToolbox

VideoToolbox 编码器

VideoToolbox 是 Apple 的硬件加速框架。

基本使用

# H.264 编码
ffmpeg -i input.mp4 -c:v h264_videotoolbox output.mp4

# H.265 编码
ffmpeg -i input.mp4 -c:v hevc_videotoolbox output.mp4

VideoToolbox 参数

参数 说明 推荐值
-b:v 视频码率 根据需求
-maxrate 最大码率 与 b:v 相同
-profile:v 配置 high
-level 级别 4.1
-q:v 质量 (1-100) 70

完整示例

# H.264 编码
ffmpeg -i input.mp4 \
    -c:v h264_videotoolbox \
    -b:v 5M \
    -maxrate 5M \
    -profile:v high \
    -level 4.1 \
    output.mp4

# H.265 编码
ffmpeg -i input.mp4 \
    -c:v hevc_videotoolbox \
    -b:v 3M \
    -maxrate 3M \
    -tag:v hvc1 \
    output.mp4

# 恒定质量模式
ffmpeg -i input.mp4 \
    -c:v h264_videotoolbox \
    -q:v 70 \
    output.mp4

VideoToolbox 解码器

# 使用 VideoToolbox 解码
ffmpeg -hwaccel videotoolbox -i input.mp4 -c:v h264_videotoolbox output.mp4

Rockchip RKMPP

RKMPP 编码器

RKMPP 是 Rockchip 平台的硬件编解码方案。

基本使用

# H.264 编码
ffmpeg -i input.mp4 -c:v h264_rkmpp output.mp4

# H.265 编码
ffmpeg -i input.mp4 -c:v hevc_rkmpp output.mp4

RKMPP 参数

参数 说明 推荐值
-b:v 视频码率 根据需求
-profile:v 配置 high
-level 级别 4.1

硬件加速检测

检测可用加速器

# 查看支持的硬件加速器
ffmpeg -hwaccels

# 查看设备信息
ffmpeg -hide_banner -f lavfi -i nullsrc -hwaccel cuda -c:v h264_nvenc -f null - 2>&1 | head -20

检测编解码器

# 查看 NVENC 编码器
ffmpeg -encoders 2>/dev/null | grep nvenc

# 查看 QSV 编码器
ffmpeg -encoders 2>/dev/null | grep qsv

# 查看 VAAPI 编码器
ffmpeg -encoders 2>/dev/null | grep vaapi

# 查看 VideoToolbox 编码器
ffmpeg -encoders 2>/dev/null | grep videotoolbox

检测 GPU 信息

# NVIDIA GPU 信息
nvidia-smi

# Intel GPU 信息
vainfo

# 查看 DRI 设备
ls -la /dev/dri/

硬件加速最佳实践

NVIDIA 最佳实践

# 高质量编码
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
    -i input.mp4 \
    -c:v h264_nvenc \
    -preset p5 \
    -tune hq \
    -rc vbr \
    -cq 23 \
    -b:v 5M \
    -maxrate 5M \
    -bufsize 10M \
    -profile:v high \
    output.mp4

# 快速编码(直播)
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
    -i input.mp4 \
    -c:v h264_nvenc \
    -preset p1 \
    -tune ll \
    -rc cbr \
    -b:v 2M \
    -bufsize 4M \
    output.mp4

Intel QSV 最佳实践

# 高质量编码
ffmpeg -hwaccel qsv \
    -i input.mp4 \
    -c:v h264_qsv \
    -preset medium \
    -look_ahead 1 \
    -look_ahead_depth 40 \
    -b:v 5M \
    -maxrate 5M \
    -bufsize 10M \
    -profile:v high \
    output.mp4

# 快速编码
ffmpeg -hwaccel qsv \
    -i input.mp4 \
    -c:v h264_qsv \
    -preset veryfast \
    -b:v 2M \
    output.mp4

VAAPI 最佳实践

# 高质量编码
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -hwaccel vaapi -hwaccel_output_format vaapi \
    -i input.mp4 \
    -c:v h264_vaapi \
    -qp 23 \
    -profile:v high \
    output.mp4

# 带滤镜的编码
ffmpeg -vaapi_device /dev/dri/renderD128 \
    -hwaccel vaapi -hwaccel_output_format vaapi \
    -i input.mp4 \
    -vf "scale_vaapi=1280:720" \
    -c:v h264_vaapi \
    -qp 23 \
    output.mp4

性能对比

编码速度对比

编码器 1080p 速度 4K 速度 相对速度
libx264 30fps 8fps 1x
h264_nvenc 200fps 60fps 6-7x
h264_qsv 150fps 45fps 5-6x
h264_vaapi 120fps 35fps 4-5x
h264_videotoolbox 180fps 55fps 6x

质量对比

编码器 PSNR (dB) SSIM 说明
libx264 38.5 0.96 参考
h264_nvenc 37.2 0.94 略低
h264_qsv 37.5 0.95 略低
h264_vaapi 37.0 0.94 略低

常见问题

问题 1:找不到硬件加速器

# 检查硬件加速支持
ffmpeg -hwaccels

# 检查驱动
# NVIDIA
nvidia-smi

# Intel/AMD
vainfo

问题 2:设备权限问题

# 检查设备权限
ls -la /dev/dri/

# 添加用户到 video 组
sudo usermod -aG video $USER

# 重新登录

问题 3:NVENC 会话数限制

# 检查 NVENC 会话限制
nvidia-smi -q | grep "Encoder Sessions"

# 消费级 GPU 通常限制为 3 个会话
# 可以使用破解驱动解除限制

注意事项

  1. 驱动版本:确保使用最新版本的 GPU 驱动
  2. 硬件要求:不同编码器对硬件有最低要求
  3. 会话限制:消费级 GPU 可能有编码会话数限制
  4. 质量差异:硬件编码质量通常略低于 CPU 编码
  5. 格式支持:某些硬件编码器可能不支持所有编码参数

业务场景

场景 1:直播推流

# NVIDIA 低延迟推流
ffmpeg -re -i input.mp4 \
    -hwaccel cuda -hwaccel_output_format cuda \
    -c:v h264_nvenc \
    -preset p1 \
    -tune ll \
    -rc cbr \
    -b:v 3M \
    -bufsize 6M \
    -c:a aac \
    -f flv rtmp://server/live/stream

场景 2:批量视频处理

#!/bin/bash
# batch_hw_encode.sh

INPUT_DIR=$1
OUTPUT_DIR=${2:-output}

mkdir -p "$OUTPUT_DIR"

for file in "$INPUT_DIR"/*.mp4; do
    filename=$(basename "$file")
    output="$OUTPUT_DIR/$filename"
    
    ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
        -i "$file" \
        -c:v h264_nvenc \
        -preset medium \
        -b:v 3M \
        -c:a aac \
        "$output"
done

场景 3:4K 视频处理

# 4K 高质量编码
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \
    -i input_4k.mp4 \
    -c:v hevc_nvenc \
    -preset p5 \
    -tune hq \
    -rc vbr \
    -cq 26 \
    -b:v 15M \
    -maxrate 15M \
    -bufsize 30M \
    -tag:v hvc1 \
    output_4k.mp4

扩展阅读

  1. NVIDIA Video Codec SDK
  2. Intel Media SDK
  3. VAAPI 文档
  4. VideoToolbox 文档
  5. FFmpeg 硬件加速文档

总结

本章介绍了 FFmpeg 的硬件加速技术,包括:

  • NVIDIA NVENC/NVDEC
  • Intel QSV
  • AMD VAAPI
  • Apple VideoToolbox
  • Rockchip RKMPP

掌握硬件加速技术可以大幅提升视频处理效率,特别适合批量处理和实时应用场景。