Как сравнить mp3, звуковые данные flac в файле, игнорируя данные заголовка (тег ID3) и т. Д.?

7684
therobyouknow

Я сделал резервные копии некоторых аудиофайлов в двух местах и ​​добавил теги ID3 в одну резервную копию, но не в другую, поскольку прошло время, и моя собственная память исчезла из-за того, действительно ли резервные копии одинаковы, но теперь у одного есть данные ID3 и в противном случае базовое двоичное сравнение не будет выполнено, и проверка будет громоздкой.

Есть ли инструмент для сравнения только аудиоданных (не заголовка, ID3) в mp3, flac-файлах и других файлах с использованием данных заголовка, таких как ID3.

Начал тему по сравнению с ней здесь: http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

рассмотрит другое программное обеспечение для сравнения, которое выполняет эту задачу

14

5 ответов на вопрос

7
Synetech

Ах, вечное положение. Я сам так долго боролся с этим вопросом и перепробовал так много приложений для поиска дубликатов файлов, что в конце концов отказался и решил написать его сам. И тогда я нашел AllDup .

AllDup сделал меня бессрочным задним числом моего собственного проекта, потому что это быстрый DFF, который имеет возможность сравнивать файлы MP3 и JPEG, игнорируя их теги ID3 и данные Exif соответственно. Более того, Михаэль Туммерер очень быстро реагирует на отзывы и быстро исправляет ошибки и вносит предложения (можно предложить игнорировать заголовки FLAC). В довершение всего, AllDup является бесплатным.

6
blujay

Вот способ сделать это в оболочке. Вам нужно avconv, что в Debian / Ubuntu находится в libav-tools.

$ avconv -i INPUT_FILE -c:a copy -f crc - 2>/dev/null | grep CRC 

Вы получите такую ​​строку:

CRC=0xabfdfe10 

Это позволит сравнить каждый кадр аудиоданных и сгенерировать для него CRC. Таким образом, команда, подобная этой, может сравнивать несколько файлов:

ls *.mp3 | while read line; do echo -n "$line: "; avconv -i "$line" -f crc - 2>/dev/null | grep CRC; done 
Не очень быстро, но отлично работает, чтобы иметь уникальную контрольную сумму в mp3-файлах для проверки дубликатов. Спасибо. fred727 8 лет назад 0
Более быстрой альтернативой, если вы можете использовать php, является библиотека getid3: http://www.getid3.org/phpBB3/viewtopic.php?f=3&t=1936. fred727 8 лет назад 0
@ fred727 Я проверил справочную страницу `avconv` и понял, что опция` crc` декодирует аудио и вычисляет CRC декодированного аудио. Но вы можете избежать этого, установив аудиокодек в `copy`. Теперь в моей системе команда выполняется за 0,13 секунды вместо 1,13 секунды. Я обновил ответ, так что теперь вы можете избежать использования PHP. :) blujay 7 лет назад 3
2
afrazier

Foobar2000 с плагином Binary Comparator сделает это.

+1 Foobar2000 выглядит потрясающе. Зачем? Поскольку он использует надлежащие собственные пользовательские интерфейсы Windows, выглядит красиво, легко и минималистично, как VNC, но обладает широкими функциональными возможностями и на самом деле предоставляет информацию и функции, которые действительно нужны - например, песню * длина * и т. Д. Windows Media Player и WinAmp не отображают эту информацию и вместо этого помещают в заметно неясных особенностях, которые редко использовали бы. Бинарный компаратор - отличная функция для вопроса, который я задаю. Благодарю. therobyouknow 13 лет назад 1
Рад, что вам это нравится! afrazier 13 лет назад 0
1
therobyouknow

Я также спросил об этом на форуме Beyond Compare, как упоминалось в вопросе, и Beyond Compare также предлагает решение:

http://www.scootersoftware.com/vbulletin/showthread.php?t=7413

Оба подхода заслуживают рассмотрения:

  • Решение AllDup лучше всего подходит, если вам не важно, какие копии файлов сохраняются, а какие отбрасываются в дереве папок каталогов И у вас есть смесь помеченных и не помеченных файлов в тех же папках, которые вы хотите запустить. повторная проверка на.

  • Beyond Compare лучше всего подходит, если вы хотите сохранить дерево каталогов / папок И сравнить две отдельные структуры папок / каталогов, что также помогает при использовании неразрушающего параметра «плоское дерево на лету»

1
Hubbitus

В качестве возможного решения вы можете использовать любой инструмент для преобразования файла в несжатый поток ( pcm, wav) без информации метаданных, а затем сравнить его. Для конвертации вы можете использовать любое программное обеспечение, которое вам нравится ffmpeg, soxили avidemux.

Например, как я делаю это с ffmpeg

Скажем, у меня для этого примера 2 файла с разными метаданными: $ diff Original.mp3 Possible-dup.mp3 ; echo $? Binary files Original.mp3 and Possible-dup.mp3 differ Сравнение грубой силы жалуется, что они различаются.

Тогда мы просто конвертируем и анализируем тело: $ diff <( ffmpeg -loglevel 8 -i Original.mp3 -map_metadata -1 -f wav - ) <( ffmpeg -loglevel 8 -i Possible-dup.mp3 -map_metadata -1 -f wav - ) ; echo $? 0

Разумеется, ; echo $?часть курса предназначена только для демонстрации кода возврата.

Обработка нескольких файлов (перемещение каталогов)

Если вы хотите попробовать дубликаты в коллекции он должен стоит вычислять контрольные суммы (любой, как crc, md5, sha2, sha256) данных, а затем просто найти там столкновения.

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

  1. Сначала вычислите хэш данных в каждом файле (и поместите в файл для следующей обработки): for file in *.mp3; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i "$file" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashes Файл будет выглядеть так: $ cat mp3data.hashes ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3 54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 Любая СУБД будет очень полезна для агрегирования подсчета и выбора таких данных. Но продолжайте чистое решение командной строки, вы можете сделать простые шаги, как дальше.

Посмотрите дубликаты хэшей, если таковые имеются (дополнительный шаг, чтобы показать, как это работает, не нужен для поиска дубликатов): $ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes [1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1 [1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2 [1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1

  1. И все вместе, чтобы перечислить файлы, дублированные по содержанию : $ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).(?!]=1$)' ) | sort 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3 1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3 8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3

count.by.regexp.awk - простой awkскрипт для подсчета шаблонов регулярных выражений.

+1 спасибо Hubbitus - хорошее автономное решение на основе открытого исходного кода. Хорошо знать. Также полезно для помещения в партию. therobyouknow 7 лет назад 1

Похожие вопросы