From 379e0bf999db61c8089af871cfa4ef14f76d417c Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 4 Mar 2026 18:05:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(video):=20=E4=BC=98=E5=8C=96=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E7=BC=96=E7=A0=81=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改了 maxrate 参数的处理逻辑,当 maxrate 有效时设置 -b:v 为 maxrate - 调整了 bufsize 计算方式,从 2 倍改为 1 倍 maxrate,适合短视频严格码率控制 - 添加了硬件加速 QSV 编码参数支持 - 修复了 NVENC VBV 模型生效条件判断逻辑 - 更新了 CRF/CQ 模式下的峰值码率限制实现 --- handlers/base.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/handlers/base.py b/handlers/base.py index 6716d3f..1cd9342 100644 --- a/handlers/base.py +++ b/handlers/base.py @@ -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