如何获取 mp4 文件或流的前 4096 个字节的 SHA1?

如何获取 mp4 文件或流的前 4096 个字节的 SHA1?

我正在尝试使用命令行工具来匹配 Plex.app 为电影文件计算的哈希值(显然,它是电影第一个块(4k)的 SHA1 哈希,而不是整个电影)。

我尝试使用以下命令通过命令行工具获取哈希,但不出所料,两个哈希不匹配。

file="/path/to/mp4"
dd bs=4k count=1 if="$file" | openssl sha1
1+0 records in
1+0 records out
4096 bytes transferred in 0.000012 secs (341333333 bytes/sec)
7785d5d6d611a27ac03dfdff8a2c89e9ffeffa3b
file="/path/to/mp4"
head -c 4096< "$file" | openssl sha1
7785d5d6d611a27ac03dfdff8a2c89e9ffeffa3b

使用时ffprobe我意识到该 mp4 文件开头的大部分数据是编码设置而不是视频流。这让我想到无论 Plex 使用什么过程,它都可能避免文件的编码设置,因为它们可能完全相同。

请记住,导致值不匹配的原因可能有很多,因此需要使用适当的工具来尝试复制其哈希计算。

答案1

您可以直接使用 ffmpeg 执行此操作。

ffmpeg -hide_banner -v 0 -f data -start 0 -end 4096 -i subfile:input.mp4 -map 0 -f hash -hash sha160 -

0这将读取从字节到偏移量之前的字节的输入4096并计算 SHA-1(160b)哈希。

结果打印为

SHA160=55c306878d7a09e1c726310b49e7f63915346365

请注意,MP4 并不总是将标头放在最前面。此外,标头包含的内容远不止视频编码设置。

答案2

为此,您需要了解 Plex 应用究竟如何计算此哈希值。您可以找到Github 上的 Plex 源代码

为了更好地满足您的实际需求,您最终想要实现什么?也许有更简单的方法可以实现。

相关内容