C++ 如何计算没有标签信息的mp3文件的散列?
我们需要计算mp3文件的散列来唯一地识别它。问题是Traktor软件修改了文件的标签,没有机会更改它 我们使用id3lib库,所以我想也许有某种方法可以得到不同版本的标签的预先和附加大小,并在它们之间只读取媒体内容,以计算其哈希值。我一直在id3lib文档中搜索,唯一找到的是C++ 如何计算没有标签信息的mp3文件的散列?,c++,id3lib,C++,Id3lib,我们需要计算mp3文件的散列来唯一地识别它。问题是Traktor软件修改了文件的标签,没有机会更改它 我们使用id3lib库,所以我想也许有某种方法可以得到不同版本的标签的预先和附加大小,并在它们之间只读取媒体内容,以计算其哈希值。我一直在id3lib文档中搜索,唯一找到的是ID3_标记::GetPrependedBytes()和ID3_标记::GetAppendedBytes(),如下所示: const std::size_t prepend = tagOpener.GetPrependedB
ID3_标记::GetPrependedBytes()
和ID3_标记::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,因此也许有一些事情可以帮助解决这个问题。
< P>一个替代的解决方案可能是使用音频有效载荷的散列来识别MP3文件。你能用库来解析mpeg音频文件而不是id3lib吗?我用下面的代码解决了这个问题。也许它会帮助别人/** 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()
代码返回的值即可获得数字表示。为什么不在ID3v1标记的注释字段中添加您自己的唯一ID?@wouther如果没有任何其他解决方案,可以保持文件不变,那么我们应该这样做。我们不想阻止用户输入的标签。