批量分析 监控视频(10分钟一个MP4) 忽略 长时间无变化,生成变化部分的截图

如题,这样,完全无变化的mp4可以只保留一个截图就删除了。
其他视频,也可以快速看到几个截屏,马上能知道里面有什么事情——本来要浏览视频才知道。

另外,手机看监控是 超级看看 这个app,但它居然是没有pc端的?
一直以为以前用过它的pc端,但导视频都是先app导到手机目录,再ftp到pc,
终于嫌手机flash中转一次浪费flash寿命,打算找回pc端直接导,却发现它就是没有pc端的?!
有那个 以为 可能是把 旧手机做监控 的 掌上看家app 的pc端 记错了。
刚刚搜、下载了好几个,结果都是欺骗你下载一个游戏相关的软件。。。。这些网站都这么无耻了?

我提一个思路,ffmpeg提取关键帧,用图片相似度工具删除相似图,再写个自动删除视频的工具,把没有关键帧图的视频自动删除掉

1 Like


可以参考这篇文章。
理论上,视频压缩的关键帧就是已经忽略了没有任何变化的图像,如果是监控的话,这种关键帧之间的距离应该挺大的。

我用的米家摄像头, 可以设置为监控范围内有变化才记录视频.

如果是没有这个功能的监控视频. 我建议你研究一下 FFmpeg .

另外有一些媒体播放器是可以通过进度条预览视频画面的.

类似的关键帧提取软件,你可以看下这个

https://segmentfault.com/a/1190000022192846

这个需求让我想起了之前做过的一个 CTF 题目,输入是一段视频,要求找到视频内发生了变化的几帧。
解法有 opencv 和 ffmpeg 两大类。

参见 中科大 Hackergame 2019 - 三教奇妙夜

1 Like

这个命令太好了,不仅有 差异度设置,还能自动拼图。。。。 :+1:
不过再试着处理另外几个文件时,都没有生成任何图片??信息是【
frame= 0 fps=0.0 q=0.0 Lsize=N/A time=00:00:00.00 bitrate=N/A speed= 0x
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing ove
rhead: unknown
Output file is empty, nothing was encoded (check -ss / -t / -frames parameters i
f used)】

更新命令
ffmpeg -i 文件名 -vf select='gt(scene,0.1)',scale=320:-1,tile=4*4 -vsync 2 core-%05d.jpg

这个命令可以强制添加第一帧的图片
ffmpeg -i 文件名 -vf select='gt(scene,0.1)+eq(n\,1)',scale=320:-1,tile=4*4 -vsync 2 core-%05d.jpg

没图的通过bat判断补上了,只是 变化标准参数,还不好捉摸。。。。

@echo off
set x=%1
echo %time% %x% [%x:~0,14%]
set f=z:\s%x:~0,14%-0001.jpg
if exist %f% goto e
if exist %f%x goto e
z:\t\ffmpeg -i %x% -vf select="‘gt(scene,0.06)’,scale=480:270,tile=3x3" -vsync 2 z:\s%x:~0,14%-%%04d.jpg -loglevel quiet
if not exist %f% z:\t\ffmpeg.exe -ss 00:00:10 -i “%x%” -f image2 -y “%f%x” -loglevel quiet
:e

跟摄像头卖家要到一个pc工具,避免先手机app下载视频再ftp到pc处理(凭空多写一次手机的闪存)。
但是它下载的视频.h264,ffmpeg截取关键帧居然不行的?!
它对应的一个转换工具,把h264转为avi(其实也是h264格式),但也无法截取到关键帧(也许是内容的原因。现在怀疑是格式的问题)。。。。
担心ffmpeg版本不够新,去更新mediacoder(使用的是它里面的),结果下载速度却非常慢。
正好测试自己的批量下载工具,开80个进程并发下载,按2种方式:每片1M和每片50K,
看看哪种方式更快

我是想先看 有没有现成的工具;
如果没有,那就是自己借基础工具(ffmpeg等)再编程实现了。

关键帧真的是 较大变化 才出现的吗?
我一直以为 它只是时间间隔保存的。。。。所以打算按不同的时间点截屏,再比较相似度。
如果关键帧已经有这样的效果,倒是可以直接取关键帧了

使用 ffmpeg -i video_name.mp4 -vf select=‘eq(pict_type,I)’ -vsync 2 -s 1920*1080 -f image2 core-%02d.jpeg
得到的图片基本是每10秒一张。。。。。

没有差异,也应该给一张截图啊。。。。
难道要bat在最后 判断没截图,自动生成一张?

0.01,好像很快就分析完了,仍然没有生成截图。倒也没说 参数 超过范围
后来,又能生成9宫截图了,但 有些变化它认为没变化,有些几乎没变化它却认为有变化。。。。

我这个廉价的监控,好像也有 报警视频(有变化才保存),
只是担心它的 变化 标准固定。。。。

关键帧之间间隔的帧数不是固定时间的,和视频内容、压缩算法、压缩参数有很大关系。我试了自己的几个视频,接近每秒1个关键帧。
@jerrylus 给出的参考链接相当棒.
我找到了另外几个ffmpeg用法的网页
https://superuser.com/questions/538112/meaningful-thumbnails-for-a-video-using-ffmpeg
https://blog.csdn.net/caohang103215/article/details/72638751

给出一个新的答案。其中scene,0.1是一个系数(系数范围可以从 0 到 1调整 ),相邻帧的差异超过0.1就会被提取出来,然后缩小为320240的图片,自动排列为32每6个图拼在一起:

ffmpeg -i 文件名 -vf select="'gt(scene,0.1)',scale=320:240,tile=3x2" -vsync 2 core-%05d.jpg

如果保存为bat,使用如下命令:

ffmpeg -i %1 -vf select="'gt(scene,0.1)',scale=320:240,tile=3x2" -vsync 2 core-%%05d.jpg
2 Likes

我怀疑是视频片段没有差异大的画面,毕竟是监控画面。你可以浏览几个视频确认一下。另外也可以尝试调整参数,比如改成0.01(这个参数一定是通过调整来确认的):

ffmpeg -i 文件名 -vf select="'gt(scene,0.01)',scale=320:240,tile=3x2" -vsync 2 core-%05d.jpg