Как рассчитать хэш 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?

Другие вопросы по тегам