语境:
假设我有两个视频文件 - 从 DVD 或 DV 磁带中翻录而来。它们都是 MKV 或 AVI 格式,一些标准容器或其他格式,但被分别翻录,使用不同的编码器、不同的比特率和不同的分辨率。这两个视频的素材不同,但有一段素材是两个音轨共有的(一段素材的源材料完全相同,但正如我所说,每个文件的编码器/分辨率/比特率都不同)。
例如:文件 1 中从 00:10 到 00:20 的片段与文件 2 中从 10:00 到 10:10 的片段具有相同的源材料。
问题:
有没有一个程序可以输入这两个文件(如果需要,我可以先将它们重新混合成不同的容器格式),它会告诉我视频相同片段的起点和终点,哪怕是粗略的?也就是说,我可以将上述两个示例文件输入其中,它会告诉我素材来自同一来源的两个范围?
理想情况下,我想要一些东西来让我调整相似性检测的“信心”,这样我就可以给它提供一个非常低分辨率、低比特率的文件和一个高清文件,并放松它的信心,这样它仍然可以检测到这些不同质量输入之间的相似片段。
这个问题的答案很可能是“没有大量的工作就不可能实现”,但我想我还是要问一下。
答案1
很有趣。我认为如果视频的大小不是太大(或者你可以将其分成几部分),这可能相当容易处理。
我的想法是这样的:
你最终真正想要的是并排比较,几乎就像
sdiff
但是您需要的不是行号,而是时间索引。
你不需要一行文字,而需要的是一帧视频,以便能够与另一帧视频进行一定程度的比较
我将假设使用标准的 Unix 工具,除非另有说明。它们适用于每个操作系统,包括 Windows。
那么这个怎么样:
将每个视频的每一帧提取为 PNG。
你可以这样做
ffmpeg
,见这个超级用户帖子 您将获得一个充满编号 JPG 的目录。确保每个图像的宽高比相同。在本例中,我们假设其宽高比为 450x320。 图像魔术师如果您没有的话,可以帮助您。
现在到了棘手的部分。我们试图比较来自完全不同来源的帧,并且我们希望不使用任何计算成本高昂的东西,如计算机视觉或神经网络。
这是我的想法:将每幅图像缩小为 1/10 大小的黑白 PNG 图像。
如果你有这张 cat.jpg 的图片:
使用一点 ImageMagick:
convert cat.jpg -type grayscale -resize 45x32 -depth 1 x.png
它变成:(放大以便您得到图片,没有双关语):现在它已经足够独特,可以作为框架签名,但是不是那么独特(我认为),以至于我们无法获得稳定的校验和
对每一帧重复此操作。对每一组帧运行两次这样的脚本。
#!/bin/sh for f in `ls -1` do: convert $f -type grayscale -resize 45x32 -depth 1 - | cksum >> 1.txt done
因此您将获得
2.txt
另一个文件的。为每个文件编号。你可以把它变成视频编码时间戳,但我们只使用
nl
:$ nl -ba 1.txt > 1n.txt $ nl -ba 2.txt > 2n.txt
大结局。使用被严重低估的 Unix
comm
工具向您展示 1 和 2 之间的相同之处:$ comm -12 1n.txt 2n.txt
试试吧!我敢打赌它一定会有用!:-)