vid -i D:/cursor
解决的问题:
技术亮点:
#[derive(Parser, Debug)]
#[command(version, about = "视频关键帧批量提取工具")]
struct Args {
#[arg(short, long)]
input: String,
#[arg(short, long, default_value = "./output")]
output: String,
// ...其他参数
}
优化后的调用参数:
Command::new("ffmpeg")
.args(&[
"-hwaccel", "auto", // 自动硬件加速
"-i", input_path, // 输入文件
"-vf", "select=eq(pict_type\\,I)", // I帧选择
"-vsync", "vfr", // 可变帧率
"-q:v", "2", // 质量参数
"-threads", "2" // 单任务并发
]);
WalkDir::new(&args.input)
.into_iter()
.filter_map(|e| e.ok())
.filter(|e| is_video_file(e.path()))
.map(|e| e.path().to_path_buf())
rayon::ThreadPoolBuilder::new()
.num_threads(args.threads)
.build_global()?;
video_paths.par_iter().try_for_each(|path| {
// 处理逻辑
});
质量参数 | 文件大小 | PSNR值 | 适用场景 |
---|---|---|---|
1 | 1.2MB | 48dB | 出版级 |
5 | 800KB | 42dB | 网页展示 |
10 | 500KB | 38dB | 快速预览 |
缓存层级 | 存储内容 | 生命周期 | 命中率 |
---|---|---|---|
L1 | 视频元数据 | 长期 | 95% |
L2 | 解码帧数据 | 短期 | 80% |
L3 | 文件IO缓冲区 | 瞬时 | 60% |
// 自动选择最优加速方案
"-hwaccel", "auto"
// Windows平台特化
if cfg!(windows) {
.args(&["-hwaccel", "d3d11va"])
}
// 单FFmpeg实例线程限制
"-threads", "2"
// 内存使用上限
"-max_alloc", "5000000" // 5MB
./video-processor \
-i /var/security_cams \
-o ./daily_report \
--quality 5 \
--threads 12
输出结构:
daily_report/
├── cam01-east_gate/
│ ├── frame_00001.jpg
│ ├── frame_00015.jpg
│ └── ...
└── cam02-parking_lot/
├── frame_00003.jpg
└── ...
// 自定义质量参数
extract_keyframes(video_path, output_dir, 3)?;
视频规格 | 数量 | 处理时间 | CPU使用率 |
---|---|---|---|
1080p | 100 | 4m12s | 92% |
4K | 50 | 7m53s | 89% |
720p | 200 | 3m21s | 95% |
// 预留扩展接口
trait VideoAnalyzer {
fn analyze(&self, frame: &FrameData) -> AnalysisResult;
}
工具源码:
GitHub - xxxd86/vid: ffmpeg视频关键帧批处理脚本
延伸阅读: