5

音声ファイル (MP3、Ogg Vorbis、Flac) の SHA1 チェックサムをプログラムで作成したいと考えています。要件は、ヘッダー (ID3 など) が変更されてもチェックサムが安定している必要があることです。
注: オーディオ ファイルには CRC がありません。

これは私が今試したことです:

1) Perl とMPEG::Audio::Frameを使用したすべての MPEG フレームの読み取り + ハッシュ

my $sha1 = Digest::SHA1->new;
while (my $frame = MPEG::Audio::Frame->read(\*FH)) {
    $sha1->add($frame->content());
}

2) Python とlibmad (pymad)を使用したすべての MPEG フレームのデコード + ハッシュ

mf = mad.MadFile(path)
sha1 = hashlib.sha1()

while 1:
    buf = mf.read()
    if (buf is None):
        break
    sha1.update(buf)

3) mp3cat の使用

> mp3cat - - < file.mp3 | sha1sum

ただし、これらの方法のいずれも、安定したチェックサムを提供しませんでした。つまり、場合によっては、ファイルをpicardで再タグ付けした後にチェックサムが変更されました。

私が欲しいものをすでに提供しているライブラリはありますか?
プログラミング言語は問いません…

更新: ケースをもう少しデバッグしました。libmad チェックサムの不一致は、libmad が"Huffman data overrun (0x0238)"のようなデコード エラーを取得した場合に発生するようです。これは多くの mp3 ファイルで実際に発生するため、本当に破損したファイルを示しているかどうかはわかりません…</p>

4

5 に答える 5

2

MP3/OGG​​ ライブラリがまだ有効かどうかをすばやく確認するためのツールが必要でした。MP3の場合、仕事をするmp3md5.py(http://snipplr.com/view/4025/mp3-checksum-in-id3-tag/)を見つけましたが、OGG Vorbis用の簡単なツールはありませんでしたが、少しbashをコーディングしました私のためにこれを行うスクリプト。どちらのツールも、コメント/ID3Tag の変更を許容する必要があります。

#!/bin/bash

# This bash script appends an MD5SUM to the vorbiscomment and/or verifies it if it exists
# Later modification of the vorbis comment does not alter the MD5SUM
# Julian M.K.

FILE="$1"

if [[ ! -f "$FILE" || ! -r "$FILE" || ! -w "$FILE" ]] ; then
  echo "File $FILE" does not exist or is not readable or writable
  exit 1
fi

OLDCRC=`vorbiscomment "$FILE" | grep ^CRC=|cut -d "=" -f 2`
NEWCRC=`ogginfo "$FILE" |grep "Total data length:" |cut -d ":" -f 2 | md5sum |cut -d " " -f 1`

if [[ "$OLDCRC" == "" ]] ; then
  echo "ADDED $FILE  $NEWCRC"
  vorbiscomment -a -t "CRC=$NEWCRC" "$FILE" 
  # rewrite CRC to get proper data length, I dont know why this is necessary
  NEWCRC=`ogginfo "$FILE" |grep "Total data length:" |cut -d ":" -f 2 | md5sum |cut -d " " -f 1`
  vorbiscomment -w -t "CRC=$NEWCRC" "$FILE" 
elif [[ "$OLDCRC" == "$NEWCRC" ]]  ; then
  echo "VERIFIED $FILE"
else
  echo "FAILURE $FILE -- $OLDCRC - $NEWCRC"
fi
于 2011-06-10T11:39:47.877 に答える
1

それを行うための簡単で安定した方法があります。ファイルのコピーを作成し、(mutagen.id3 などを使用して) すべてのタグを削除し、結果のファイルのハッシュサムを取得します。

この方法の唯一の欠点は、そのパフォーマンスです。

于 2019-01-11T18:12:05.220 に答える
0

何年も後に更新します:

非常によく似た質問に対する私の回答を参照してください。ffmpeg個々のストリームのチェックサムの実行を実際にサポートしていることがわかりました。オーディオ ストリームのみの md5 ハッシュを取得するには:

ffmpeg -i "$filename" -map 0:a -codec copy -f md5 "$filename.md5"

-f hashジェネリック形式を使用した他のハッシュ形式、または を使用してフレームごとに行うためのサポートもあります-f framemd5


私は同じことをしようとしています。SHA1 の代わりに MD5 を使用しました。mp3tag ( www.mp3tag.de/en/ )を使用してオーディオ チェックサムのエクスポートを開始しました。次に、同じことを行うために、あなたのものに似たPerlスクリプトを作成しました。次に、テスト ファイルからすべてのタグを削除しましたが、オーディオ チェックサムは同じままでした。

これはスクリプトです:

use MPEG::Audio::Frame;
use Digest::MD5 qw(md5_hex);
use strict;

my $file = 'E:\Music\MP3\Russensoul\01 - 5nizza , Soldat (Russensoul - Russensoul).mp3';
my $mp3tag_audio_md5 = lc '2EDFBD62995A46A45CEEC08C1F303486';

my $md5 = Digest::MD5->new;

open(FILE, $file) or die "Cannot open $file : $!\n";
binmode FILE;

while(my $frame = MPEG::Audio::Frame->read(\*FILE)){
    $md5->add($frame->asbin);
}

print '$md5->hexdigest  : ', $md5->hexdigest, "\n",
      'mp3tag_audio_md5 : ', $mp3tag_audio_md5,  "\n",
      ;

タグを変更するために使用するものは何でも、mp3 ヘッダーも変更する可能性はありますか?

于 2009-05-22T12:26:34.600 に答える
0

ベネ、もし私があなただったら (そして私はあなたがやりたいことと非常によく似たものに取り組んでいる最中です)、私は mp3 データ ブロックをハッシュします。(最初に生データに抽出し、ディスクに書き出すので、何を扱っているかがわかります)。次に、ID3 タグを変更します。データを再度ハッシュします。変更があった場合は、2 セットの生データを比較して、どこが変更されたかを調べます。おそらく、どこかで境界を越えている可能性があります。思い出すと、MP3 ファイルは FF F8 のようなもので始まります。まあ、少なくともフレームはそうです。

私はまだ指紋などを処理するためのすべてのコードを書いていて、実際のハッシュにはまだ到達していないので、あなたの調査結果に興味があります.

于 2008-12-12T18:37:42.947 に答える