Рассчитать контрольную сумму аудиофайлов без учета заголовка - PullRequest
5 голосов
/ 09 декабря 2008

Я хочу программно создать контрольную сумму аудио файлов SHA1 (MP3, Ogg Vorbis, Flac). Требуется, чтобы контрольная сумма была стабильной , даже если заголовок (например, ID3) изменяется .
Примечание. Аудиофайлы не имеют CRC

Это то, что я попробовал сейчас:

1) Чтение + хеширование всех кадров MPEG с использованием Perl и MPEG :: Audio :: Frame

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

2) Декодирование + хеширование всех кадров MPEG с использованием Python и libmad (pymad)

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 получает некоторые ошибки декодирования, такие как «Переполнение данных Хаффмана (0x0238)» . Поскольку это действительно происходит во многих mp3-файлах, я не уверен, действительно ли это указывает на испорченный файл ...

Ответы [ 5 ]

3 голосов
/ 22 июля 2009

Если вы ищете стабильные хеши для текущей музыки, вы можете посмотреть libOFA . Ваши текущие методы будут давать вам разные результаты, потому что форматы могут иметь встроенные теги. Также, если вы хотите, чтобы два разных файла с одной и той же песней возвращали один и тот же хеш, вам нужно учитывать такие вещи, как битрейт и частоты сэмплов.

libOFA, с другой стороны, может дать вам стабильный хеш, который можно использовать между форматами и различными кодировками. Может быть, что вы хотите?

2 голосов
/ 10 июня 2011

Мне потребовались инструменты, чтобы быстро проверить, действительна ли моя библиотека 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
0 голосов
/ 11 января 2019

Существует простой стабильный способ сделать это. Просто сделайте копию файла и удалите из него все теги (например, используя mutagen.id3) и возьмите хэш-сумму полученного файла.

Единственным недостатком этого метода является его производительность.

0 голосов
/ 22 мая 2009

Я пытаюсь сделать то же самое. Я использовал MD5 вместо SHA1. Я начал экспортировать контрольные суммы аудио с помощью 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?

0 голосов
/ 12 декабря 2008

Bene, Если бы я был тобой (и я сейчас работаю над чем-то очень похожим на то, что ты хочешь сделать), я бы хэшировал блок данных mp3 (Сначала извлеките их в исходные данные и запишите на диск, чтобы вы знали, с чем имеете дело). Затем измените тег ID3. Снова хешируйте свои данные. Теперь, если он изменится, сравните ваши два набора необработанных данных и выясните, ГДЕ они изменились. Скорее всего, вы можете перешагнуть границу где-нибудь. Насколько я помню, файлы MP3 начинаются с чего-то вроде FF F8. Ну, по крайней мере, кадр делает.

Мне интересны ваши выводы, так как я все еще пишу весь свой код для обработки отпечатков пальцев и т. Д. И еще не дошел до фактического хеширования.

...