gpt4 book ai didi

java - 你如何测试2个大视频是否相同?

转载 作者:行者123 更新时间:2023-11-29 05:42:08 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

然后检查重复项是一个多步骤过程:

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

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

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

在最坏的情况下(文件相同),这应该不会超过读取两个文件的原始 IO 速度。在最好的情况下(哈希值不同)测试将只花费与哈希查找一样多的时间(在 DB 或 HashMap 或您使用的任何东西中)。

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

关于java - 你如何测试2个大视频是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17090453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com