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

Zac*_*c B 6 video diff video-editing video-encoding

语境:

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

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

问题:

是否有一个程序可以将两个文件都输入到其中(如有必要,我可以先将它们重新混合成不同的容器格式),它甚至可以粗略地告诉我视频相同片段的起点和终点?即,我可以将上述两个示例文件提供给它,它会告诉我素材来自同一来源的两个范围?

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

这个问题的答案很可能是“没有大量工作就不可能”,但我想无论如何我都会问。

ckh*_*han 2

有趣的。我认为如果视频的大小不是太大(或者你可以分成几个块来完成),这可能会很容易处理。

这就是我的想法:

  • 最后你真正想要的是并排差异,几乎就像sdiff

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

  • 您需要的不是一行文本,而是一个视频帧,您可以将其与另一个视频帧进行一定程度的确定性比较

除非另有说明,我将采用标准 Unix 工具。它们适用于所有操作系统,包括 Windows

那么这个怎么样:

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

    您可以使用 执行此操作ffmpeg,请参阅这篇超级用户帖子 您将获得一个充满编号 JPG 的目录。

  2. 确保每一个都具有相同的宽高比。对于本例,假设它是 450x320。 如果您没有ImageMagick,它可以为您提供帮助。

  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
    
    Run Code Online (Sandbox Code Playgroud)

    所以你会得到2.txt另一个文件的 a 。

  5. 每个文件编号。您可以花哨并使其成为视频编码时间戳,但我们将仅使用nl

    $ nl -ba 1.txt > 1n.txt
    $ nl -ba 2.txt > 2n.txt
    
    Run Code Online (Sandbox Code Playgroud)
  6. 大结局。使用被高度低估的 Unixcomm工具来向您展示 1 和 2 之间的相同之处:

    $ comm -12 1n.txt 2n.txt
    
    Run Code Online (Sandbox Code Playgroud)

尝试一下!我打赌它会起作用!:-)