fix(video): 优化视频编码参数配置

- 修改了 maxrate 参数的处理逻辑,当 maxrate 有效时设置 -b:v 为 maxrate
- 调整了 bufsize 计算方式,从 2 倍改为 1 倍 maxrate,适合短视频严格码率控制
- 添加了硬件加速 QSV 编码参数支持
- 修复了 NVENC VBV 模型生效条件判断逻辑
- 更新了 CRF/CQ 模式下的峰值码率限制实现
This commit is contained in:
2026-03-04 18:05:00 +08:00
parent d54e6e948f
commit 379e0bf999

View File

@@ -49,11 +49,14 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
Args:
hw_accel: 硬件加速类型 (none, qsv, cuda)
maxrate: 最大码率(bps),用于限制 CRF/CQ 模式的峰值码率。
例如 4000000 表示 4Mbps。bufsize 自动设为 maxrate 的 2 倍。
例如 4000000 表示 4Mbps。
bufsize 设为 1x maxrate(1 秒窗口),适合短视频(<10s)的严格码率控制。
Returns:
FFmpeg 视频编码参数列表
"""
has_maxrate = maxrate is not None and maxrate > 0
if hw_accel == HW_ACCEL_QSV:
params = VIDEO_ENCODE_PARAMS_QSV
args = [
@@ -75,7 +78,9 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
'-level', params['level'],
'-rc', params['rc'],
'-cq', params['cq'],
'-b:v', '0', # 配合 vbr 模式使用 cq
# 有 maxrate 时设置 -b:v 为 maxrate,让 NVENC VBV 模型真正生效;
# 无 maxrate 时保持 -b:v 0(纯 CQ 质量模式)
'-b:v', f'{maxrate // 1000}k' if has_maxrate else '0',
# 禁用 B 帧,避免独立 TS 分片在 HLS 边界出现 PTS/DTS 回退
'-bf', '0',
]
@@ -94,9 +99,10 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
]
# CRF/CQ + maxrate 上限:保留质量控制的同时限制峰值码率
if maxrate and maxrate > 0:
# bufsize = 1x maxrate(1 秒窗口),对短视频 VBV 约束更紧,避免缓冲区过大导致码率失控
if has_maxrate:
maxrate_k = f'{maxrate // 1000}k'
bufsize_k = f'{maxrate * 2 // 1000}k'
bufsize_k = maxrate_k # 1x maxrate,短视频下收敛更快
args.extend(['-maxrate', maxrate_k, '-bufsize', bufsize_k])
return args