
前言家里小米摄像头会持续录制视频日积月累产生大量 MP4 文件。很多时间段画面完全静止没有人和物体活动白白占用大量磁盘空间。市面上视频剪辑软件只能手动打开一个个看批量筛选监控录像的工具比较少。于是用 C OpenCV FFmpeg 写了这个小工具核心安全设计程序只做分析不会直接移动 / 删除任何原始视频。输出迁移 bat 脚本和还原 bat 脚本人工确认脚本无误之后再双击执行。如果整理出错运行还原脚本一键恢复全部文件位置。支持递归遍历子目录、多线程并发分析、断点续传已经适配小米摄像头 HEVC 编码录像对断电损坏的残缺 MP4 做修复与容错处理。✨工具特性安全优先脚本先行程序扫描分析全部视频输出move_xxx.bat迁移脚本、revert_xxx.bat还原脚本原始文件完全不改动人工校验脚本再执行。帧差运动检测采样对比灰度帧统计差异像素数量超过阈值判定画面存在运动过滤静态无意义录像。FFmpeg 损坏视频修复小米摄像头断电断网会生成残缺 MP4程序调用 ffmpeg 尝试修复修复失败标记为损坏文件。多线程并发处理支持命令行参数‑t N指定工作线程数充分利用 CPU 加速批量视频分析。断点续传机制processed.txt记录每一个视频的检测结果再次运行会跳过已经处理完毕的视频不用重复分析。详细运行日志run_log.txt保存全部处理日志方便排查误判、损坏视频。BAT 防重复写入多次运行程序不会在 bat 脚本重复追加大量重复 move 指令自动判断末尾 pause不会重复生成多个 pause。环境依赖Windows x64 平台OpenCVRelease x64ffmpeg.exe需要在代码中配置 ffmpeg 完整路径C17 标准编译使用教程1、运行方式两种运行模式方式①命令行传参适合批处理调用vediocheck.exe 源视频目录 静态输出目录 [-t N]示例vediocheck.exe Z:\xiaomi_camera_videos\20250425 Z:\xiaomi_camera_videos\video_static -t 12‑t N指定并发工作线程范围 1‑64省略默认 20 线程。方式②不带参数交互式输入直接双击vediocheck.exe控制台交互式录入路径与线程数。图程序启动交互界面2、输入目录说明源监控视频目录存放小米摄像头录像的根目录程序会自动递归扫描全部子文件夹下 mp4。静态视频存放目标目录脚本、日志、断点记录文件全部输出到此目录。输入完成回车程序开始遍历磁盘。图程序运行扫描界面控制台实时打印扫描进度已跳过断点记录的文件。3、处理完成输出文件全部视频处理完毕后目标目录生成 4 个文件文件说明move_xxxx.bat迁移脚本将判定为静态 / 损坏的视频移动到目标位置记事本打开人工校验确认无误双击执行revert_xxxx.bat还原脚本迁移之后发现误判双击执行把所有视频恢复回原始路径processed.txt断点记录文件保存每个视频检测结果格式 完整路径状态码Y/NY 代表已经写入 bat 脚本删除该文件即可重新全量扫描run_log.txt完整运行日志记录每一个视频的判定结果排查误判、损坏视频⚠重要提醒工具仅做初步筛查存在少量误判执行 move 脚本之前务必用记事本打开 bat 人工核对内容不要直接双击运行processed.txt 格式说明无中文避免编码乱码Z:\test\1.mp4 | STATIC | Y Z:\test\2.mp4 | MOTION | N Z:\test\3.mp4 | CORRUPT_MOVE | Y Z:\test\4.mp4 | CORRUPT_SKIP | NSTATIC静态无运动已经写入 bat 脚本MOTION检测到画面运动跳过不写入 batCORRUPT_MOVE视频损坏配置开启移动写入 batCORRUPT_SKIP视频损坏配置不移动跳过 batY 已写入 batN 不写入 bat⚙关键参数配置源码顶部const int SAMPLE_INTERVAL 20; // 每隔多少帧采样一次越大速度越快降低精度 const int DIFF_THRESHOLD 12000; // 差异像素阈值超过该值判定画面有运动 const int SKIP_FRAMES_START 30; // 跳过视频开头N帧 const int VIDEO_ANALYZE_TIMEOUT_MS 90000; // 单视频分析超时90秒防止坏视频卡死线程 const int FFMPEG_TIMEOUT_MS 120000; // ffmpeg修复超时 const bool EXEC_REAL_MOVE false; // false只生成bat不直接移动文件强烈不建议改为true const bool AUTO_CLEAN_TMP true; // 自动删除ffmpeg修复生成的临时mp4 const bool MOVE_CORRUPT_FILE true; // 是否把损坏视频也加入迁移脚本 const std::wstring FFMPEG_PATH LD:\\opencv412\\ffmpeg.exe; //修改为你的ffmpeg实际路径参数调优提示DIFF_THRESHOLD阈值调大更加严格轻微光影变化会判定为静态调小更加灵敏光影变化就判定运动。VIDEO_ANALYZE_TIMEOUT_MS针对超长录像可以调整到 1800003 分钟。EXEC_REAL_MOVEfalse是安全底线不要改成 true全部操作优先走 bat 脚本人工确认。常见问题Q部分小mp4 提示损坏、超时标记 CORRUPT_MOVEA小米摄像头断电、断网会写出不完整 partial mp4moov 元数据缺失属于录像文件本身损坏。程序调用 ffmpeg 尝试修复修复失败标记损坏。可以通过MOVE_CORRUPT_FILE开关控制是否迁移这类文件。注意OpenCV 内部 ffmpeg 解码残缺 HEVC 视频时cap.read()有可能内部阻塞卡死当前超时防护只防护 “可以正常读帧” 的场景。Q怎么重新完整扫描全部视频A删除目标目录下面的processed.txt重新运行程序就会重新分析全部视频。bat 脚本会追加写入如果你想要全新 bat 脚本同时把 move 和 revert 的 bat 一并删除。Q多次运行bat 脚本会不会产生大量重复 move 命令A不会。程序读取processed.txt里面hasWriteBat标记如果该视频已经写入 bat就不会重复追加 move 指令。Q执行 move.bat 之后发现误判如何恢复A直接双击运行对应revert_xxx.bat一键全部还原视频到原始文件夹。设计思路为什么生成 bat 而不是程序直接 move监控视频批量处理最怕程序 bug一旦程序直接移动文件中途崩溃、误判视频位置错乱很难复原。程序只负责分析输出人类可读的 bat 批处理脚本磁盘原始数据完全不改动。用户可以记事本编辑 bat手动删除部分 move 行自定义筛选结果。配套完整还原脚本作为兜底就算 exe 程序丢失bat 脚本依旧可以完成迁移和恢复。局限性说明基于帧差灰度对比做运动检测不是 AI 人形识别光线明暗大幅度变化、树叶晃动会产生少量误判必须人工复核脚本。对严重损坏完全无法解码的 mp4 只能标记损坏。只测试了处理.mp4格式。其它格式可以自行测试。资源下载说明源码为 C 控制台源码VS2019 x64 ReleaseC17 编译使用前修改FFMPEG_PATH为你本地 ffmpeg 路径。资源包含完整 cpp 源码不含 OpenCV、ffmpeg 二进制库需要自行配置依赖。VS2019 编译配置说明平台x64 ReleaseC 语言标准设置为 C17依赖 OpenCV4.12需要自行配置 OpenCV包含目录D:\opencv412\build\include库目录D:\opencv412\build\x64\vc16\lib附加依赖项opencv_world412.lib将ffmpeg.exe放置对应目录修改源码中FFMPEG_PATH常量为实际路径。运行时需要opencv_world412.dll和ffmpeg.exe随同 exe 一起分发。C小米监控录像静态视频筛选工具源码生成bat还原脚本断点续传资源-CSDN下载https://download.csdn.net/download/zhaojun917/93315638