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.0 KiB
5.0 KiB
video_probe (Rust) - 快速参考指南
📋 项目概述
目标: 将 Python 版本的 video_probe.py 重写为高性能 Rust 版本
核心功能: 使用 ffprobe 提取视频元数据并保存为 JSON
仓库: video_probe (独立的 Gitea 仓库)
🚀 快速开始
1. 初始化项目
# 运行初始化脚本
chmod +x init_video_probe_rust.sh
./init_video_probe_rust.sh
2. 实现核心功能
参考 VIDEO_PROBE_RUST_DEVELOPMENT.md 文档,按以下顺序实现:
- src/error.rs - 错误类型定义
- src/metadata.rs - 数据结构定义
- src/probe.rs - ffprobe 执行逻辑
- src/parser.rs - JSON 解析逻辑
- src/output.rs - 输出格式化
- src/main.rs - 命令行入口
3. 测试
cd video_probe
cargo test
cargo run -- video.mp4
📦 依赖清单
核心依赖 (必需)
| 依赖 | 版本 | 用途 |
|---|---|---|
serde |
1.0 | 序列化/反序列化 |
serde_json |
1.0 | JSON 处理 |
chrono |
0.4 | 时间处理 |
anyhow |
1.0 | 错误处理 |
thiserror |
1.0 | 自定义错误 |
clap |
4.0 | 命令行解析 |
增强依赖 (可选)
| 依赖 | 版本 | 用途 |
|---|---|---|
indicatif |
0.17 | 进度条 |
rayon |
1.8 | 并行处理 |
walkdir |
2.4 | 目录遍历 |
📁 项目结构
video_probe/
├── Cargo.toml # 项目配置
├── src/
│ ├── main.rs # 入口点
│ ├── lib.rs # 库接口
│ ├── probe.rs # ffprobe 执行
│ ├── parser.rs # JSON 解析
│ ├── metadata.rs # 数据结构
│ ├── output.rs # 输出格式化
│ └── error.rs # 错误类型
├── tests/
│ └── integration_test.rs # 集成测试
└── docs/
├── USAGE.md # 使用文档
└── DEVELOPMENT.md # 开发文档
🔧 核心实现要点
1. ffprobe 调用
Command::new("ffprobe")
.args(&[
"-v", "quiet",
"-print_format", "json",
"-show_format",
"-show_streams",
video_path
])
.output()?
2. JSON 解析
#[derive(Deserialize)]
struct FfprobeOutput {
format: Option<Value>,
streams: Option<Vec<Value>>,
}
3. 元数据结构
struct VideoMetadata {
video_path: String,
probed_at: DateTime<Utc>,
format: FormatInfo,
video_stream: Option<VideoStream>,
audio_streams: Vec<AudioStream>,
subtitle_streams: Vec<SubtitleStream>,
other_streams: Vec<OtherStream>,
}
4. 命令行参数
#[derive(Parser)]
struct Args {
video_path: String,
#[arg(short, long)]
output: Option<String>,
#[arg(short, long)]
verbose: bool,
}
📊 开发时间表
| 阶段 | 任务 | 时间 |
|---|---|---|
| 1 | 项目初始化 | 0.5 天 |
| 2 | 数据结构 | 1 天 |
| 3 | ffprobe 执行 | 1 天 |
| 4 | JSON 解析 | 1 天 |
| 5 | 输出格式化 | 0.5 天 |
| 6 | 命令行界面 | 0.5 天 |
| 7 | 测试 | 1 天 |
| 8 | 文档 | 0.5 天 |
| 总计 | 6 天 |
✅ 功能对照表
| 功能 | Python 版本 | Rust 版本 | 状态 |
|---|---|---|---|
| ffprobe 调用 | ✅ | 待实现 | 🔨 |
| JSON 解析 | ✅ | 待实现 | 🔨 |
| 格式信息提取 | ✅ | 待实现 | 🔨 |
| 视频流提取 | ✅ | 待实现 | 🔨 |
| 音频流提取 | ✅ | 待实现 | 🔨 |
| 字幕流提取 | ✅ | 待实现 | 🔨 |
| JSON 输出 | ✅ | 待实现 | 🔨 |
| 命令行参数 | ✅ | 待实现 | 🔨 |
| 友好输出 | ✅ | 待实现 | 🔨 |
🎯 性能对比预期
| 指标 | Python | Rust | 提升 |
|---|---|---|---|
| 启动时间 | ~50ms | ~1ms | 50x |
| 内存使用 | ~30MB | ~5MB | 6x |
| CPU 效率 | 中 | 高 | 2-3x |
| 二进制大小 | N/A | ~2MB | - |
| 部署复杂度 | 高 | 低 | ✅ |
🔗 有用链接
📝 开发清单
必须完成
- 实现 ffprobe 调用
- 实现 JSON 解析
- 实现元数据提取
- 实现 JSON 输出
- 实现命令行参数
- 编写单元测试
- 编写集成测试
- 编写 README
- 添加错误处理
- 添加日志输出
可选增强
- 批量处理
- 并行处理
- 进度条
- 递归扫描
- 多种输出格式
- 配置文件支持
🚨 注意事项
- ffprobe 依赖: 系统必须安装 FFmpeg
- 跨平台: 测试 Linux/macOS/Windows
- 错误处理: 文件不存在、ffprobe 失败等
- 性能优化: 避免不必要的内存分配
- 测试覆盖: 至少 80% 代码覆盖率
📞 支持
如有问题,请:
- 查看
VIDEO_PROBE_RUST_DEVELOPMENT.md - 查看 Rust 官方文档
- 提交 Issue 到 Gitea 仓库