2010-03-19 73 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