我有一组模拟视频记录。大约 10% 的文件完全是静态的。我如何以编程方式查看所有文件并删除主要包含静态的文件?
以下实用程序具有用于分析视频的命令行选项,但没有内置功能来检测视频内容的缺失。
ffmpeg
ff探针
手刹
我尝试使用 ffmpeg 导出静态图像,然后使用 image magick 来比较这些图像之间的差异。不幸的是,静态图像和实际视频内容之间的差异返回几乎相同的差异百分比。 (9% vs 7%)
ffmpeg -ss 00:30 -i PICT0050.AVI -vframes 1 -q:v 2 output1.jpg
magick compare -metric PSNR output1.jpg output2.jpg diff.jpg
9.2191
magick compare -metric PSNR output1.jpg output3.jpg diff.jpg
7.70127
比较样品 1 和样品 2 结果有 9% 的差异
比较样品 1 和样品 3 结果有 7% 的差异
静态图像看起来是黑白的,没有任何颜色 - 所以我会查看平均饱和度,如果它低/零,我会假设它们是静态的。因此,在
bash
中并假设您的图像名为 sampleXXX.jpg
:
for f in sample*jpg; do
convert "$f" -colorspace HSL -channel S -separate -format '%M avg sat=%[fx:int(mean*100)]\n' info:
done
示例输出
sample1.jpg avg sat=0
sample2.jpg avg sat=0
sample3.jpg avg sat=21
sample4.jpg avg sat=0
sample5.jpg avg sat=39
sample6.jpg avg sat=31
这表明样本 1,2 和 4 是静态的。
另一种方法是使用 Imagemagick 查看边缘数量来对噪声量进行排名。噪声图像会有更多边缘。
for img in *; do
edginess=`convert $img -edge 1 -scale 1x1! -format "%[fx:mean]" info:`
echo "$img $edginess"
done
1bidV.jpg 0.0472165
3FJUJ.jpg 0.275502 <---- noise image
QpQvA.jpg 0.332296 <---- noise image
b4Gxy.jpg 0.0428422
gQcXP.jpg 0.0437578
vF1YZ.jpg 0.322911 <---- noise image