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

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

硬件加速

概述

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

硬件加速原理

CPU vs GPU 编码

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

硬件加速类型

类型说明厂商
NVENCNVIDIA 编码器NVIDIA
NVDECNVIDIA 解码器NVIDIA
QSVQuick Sync VideoIntel
VAAPIVideo Acceleration APIAMD/Intel
VideoToolboxApple 硬件加速Apple
RKMPPRockchip MPPRockchip
V4L2 M2MVideo4Linux2 Memory-to-Memory通用
MediaCodecAndroid MediaCodecGoogle

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
-gpuGPU 索引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 速度相对速度
libx26430fps8fps1x
h264_nvenc200fps60fps6-7x
h264_qsv150fps45fps5-6x
h264_vaapi120fps35fps4-5x
h264_videotoolbox180fps55fps6x

质量对比

编码器PSNR (dB)SSIM说明
libx26438.50.96参考
h264_nvenc37.20.94略低
h264_qsv37.50.95略低
h264_vaapi37.00.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

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