Files
video_probe/PAUSE_RESUME_FEATURE.md
accusys f3e2d2dca7 Initial implementation of video_probe (Rust)
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
2026-03-07 10:10:19 +08:00

237 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Video YOLO Object Prescan - 暂停与续传功能
## 新增功能
### ✅ 暂停功能 (Ctrl+C)
在处理视频时,随时可以按 `Ctrl+C` 暂停处理:
```bash
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` 文件:
```bash
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: 长视频处理
```bash
# 开始处理 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: 测试不同参数
```bash
# 第一次处理(使用 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: 系统崩溃恢复
```bash
# 处理中系统崩溃或断电
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` 文件包含状态信息:
```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` - 处理完成
## 命令行选项
```bash
# 基本用法
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)
```python
signal.signal(signal.SIGINT, signal_handler)
```
### 帧定位
使用 OpenCV `cv2.CAP_PROP_POS_FRAMES` 精确定位到指定帧:
```python
cap.set(cv2.CAP_PROP_POS_FRAMES, last_frame)
```
### 数据完整性
- 每帧处理完成后立即写入内存
- 每 60 秒自动保存到磁盘
- Ctrl+C 时立即保存当前进度
- 使用 JSON 格式,易于检查和恢复
## 性能影响
- **内存**: 略有增加(保存所有已处理帧的数据)
- **磁盘 I/O**: 每 60 秒一次写入
- **CPU**: 无额外开销
- **恢复速度**: < 1 秒(仅加载 JSON 文件)
## 注意事项
1. **磁盘空间**: `.yolo.json` 文件会随处理进度增长,确保有足够空间
2. **不要修改 JSON**: 手动编辑可能导致数据损坏
3. **模型一致性**: 续传时使用相同的 YOLO 模型
4. **视频不变**: 续传时视频文件不能改变
## 故障排除
### Q: 提示 "Could not load existing file"
A: JSON 文件可能损坏,删除后重新开始:
```bash
rm video.yolo.json
python3 video_yolo_object_prescan.py video.mp4 yolov8n.pt
```
### Q: 想从头开始处理
A: 删除现有 JSON 文件或在提示时选择 `n`
```bash
# 方法 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 计算
**改进**:
- 更友好的用户提示
- 详细的保存信息
- 自动恢复功能