何を使って音楽ファイルのIDを生成すればよいか


音楽ファイルを一意に特定できるIDを自動生成生成したいと思っています。

対象は、ID3v2.3またはID3v2.4タグが付いているmp3のファイルです。

なぜIDがほしいかというと、「生成されたIDをキーにデータベースを作って、ID3タグに全く依存しない独自の楽曲管理システムを構築したい」ためです。

  * IDに期待する機能は、識別できることのみで、楽曲のタイトルなどのメタ情報は自分で管理したい IDは音楽ファイルから自動計算したい
  * IDはID3タグの更新に影響されないようにしたい（単純にファイル全体のmd5を使うことが出来ません)
  * できれば、（技術的に可能なのかわからないが）原音ファイルから不可逆圧縮をしなおしても同じものが計算されるものだと、嬉しいです

もし、質問の情報が足りなければ補足しますので、どうか有識者のかた、よろしくお願いいたします。

※質問者は、CDからリッピングされた楽曲がどのようにDBとマッチングされているかわかっていないレベルです。




MP3 の音声データフレームの MD5 を計算する方法ですが、例えば bash のシェルスクリプトでは以下の様になります。GNU coreutils
に含まれる head と tail コマンド(`-c` オプションが用意されている)を使用しています。

[code]

    mp3="hoge.mp3"
    len=0
    for offset in {1..4}
    do
     # Syncsafe Integer を計算
     len=$((len +
           $((
             $(cat "$mp3" | head -c $((6 + offset)) | tail -c 1 | od -An -td1)
               << $((7 * (4 - offset) ))
             ))
           ))
    done
    
    # 10 bytes: size of ID3v2 header, 1 byte: offset of "tail -c +n" 
    tail -c +$((len+11)) "$mp3" | md5sum
    0ea78f4e6687ac5fdbb979cc06c5c34a  -
    
    # Strip all ID3v2 tags
    mid3v2 -D "$mp3"
    
    # Calculate MD5 again
    md5sum "$mp3"
    0ea78f4e6687ac5fdbb979cc06c5c34a  hoge.mp3
    
[/code]

ID3v2 拡張ヘッダとファイル末尾にあるかもしれない ID3v1 ヘッダについては考慮していません。  
実際には MP3 や ID3 タグを扱うパッケージが用意されている言語(Python など)で実装した方が良いかと思います。

