我们需要计算一个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。
如果这可以提供帮助,我们正在用Qt和Qt一起开发,所以也许可以有一些东西可以帮助解决问题。
答案 0 :(得分:0)
另一种解决方案可能是使用音频有效负载的散列来识别mp3文件。你能用一个库来解析一个mpeg音频文件而不是id3lib吗?
答案 1 :(得分:0)
我用以下代码解决了这个问题。也许它会帮助别人。
/** 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()
代码返回的值来获取数字表示。