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
237 lines
5.5 KiB
Markdown
237 lines
5.5 KiB
Markdown
# 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 计算
|
||
|
||
**改进**:
|
||
- 更友好的用户提示
|
||
- 详细的保存信息
|
||
- 自动恢复功能
|