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