Core modules: - probe.rs: ffprobe execution logic - parser.rs: JSON parsing logic - output.rs: Output formatting - lib.rs: Library interface - main.rs: CLI entry point Features: - Extract video metadata using ffprobe - Parse video/audio/subtitle streams - Save to JSON file - Console summary output Documentation: - Added QUICKSTART.md - Added ENVIRONMENT_SETUP_REPORT.md
5.5 KiB
5.5 KiB
Video YOLO Object Prescan - 暂停与续传功能
新增功能
✅ 暂停功能 (Ctrl+C)
在处理视频时,随时可以按 Ctrl+C 暂停处理:
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
# 处理中...
# Progress: 1500/3615 frames (41.5%) - 3 objects - Elapsed: 75.2s, ETA: 105.8s
# 按 Ctrl+C 暂停
^C
============================================================
⏸ PAUSED - Saving progress...
============================================================
✓ Progress saved to: video.yolo.json
Frames processed: 1500/3615
Total detections: 4500
Elapsed time: 75.2s
💡 Run the same command again to resume from frame 1501
============================================================
✅ 断点续传
下次运行相同命令时,会自动检测已存在的 .yolo.json 文件:
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
============================================================
📂 Found existing data: video.yolo.json
Last processed frame: 1500
============================================================
Resume from last checkpoint? (Y/n): y
Resuming from checkpoint...
Loading YOLO model from: yolov8n.pt
✓ Model loaded successfully
Video Info:
Path: video.mp4
Resolution: 1920x1080
FPS: 30.00
Total frames: 3615
Duration: 120.5s (00:02:00)
Resume from: frame 1501
Output: video.yolo.json
============================================================
Resuming video processing...
💡 Press Ctrl+C to pause and save progress
Progress: 1600/3615 frames (44.3%) - 2 objects - Elapsed: 5.1s, ETA: 102.3s
...
✅ 自动保存
处理过程中每 60 秒自动保存一次进度,防止意外中断导致数据丢失。
使用场景
场景 1: 长视频处理
# 开始处理 2 小时视频
python3 video_yolo_object_prescan.py long_video.mp4 yolov8n.pt
# 处理 1 小时后需要关机
# 按 Ctrl+C 暂停并保存
# 第二天继续
python3 video_yolo_object_prescan.py long_video.mp4 yolov8n.pt
# 选择 Y 继续处理
场景 2: 测试不同参数
# 第一次处理(使用 yolov8n)
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
# 处理到一半,想测试 yolov8s
# 按 Ctrl+C 暂停
# 删除或重命名 .yolo.json
mv video.yolo.json video.yolov8n.json
# 使用新模型重新处理
python3 video_yolo_object_prescan.py video.mp4 yolov8s.pt
场景 3: 系统崩溃恢复
# 处理中系统崩溃或断电
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
# ... 系统崩溃 ...
# 重启后继续(自动保存了最后 60 秒内的进度)
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
# 选择 Y 从上次保存的帧继续
JSON 文件格式
.yolo.json 文件包含状态信息:
{
"metadata": {
"video_path": "/path/to/video.mp4",
"total_frames": 3615,
"processed_at": "2026-03-06T12:00:00",
"last_saved_at": "2026-03-06T12:30:00",
"status": "interrupted", // 或 "completed"
"processing_time": 1800.5,
"total_detections": 7230
},
"frames": {
"1": { ... },
"2": { ... },
...
"1500": { ... } // 最后处理的帧
}
}
状态字段:
in_progress- 正在处理中interrupted- 用户中断(Ctrl+C)completed- 处理完成
命令行选项
# 基本用法
python3 video_yolo_object_prescan.py <video_path> <yolo_model>
# 示例
python3 video_yolo_object_prescan.py my_video.mp4 yolov8n.pt
# 从头开始(忽略现有文件)
python3 video_yolo_object_prescan.py my_video.mp4 yolov8n.pt
# 当提示 "Resume from last checkpoint?" 时输入 n
技术细节
信号处理
使用 Python signal 模块捕获 SIGINT (Ctrl+C):
signal.signal(signal.SIGINT, signal_handler)
帧定位
使用 OpenCV cv2.CAP_PROP_POS_FRAMES 精确定位到指定帧:
cap.set(cv2.CAP_PROP_POS_FRAMES, last_frame)
数据完整性
- 每帧处理完成后立即写入内存
- 每 60 秒自动保存到磁盘
- Ctrl+C 时立即保存当前进度
- 使用 JSON 格式,易于检查和恢复
性能影响
- 内存: 略有增加(保存所有已处理帧的数据)
- 磁盘 I/O: 每 60 秒一次写入
- CPU: 无额外开销
- 恢复速度: < 1 秒(仅加载 JSON 文件)
注意事项
- 磁盘空间:
.yolo.json文件会随处理进度增长,确保有足够空间 - 不要修改 JSON: 手动编辑可能导致数据损坏
- 模型一致性: 续传时使用相同的 YOLO 模型
- 视频不变: 续传时视频文件不能改变
故障排除
Q: 提示 "Could not load existing file"
A: JSON 文件可能损坏,删除后重新开始:
rm video.yolo.json
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
Q: 想从头开始处理
A: 删除现有 JSON 文件或在提示时选择 n:
# 方法 1: 删除文件
rm video.yolo.json
# 方法 2: 运行时选择 n
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
# Resume from last checkpoint? (Y/n): n
Q: 处理速度变慢
A: JSON 文件过大导致保存变慢,这是正常现象。建议:
- 使用更快的存储设备(SSD)
- 分段处理超长视频
更新日志
v2.0.0 (2026-03-06)
新增功能:
- ✅ Ctrl+C 暂停并保存进度
- ✅ 断点续传(自动检测并询问)
- ✅ 每 60 秒自动保存
- ✅ 状态字段记录(in_progress/interrupted/completed)
- ✅ 改进的进度显示和 ETA 计算
改进:
- 更友好的用户提示
- 详细的保存信息
- 自动恢复功能