结论
capswriter_client.py 的 _transcription_deadline(:254-260 附近)对 media_duration 只拒绝负数(media_duration < 0),0 与偏小时长被接受,预算公式给出 0*4+120 = 120 秒。直播录制容器(FLV/TS 流式封装)的头部 duration 为 0 或明显偏小是常见现象——届时一个在 SDK 自动预算下本可成功的任务,会被确定性提前掐断,且只有一行 WARNING,无用户可见差异。紧邻本仓 P1 红线「静默出错」。
证据
_transcription_deadline 判据:media_duration is None or not isfinite or media_duration < 0 → fallback;0 直通。
_finite_time_or_none(:424)对 0 也返回 0 而非 None,不构成兜底。
- 对照:SDK
_auto_budget docstring 明确写「时长为 0 或短音频时仍不低于 120 秒」——SDK 是刻意保底,本仓显式路径反而把 0 当真。
修法(一行 + 一条测试)
media_duration < 0 改 media_duration <= 0(或加合理下限如 1 秒),退化输入按 unknown 走 fallback=sdk_auto,与修复前行为一致。补一条 duration=0 → 返回 None 的单测。
边界
结论
capswriter_client.py的_transcription_deadline(:254-260附近)对media_duration只拒绝负数(media_duration < 0),0 与偏小时长被接受,预算公式给出0*4+120 = 120秒。直播录制容器(FLV/TS 流式封装)的头部 duration 为 0 或明显偏小是常见现象——届时一个在 SDK 自动预算下本可成功的任务,会被确定性提前掐断,且只有一行 WARNING,无用户可见差异。紧邻本仓 P1 红线「静默出错」。证据
_transcription_deadline判据:media_duration is None or not isfinite or media_duration < 0 → fallback;0 直通。_finite_time_or_none(:424)对 0 也返回 0 而非 None,不构成兜底。_auto_budgetdocstring 明确写「时长为 0 或短音频时仍不低于 120 秒」——SDK 是刻意保底,本仓显式路径反而把 0 当真。修法(一行 + 一条测试)
media_duration < 0改media_duration <= 0(或加合理下限如 1 秒),退化输入按 unknown 走fallback=sdk_auto,与修复前行为一致。补一条duration=0 → 返回 None的单测。边界
<= 0防御本身无害(合法媒体时长不会是 0),不依赖该核实即可落地。