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
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
| 参数 |
说明 |
推荐值 |
-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 解码
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 个会话
# 可以使用破解驱动解除限制
注意事项
- 驱动版本:确保使用最新版本的 GPU 驱动
- 硬件要求:不同编码器对硬件有最低要求
- 会话限制:消费级 GPU 可能有编码会话数限制
- 质量差异:硬件编码质量通常略低于 CPU 编码
- 格式支持:某些硬件编码器可能不支持所有编码参数
业务场景
场景 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
扩展阅读
- NVIDIA Video Codec SDK
- Intel Media SDK
- VAAPI 文档
- VideoToolbox 文档
- FFmpeg 硬件加速文档
总结
本章介绍了 FFmpeg 的硬件加速技术,包括:
- NVIDIA NVENC/NVDEC
- Intel QSV
- AMD VAAPI
- Apple VideoToolbox
- Rockchip RKMPP
掌握硬件加速技术可以大幅提升视频处理效率,特别适合批量处理和实时应用场景。