5

一意に識別するために、mp3 ファイルのハッシュを計算する必要があります。問題は、Traktor ソフトウェアがファイルのタグを変更し、それを変更する機会がないことです。

私たちはid3libライブラリを使用しているので、さまざまなバージョンのタグの前後にサイズを取得し、それらの間のメディアコンテンツのみを読み取ってそのハッシュを計算する方法があるのではないかと考えました. 私は id3lib docs を検索してきましたが、見つかったのはID3_Tag::GetPrependedBytes()andだけです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 を返します。

それが役立つ場合は、Qt と一緒に C++ で開発しているので、問題を解決するのに役立つことがいくつかあるかもしれません。

4

2 に答える 2

1

以下のコードで問題を解決しました。多分それは誰かを助けるでしょう。

/** 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()コードによって返された値を使用するだけで、数値表現を取得できます。

于 2012-09-18T15:59:52.957 に答える
0

別の解決策は、オーディオ ペイロードのハッシュを使用して mp3 ファイルを識別することです。id3lib の代わりに、mpeg オーディオ ファイルを解析するためのライブラリを使用できますか?

于 2012-08-14T10:28:01.333 に答える