如何确定不同视频文件之间共同的镜头片段?

如何确定不同视频文件之间共同的镜头片段?

语境:

假设我有两个视频文件 - 从 DVD 或 DV 磁带中翻录而来。它们都是 MKV 或 AVI 格式,一些标准容器或其他格式,但被分别翻录,使用不同的编码器、不同的比特率和不同的分辨率。这两个视频的素材不同,但有一段素材是两个音轨共有的(一段素材的源材料完全相同,但正如我所说,每个文件的编码器/分辨率/比特率都不同)。

例如:文件 1 中从 00:10 到 00:20 的片段与文件 2 中从 10:00 到 10:10 的片段具有相同的源材料。

问题:

有没有一个程序可以输入这两个文件(如果需要,我可以先将它们重新混合成不同的容器格式),它会告诉我视频相同片段的起点和终点,哪怕是粗略的?也就是说,我可以将上述两个示例文件输入其中,它会告诉我素材来自同一来源的两个范围?

理想情况下,我想要一些东西来让我调整相似性检测的“信心”,这样我就可以给它提供一个非常低分辨率、低比特率的文件和一个高清文件,并放松它的信心,这样它仍然可以检测到这些不同质量输入之间的相似片段。

这个问题的答案很可能是“没有大量的工作就不可能实现”,但我想我还是要问一下。

答案1

很有趣。我认为如果视频的大小不是太大(或者你可以将其分成几部分),这可能相当容易处理。

我的想法是这样的:

  • 你最终真正想要的是并排比较,几乎就像sdiff

  • 但是您需要的不是行号,而是时间索引。

  • 你不需要一行文字,而需要的是一帧视频,以便能够与另一帧视频进行一定程度的比较

我将假设使用标准的 Unix 工具,除非另有说明。它们适用于每个操作系统,包括 Windows

那么这个怎么样:

  1. 将每个视频的每一帧提取为 PNG。

    你可以这样做ffmpeg,见这个超级用户帖子 您将获得一个充满编号 JPG 的目录。

  2. 确保每个图像的宽高比相同。在本例中,我们假设其宽高比为 450x320。 图像魔术师如果您没有的话,可以帮助您。

  3. 现在到了棘手的部分。我们试图比较来自完全不同来源的帧,并且我们希望不使用任何计算成本高昂的东西,如计算机视觉或神经网络。

    这是我的想法:将每幅图像缩小为 1/10 大小的黑白 PNG 图像。

    如果你有这张 cat.jpg 的图片:

    一张来自互联网的猫的图片

    使用一点 ImageMagick:convert cat.jpg -type grayscale -resize 45x32 -depth 1 x.png它变成:(放大以便您得到图片,没有双关语):

    在此处输入图片描述

    现在它已经足够独特,可以作为框架签名,但是不是那么独特(我认为),以至于我们无法获得稳定的校验和

  4. 对每一帧重复此操作。对每一组帧运行两次这样的脚本。

    #!/bin/sh
    for f in `ls -1` do:
        convert $f -type grayscale -resize 45x32 -depth 1 - | cksum >> 1.txt
    done
    

    因此您将获得2.txt另一个文件的。

  5. 为每个文件编号。你可以把它变成视频编码时间戳,但我们只使用nl

    $ nl -ba 1.txt > 1n.txt
    $ nl -ba 2.txt > 2n.txt
    
  6. 大结局。使用被严重低估的 Unixcomm工具向您展示 1 和 2 之间的相同之处:

    $ comm -12 1n.txt 2n.txt
    

试试吧!我敢打赌它一定会有用!:-)

相关内容