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