feat(video): 添加硬件加速支持

- 定义硬件加速类型常量(none、qsv、cuda)
- 配置QSV和CUDA编码参数及预设
- 在WorkerConfig中添加硬件加速配置选项
- 实现基于硬件加速类型的编码参数动态获取
- 添加FFmpeg硬件加速解码和滤镜参数
- 检测并报告系统硬件加速支持信息
- 在API客户端中上报硬件加速配置和支持状态
This commit is contained in:
2026-01-13 13:34:27 +08:00
parent a26c44a3cd
commit 71bd2e59f9
7 changed files with 364 additions and 22 deletions

View File

@@ -10,7 +10,7 @@ import os
import logging
from typing import List, Optional, Tuple
from handlers.base import BaseHandler, VIDEO_ENCODE_ARGS
from handlers.base import BaseHandler
from domain.task import Task, TaskType, RenderSpec, OutputSpec, Effect
from domain.result import TaskResult, ErrorCode
@@ -170,6 +170,11 @@ class RenderSegmentVideoHandler(BaseHandler):
"""
cmd = ['ffmpeg', '-y', '-hide_banner']
# 硬件加速解码参数(在输入文件之前)
hwaccel_args = self.get_hwaccel_decode_args()
if hwaccel_args:
cmd.extend(hwaccel_args)
# 输入文件
cmd.extend(['-i', input_file])
@@ -196,8 +201,8 @@ class RenderSegmentVideoHandler(BaseHandler):
elif filters:
cmd.extend(['-vf', filters])
# 编码参数(v2 统一参数
cmd.extend(VIDEO_ENCODE_ARGS)
# 编码参数(根据硬件加速配置动态获取
cmd.extend(self.get_video_encode_args())
# 帧率
fps = output_spec.fps
@@ -253,6 +258,12 @@ class RenderSegmentVideoHandler(BaseHandler):
effects = render_spec.get_effects()
has_camera_shot = any(e.effect_type == 'cameraShot' for e in effects)
# 硬件加速时需要先 hwdownload(将 GPU 表面下载到系统内存)
hwaccel_prefix = self.get_hwaccel_filter_prefix()
if hwaccel_prefix:
# 去掉末尾的逗号,作为第一个滤镜
filters.append(hwaccel_prefix.rstrip(','))
# 1. 变速处理
speed = float(render_spec.speed) if render_spec.speed else 1.0
if speed != 1.0 and speed > 0:
@@ -304,7 +315,8 @@ class RenderSegmentVideoHandler(BaseHandler):
fps=fps,
has_overlay=has_overlay,
overlap_head_ms=overlap_head_ms,
overlap_tail_ms=overlap_tail_ms
overlap_tail_ms=overlap_tail_ms,
use_hwdownload=bool(hwaccel_prefix)
)
# 6. 帧冻结(tpad)- 用于转场 overlap 区域
@@ -337,7 +349,8 @@ class RenderSegmentVideoHandler(BaseHandler):
fps: int,
has_overlay: bool = False,
overlap_head_ms: int = 0,
overlap_tail_ms: int = 0
overlap_tail_ms: int = 0,
use_hwdownload: bool = False
) -> str:
"""
构建包含特效的 filter_complex 滤镜图
@@ -351,6 +364,7 @@ class RenderSegmentVideoHandler(BaseHandler):
has_overlay: 是否有叠加层
overlap_head_ms: 头部 overlap 时长
overlap_tail_ms: 尾部 overlap 时长
use_hwdownload: 是否使用了硬件加速解码(已在 base_filters 中包含 hwdownload)
Returns:
filter_complex 格式的滤镜字符串