小米摄像头的视频记录文件是每分钟保存成一个文件的,后期存档和查看很不方便,对此,我编写了几个小脚本方便自动化的处理其原始视频文件。
思路如下:
- 导出监控
- 遍历审查所有视频/截图内容,删除不必要的文件
- 创建待处理清单
- 利用ffmpeg压缩所有文件
具体脚本如下:
1. 导出监控,有两种方式:
方式1:通过小米监控摄像头的NAS同步设置
方式2:手工同步:需要每次在APP中设置 推出储存卡,然后手工取下存储卡,并通过 读卡器,将视频和截图文件保存到电脑上
方式1更方便,但是没有图片截图,后面审查工作会比较费时间,可以通过批处理来生成缩略图:
for /f "delims=" %%i in ('dir *.mp4 /b /s') do (ffmpeg -v quiet -y -i %%i -ss 1 -f image2 %%i.jpeg)
2. 遍历审查所有视频/截图内容,审查完后删除当前文件夹下及所有子目录下的jpeg图片来删除缩略图,命令如下:
del /f /s /q *.jpeg
3. 创建待处理清单:
dir /s /b > files.lst
4. 增加文件头尾辅助字符,以符合ffmpeg的待处理文件清单格式:
@echo off
cd /d "%~dp0"
set "fd=temp"
md "%fd%" 2>nul
@echo off
cd /d "%~dp0"
set "fd=temp"
md "%fd%" 2>nul
for /f "delims=" %%a in ('dir /a-d/b *.lst') do (
echo;"%%a"
(for /f "tokens=1*delims=:" %%b in ('findstr /n .* "%%a"') do (
set "f=%%c"
if defined f (echo;file '%%c') else (echo;)
))>"%fd%\%%a"
del "%%a"
move /y "%fd%\%%a" "%%a"
)
echo;%w% +%#%%#% %zx%
rd temp
5. 压缩所有文件
for %%i in (*.lst) do (ffmpeg -hide_banner -f concat -safe 0 -i %%i -c:v libx265 -b:v 384k -c:a aac -s 1280x720 -vf scale=1280:720 -vf fps=20 %%i.mp4)
6. 删除清单lst文件
del /f /s /q *.lst
批处理打包下载:
更新:2022-05-01 升级版
@ECHO off
@REM 删除视频截图并把当前文件下所有文件压缩成mp4
setlocal enabledelayedexpansion
:1
@REM 查找系统进程有没有FFMPEG
tasklist /nh|find /i "ffmpeg.exe" >nul
if ERRORLEVEL 0 (
@REM 如果有,就等待10秒
sleep 10
goto 1
)
@REM 如果没有就执行下面的命令
@REM 删除所有图片
del /f /s /q *.jpeg
@REM 将所有目录及子目录下文件放在temp.txt
dir /s /b > temp.txt
@REM 给temp.txt的每一行增加 file ''以方便ffmpeg处理
cd /d "%~dp0"
set "fd=temp"
md "%fd%" 2>nul
for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
echo;"%%a"
(for /f "tokens=1*delims=:" %%b in ('findstr /n .* "%%a"') do (
set "f=%%c"
if defined f (echo;file '%%c') else (echo;)
))>"%fd%\%%a"
del "%%a"
move /y "%fd%\%%a" "%%a"
)
echo;%w% +%#%%#% %zx%
rd temp
@REM 把即将压缩的文件命名为YYYYMMDDHH-HH格式
dir /a:d /b > _dirlist.txt
set /p a=<_dirlist.txt
for /f "delims=" %%i in (_dirlist.txt) do (
@REM 找出最后一行的文本内容
set b=%%i
)
@REM 截取前10位和后2位 组成文件名
set filename=%a:~0,10%-%b:~-2%
del _dirlist.txt
@REM 把temp.txt里面的非mp4内容删除
@REM 这里偷懒用到了Cygwin下的cat iconv grep命令 如有DOS方式请告知
@REM 在Cygwin下用iconv貌似一直无法输出正确的编码,但是在DOS下却能,奇怪
cat temp.txt|iconv -f GBK -t UTF-8|grep .mp4>%filename%.txt
del temp.txt
@REM 开始压缩
ffmpeg -hide_banner -hwaccel dxva2 -f concat -safe 0 -i "%filename%".txt -c:v hevc_qsv -b:v 384k -c:a aac -vf "scale=1280:-1, fps=20" "%filename%.mp4"
@REM 删除临时文件
del %filename%.txt