Как рассчитать хэш mp3-файла без информации о тегах?
Нам нужно вычислить хэш mp3-файла, чтобы однозначно идентифицировать его. Проблема в том, что программное обеспечение Traktor изменяет теги файла, и изменить его невозможно.
Мы используем библиотеку id3lib, поэтому я подумал, что, возможно, есть какой-то способ получить предварительно добавленный и добавленный размер тегов разных версий и просто читать медиа-контент между ними, чтобы вычислить его хэш. Я искал в документах id3lib, и единственное, что я нашел, это ID3_Tag::GetPrependedBytes()
а также ID3_Tag::GetAppendedBytes()
, как это:
const std::size_t prepend = tagOpener.GetPrependedBytes();
const std::size_t append = tagOpener.GetAppendedBytes();
const std::size_t overall = tagOpener.Size();
но они просто возвращают 0.
Если это может помочь, мы разрабатываем на C++ вместе с Qt, так что, возможно, могут быть какие-то вещи, которые помогут с трудностями.
2 ответа
Я решил проблему с помощью приведенного ниже кода. Может быть, это кому-то поможет.
/** Return QString hash for the given path */
inline QString GetHash( const QString& filePath )
{
/// Determine positions of ID3 tags
ID3_Tag tagOpener( filePath.toLocal8Bit() );
const std::size_t prepend = tagOpener.GetPrependedBytes();
const std::size_t append = tagOpener.GetAppendedBytes();
/// Calculate a hash
QString hashValueString;
QFile file( filePath );
QCryptographicHash hash( QCryptographicHash::Md5 );
if( file.open(QIODevice::ReadOnly) )
{
/// Read only useful media data and skip tags
const bool seekRes = file.seek( prepend ); // skip prepend tags info
const qint64 mediaDataSize = file.size() - append - prepend;
hash.addData( file.read(mediaDataSize) );
/// Set hash md5 for current file
hashValueString = hash.result().toHex().data();
file.close();
}
tagOpener.Clear();
return hashValueString;
}
Это решение с использованием Qt и ID3Lib. Вы можете просто использовать значение, возвращаемое hash.result()
код для получения числового представления.
Альтернативным решением может быть использование хеша полезных данных аудио для идентификации mp3-файла. Можете ли вы использовать библиотеку для анализа аудиофайла mpeg вместо id3lib?