fix: 帧文件按帧号数值排序,修复超 9999 帧字典序错位
- frame-extract 新增 _sorted_frame_files:ffmpeg %04d 编号超过 9999 帧后扩为 5 位,sorted() 字典序会把 5 位编号排在 4 位之前,导致 frames.json 时间与 图像错位(真实发生于 run_339ec7ee437f 的 14236 帧任务) - subtitle-ocr 提取 _merge_kept 供重组装复用 - 回归测试用真实任务留存数据(testdata/frames_boundary/),并新增真实 OCR 数据按正确时间轴重组装为 SRT 的集成测试(test_integration_reassemble_ocr)
This commit is contained in:
@@ -305,6 +305,26 @@ def test_frame_extract_one_second_exact_frames(tmp_path) -> None:
|
||||
assert len(manifest) == 10
|
||||
|
||||
|
||||
def test_frame_files_read_order_matches_frame_number(tmp_path) -> None:
|
||||
"""真实任务留存数据:帧文件按帧号数值排序读取,而非字典序。
|
||||
|
||||
回归用例:ffmpeg 的 %04d 编号在超过 9999 帧后自动扩为 5 位
|
||||
(frame_10000.png 等),此时 sorted() 默认字典序会把 5 位编号排在
|
||||
4 位编号之前(如 frame_10009 < frame_1009),导致帧号回退、manifest
|
||||
时间与图像错位。testdata/frames_boundary/ 是 2026-08 真实任务
|
||||
run_339ec7ee437f(14236 帧 / 2 小时视频)中跨越该边界的真实帧文件。
|
||||
"""
|
||||
from nodes.frame_extract import _sorted_frame_files
|
||||
|
||||
boundary = TESTDATA / "frames_boundary"
|
||||
files = _sorted_frame_files(boundary)
|
||||
# 从文件名解析帧号:读取顺序必须等于帧号数值递增序(无回退)。
|
||||
nums = [int(p.stem.split("_", 1)[1]) for p in files]
|
||||
assert nums == sorted(nums)
|
||||
# 边界关键对:5 位编号必须排在 4 位编号之后,禁止字典序错位。
|
||||
assert nums.index(10000) > nums.index(9999)
|
||||
assert nums.index(10009) > nums.index(1009)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# subtitle-ocr:OCR 循环 + 长度上限 + 合并 + SRT 组装
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user