Как я могу создать стабильную контрольную сумму медиафайла?

как я могу создать контрольную сумму только медиаданных без метаданных, чтобы получить стабильную идентификацию для медиафайла. желательно кроссплатформенный подход с библиотекой, поддерживающей множество форматов. например vlc, ffmpeg или mplayer.

(медиафайлы должны быть аудио и видео в распространенных форматах, изображения тоже желательно иметь)


person yawniek    schedule 07.03.2010    source источник
comment
Я думаю, вы ищете какой-нибудь алгоритм снятия отпечатков... Что было бы интересно, поскольку его можно использовать и для идентификации похожих носителей. Жду ответов, ткнусь. +1   -  person hurikhan77    schedule 07.03.2010
comment
отпечатки пальцев тоже интересны, например. libofa [1] для аудио (которую я не смог скомпилировать на osx, несмотря на патчи), но я хочу что-то более общее, чтобы идентифицировать дубликаты файлов, а не дублировать песни/фильмы. [1] code.google.com/p/musicip-libofa   -  person yawniek    schedule 07.03.2010
comment
без тегов вы имеете в виду без метаданных? если это так, то упоминание медиаданных может привести к путанице.   -  person cregox    schedule 08.04.2010


Ответы (3)


Я не знаю ни одного существующего независимого от платформы программного обеспечения, которое могло бы выполнить это, но я знаю, как это можно сделать на интерпретируемом (независимом от платформы) языке, таком как Java.

По сути, нам просто нужно удалить любые метаданные (теги) из файла, предварительно демультиплексировав видеофайлы. Теоретически после демультиплексирования и удаления метаданных можно было бы хешировать файл и сравнивать его с другим файлом, прошедшим тот же процесс, чтобы сопоставить идентичные файлы, несмотря на разные теги. В отличие от отпечатка пальца, это будет идентифицировать не похожие песни/фильмы, а идентичные файлы (представьте, что вам может понадобиться 10 разных версий или битрейтов данной песни, которую вы заархивировали, но не хотите, чтобы 2 идентичные копии любой из них плавали вокруг) .

Наиболее тревожной частью этого является удаление тегов, поскольку существует множество различных спецификаций для форматов тегов, которые не обязательно реализуются одинаково в разных приложениях, т. Е. Один и тот же аудиофайл с идентичными тегами по отдельности в двух разных приложениях может не привести к идентичным выходным файлам. . Единственный способ, которым это может создать фатальную проблему для концепции контрольной суммы только для аудио, - это если популярное программное обеспечение для тегов вносит какие-либо изменения в двоичную звуковую часть файла или дополняет звук нестандартным способом.

Получение контрольной суммы тривиально, но я не знаю, какие библиотеки независимы от платформы для демультиплексирования и удаления тегов mpeg-файлов. Я знаю, что в средах 'nix mpgtx - отличный инструмент командной строки, который может выполнять демультиплексирование и удаление тегов, но очевидно, что это решение не зависит от платформы.

Может быть, кто-то там чувствует себя амбициозным?

person defines    schedule 17.04.2010
comment
это путь. тем временем я написал ha patch для ffmpeg для вычисления хэшей sha1 вместо контрольной суммы adler32. это по существу делает свое дело. если бы кто-нибудь хотел помочь мне перенести это в ffmpeg, это было бы здорово. - person yawniek; 30.04.2010

одно возможное решение, которое я нашел, похоже, связано с vlc:

./VLC -I rc snd.mp3 :sout='#std{mux=raw,access=file,dst=-}' vlc://quit | sha1sum
person yawniek    schedule 07.03.2010
comment
кажется, не работает для фильмов, кажется, не зависит от платформы - person yawniek; 07.03.2010

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

ffmpeg может выводить контрольные суммы для отдельных потоков. Таким образом, одно и то же аудио или видео будет выводить одну и ту же контрольную сумму независимо от формата контейнера или метаданных.

Пример для видеодорожки файла $filename, запись вывода в $filename.md5:

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

Для аудио используйте -map 0:a.

Для вывода в STDOUT используйте -. Например:

ffmpeg -i "$filename" -map 0:a -codec copy -hide_banner -loglevel warning -f md5 -
person mivk    schedule 29.07.2021