【问题标题】:How do you test if 2 large videos are identical?你如何测试两个大视频是否相同?
【发布时间】:2013-06-13 15:01:43
【问题描述】:

我有一个系统,其中视频文件被摄取,然后启动多个 CPU 密集型任务。由于这些任务的计算量很大,如果文件已经被处理,我想跳过处理它。

视频来自各种来源,因此文件名等不是可行的选择。

如果我使用图片,我会比较 MD5 哈希,但对于 5GB - 40GB 的视频,这可能需要很长时间来计算。

为了比较我正在测试此方法的 2 个视频:

  • 检查相关元数据匹配项
  • 使用 ffmpeg / ffprobe 检查文件长度
  • 使用 ffmpeg 以 100 个预定义时间戳 [1-100] 提取帧
  • 为每个帧创建 MD5 哈希
  • 比较 MD5 哈希以检查是否匹配

有没有人知道更有效的方法?还是解决问题的更好方法?

【问题讨论】:

标签: java video compare md5


【解决方案1】:

首先,您需要正确定义两个视频文件在哪些条件下被视为相同。您的意思是与逐字节完全相同吗?或者你的意思是内容相同,那么你需要为内容定义一个合适的比较方法。

我假设是第一个(完全相同的文件)。这与文件实际包含的内容无关。当您收到一个文件时,总是为该文件构建一个哈希,并将该哈希与文件一起存储。

检查重复是一个多步骤的过程:

1.) 比较哈希,如果没有找到匹配的哈希,文件是新的。在新文件的大多数情况下,您可以期望这一步是唯一的步骤,一个好的哈希(SHA1 或更大的东西)对于任何实际数量的文件几乎不会发生冲突。

2.) 如果您发现其他具有相同哈希的文件,请检查文件长度。如果它们不匹配,则文件是新的。

3.) 如果哈希和文件长度都匹配,您必须比较整个文件内容,当你找到第一个差异时停止。如果整个文件比较结果相同,则文件相同。

在最坏的情况下(文件相同),读取两个文件所需的时间不会超过原始 IO 速度。在最好的情况下(散列不同),测试只需要与散列查找一样多的时间(在 DB 或 HashMap 或您使用的任何东西中)。

编辑:您担心构建哈希的 IO。如果您首先比较文件 长度 并跳过文件长度的所有内容,您可能部分避免这种情况是唯一的。另一方面,您还需要跟踪您已经为哪些文件构建了散列。这将允许您推迟构建哈希,直到您真正需要它。如果散列丢失,您可以直接跳到比较两个文件,同时在同一通道中构建散列。它需要跟踪的状态要多得多,但根据您的情况,这可能是值得的(您需要一个可靠的数据基础,说明重复文件的发生频率及其平均大小分布才能做出决定)。

【讨论】:

  • 对于我的应用程序,重要的是我不会错过任何文件,如果有很小的机会摄取文件两次,那么我可以忍受。为了比较哈希,我需要在入站文件上生成哈希。这肯定还涉及从磁盘读取整个文件。看来 IO 可能是我的限制因素?
  • 是的,如果您想确保必须至少读取整个文件一次以构建散列。在糟糕的情况下,您需要 2n+1 次文件长度 IO(n = 哈希冲突数)。所以这将是非常有限的 IO,与这里的 IO 相比,处理能力需求可以忽略不计。
【解决方案2】:

我将从文件长度开始(快速和肮脏),继续使用 MD5 并以检查帧结束。快速简单。

当然,如果你得到一个编辑过的文件,它会给你带来假阴性,但它可能会给你 MD5 的假阴性,甚至可能会检查偶数帧;防止由于版本导致的误报在计算上非常昂贵,因此最好忽略它们。

【讨论】:

    【解决方案3】:

    散列您的文件,并跟踪散列。这是一个例子:Getting a File's MD5 Checksum in Java

    请记住,尽管可能性极小,但在数学上可能有两个不同的文件给出相同的哈希值。如果您正在处理大量文件(大约 2^128 个文件),那么您需要一个更好的哈希算法……比如 SHA2-256。但这里可能不是这样。

    【讨论】:

    • 我已经尝试过 md5 校验和,它需要 4 分钟来散列一个 8GB 的​​文件。我没有用我的 40GB 文件进行测试。 4分钟/视频高CPU处理会给项目增加相当大的成本。我希望有更快的方法。
    • @HughMHalford-Thompson 这很简单,就是找到一个散列算法。在 google 上快速搜索显示 xxhash:code.google.com/p/xxhash 但是,涉及的位数要少得多,因此重复的可能性要大得多。也就是说,在找到保证重复之前,我们仍在查看 2^32 个文件。如果您使用此散列算法,请包含另一项检查(快速检查,例如文件长度)以查看它们是否匹配。
    • @RusselUhl 如果你看一下他的数据,他的处理速度约为 67MB/s,所以我认为他已经达到了机器的 IO 限制。更快的哈希算法无助于提高 IO 速度。
    • @Durandal baaaahhhhhhhh 是真的。接得好。我知道我应该实际运行该计算。在这种情况下,休,您现在的限制因素是您可以多快地从硬盘驱动器加载信息。对于不太准确但速度更快的系统,您可以只散列文件的前 100MB。如果你做这样的事情,你绝对应该包括二级甚至三级检查方法(总文件大小等)。
    【解决方案4】:

    MD5 哈希非常慢。考虑使用更快的哈希函数,例如MurmurHash

    它的抗碰撞性非常好,而且速度非常快。

    另外,您应该先检查文件大小,这样会很快并避免不必要的哈希计算。

    【讨论】:

    • 该链接指出该页面已被弃用并且有更新版本的MurmurHash
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2016-02-26
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多