You've already forked FrameTour-RenderWorker
fix(video): 优化视频编码参数配置
- 修改了 maxrate 参数的处理逻辑,当 maxrate 有效时设置 -b:v 为 maxrate - 调整了 bufsize 计算方式,从 2 倍改为 1 倍 maxrate,适合短视频严格码率控制 - 添加了硬件加速 QSV 编码参数支持 - 修复了 NVENC VBV 模型生效条件判断逻辑 - 更新了 CRF/CQ 模式下的峰值码率限制实现
This commit is contained in:
@@ -49,11 +49,14 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
|
|||||||
Args:
|
Args:
|
||||||
hw_accel: 硬件加速类型 (none, qsv, cuda)
|
hw_accel: 硬件加速类型 (none, qsv, cuda)
|
||||||
maxrate: 最大码率(bps),用于限制 CRF/CQ 模式的峰值码率。
|
maxrate: 最大码率(bps),用于限制 CRF/CQ 模式的峰值码率。
|
||||||
例如 4000000 表示 4Mbps。bufsize 自动设为 maxrate 的 2 倍。
|
例如 4000000 表示 4Mbps。
|
||||||
|
bufsize 设为 1x maxrate(1 秒窗口),适合短视频(<10s)的严格码率控制。
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
FFmpeg 视频编码参数列表
|
FFmpeg 视频编码参数列表
|
||||||
"""
|
"""
|
||||||
|
has_maxrate = maxrate is not None and maxrate > 0
|
||||||
|
|
||||||
if hw_accel == HW_ACCEL_QSV:
|
if hw_accel == HW_ACCEL_QSV:
|
||||||
params = VIDEO_ENCODE_PARAMS_QSV
|
params = VIDEO_ENCODE_PARAMS_QSV
|
||||||
args = [
|
args = [
|
||||||
@@ -75,7 +78,9 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
|
|||||||
'-level', params['level'],
|
'-level', params['level'],
|
||||||
'-rc', params['rc'],
|
'-rc', params['rc'],
|
||||||
'-cq', params['cq'],
|
'-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 回退
|
# 禁用 B 帧,避免独立 TS 分片在 HLS 边界出现 PTS/DTS 回退
|
||||||
'-bf', '0',
|
'-bf', '0',
|
||||||
]
|
]
|
||||||
@@ -94,9 +99,10 @@ def get_video_encode_args(hw_accel: str = HW_ACCEL_NONE, maxrate: Optional[int]
|
|||||||
]
|
]
|
||||||
|
|
||||||
# CRF/CQ + maxrate 上限:保留质量控制的同时限制峰值码率
|
# CRF/CQ + maxrate 上限:保留质量控制的同时限制峰值码率
|
||||||
if maxrate and maxrate > 0:
|
# bufsize = 1x maxrate(1 秒窗口),对短视频 VBV 约束更紧,避免缓冲区过大导致码率失控
|
||||||
|
if has_maxrate:
|
||||||
maxrate_k = f'{maxrate // 1000}k'
|
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])
|
args.extend(['-maxrate', maxrate_k, '-bufsize', bufsize_k])
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|||||||
Reference in New Issue
Block a user