2009-12-21 77 views
1

是否有Ruby庫可以計算MP3文件音頻數據的校驗和(減去元數據),還是允許我讀取MP3的音頻數據以計算校驗和我自己?讀取MP3音頻數據或計算其校驗和


我正在尋找這樣的事情:

mp3 = Mp3Lib::MP3.new('/path/to/song.mp3') 
mp3.audio.sha1sum # => the sha1 checksum of _only_ the audio, minus the metadata 

我發現Mp3Info,但似乎有點乏味。初始化Mp3Info對象時,您可以獲取實際音頻數據開始和結束的幀。

回答

1

ID3標籤是不是存儲在文件末尾(ID3 v1)的128字節塊中,還是存儲在文件開頭的一個塊(ID3v2.3和v2.4)? (id3.org

您可以使用Mp3Info中的audio_content方法,並從該文件中讀取那麼多數據,儘管自己查看文件可能並不複雜得多,並且找出頭文件不在其中的位置。

3

提取沒有它的元數據的mp3文件是相當容易完成的。

ID3v1

元數據是文件的最後128個字節。元數據始終以3個字節「TAG」開頭(如果存在)。只要忽略這最後的128字節。

ID3v2

元數據可以存儲在文件的開頭或結尾。大多數實現只支持開始。 ID3v2有一個存儲大小的標題。頭文件始終在元數據的開始處處理。有一個可選的頁腳,它是元數據結尾的標題副本。如果元數據位於文件末尾,則需要使用頁腳。

頭具有folloing形式

ID3v2/file identifier  "ID3" 
ID3v2 version    $04 00 
ID3v2 flags    %abcd0000 
ID3v2 size    4 * %0xxxxxxx 

頁腳具有以下形式

ID3v2/file identifier  "3DI" 
ID3v2 version    $04 00 
ID3v2 flags    %abcd0000 
ID3v2 size    4 * %0xxxxxxx 

的d位表示,wheter頁腳是存在的。尺寸的測量不包含頁眉和頁腳。大小的每個字節始終設置爲最高位。所以,只有28位的32位代表了這個大小。

只計算文件的哪部分不是元數據,並將其用於散列。

要知道,如果的ID3v1和ID3v2兩者都位於文件的末尾,ID3v1的位於後面IDV2

該規範可以在http://www.id3.org/id3v2.4.0-structure找到。