2010-03-19 92 views
1

我想读取MP3文件的最后1 MB,并为文件的该部分计算SHA1校验和。我想要这样做的原因是,当我寻找重复的MP3时,即使它是exakt相同的音频文件,标题信息(歌曲标题,专辑等)也可能不同,所以我想我会更好地进行校验和文件的一部分,而不是整个文件的一部分。有没有这样做的有效方式?用PHP读取文件的一部分

回答

4

你不得不使用文件操作的C包装:fopenfseekfread

$size = 1024 * 1000; 
$handle = fopen($file, 'r'); 
fseek($handle, -$size); 
$limitedContent = fread($handle, $size); 
$hash = md5($limitedContent); 
+0

非常感谢! – Johan 2010-03-19 14:45:48

+0

警告:不要忘记正确的错误处理! – soulmerge 2010-03-19 14:46:32

3

尝试fseek。这将在文件结束之前将指针移动到〜1024 kbytes。

fseek($fp, -1024 * 1024, SEEK_END); 
6

MP3对歌曲/专辑/艺术家没有任何固有的“标题”信息。这由ID3处理,它可以位于文件的前面(ID3v2,随机大小,取决于指定了多少信息)或末尾(ID3v1,固定的128字节)。要通过校验和正确识别MP3,您必须确保忽略ID3标签的两个版本。此外,可以在.wav容器中嵌入MP3,在这种情况下,可以使用.wav标题和其他内容。

当然,总会有两首歌用不同的比特率,采样率,甚至不同的CD翻录器和编码器编码。所有将产生完全不同的文件,但仍然是“同一首歌曲”。

+0

非常有趣,感谢您的详细信息。 – Johan 2010-04-01 10:08:04