Taglib 从任意文件 c++ 中读取 ID3v2 标签
Taglib read ID3v2 tags from arbitrary file c++
我正在尝试使用 TagLib C++ API 从任意音频文件中读取 ID3v2 元数据。此文件不一定是 .mp3
文件,也可能是其他常见的音频格式。我有以下内容:
std::string readId3v2Tag(std::string filePath, std::string tagName) {
// read from file
TagLib::FileRef f(filePath.c_str());
if (!f.isNull() && f.file()) {
// get tags from property map
TagLib::PropertyMap tags = f.file()->properties();
if (tags.find(tag) != tags.end()) {
return std::string(tags[tag][0].toCString());
}
}
}
然而,当我输入一个 ID3v2 框架名称时,它 return 什么也没有。我相信这是因为 f.file()->properties()
地图包含 TagLib 的标签格式。我必须能够通过名称访问 ID3v2 帧。
有人告诉我使用 ID3v2
class,但是我不知道如何从文件访问它,并且在阅读 API 文档时遇到问题。有人知道怎么做吗?
始终阅读手册:it tells you 不要使用 file()
方法。另外 properties()
不会给你 ID3v2 标签 frames - 你应该遍历所有它们以查看它们的键和值。
相反
一旦明确了条款就非常简单:一个文件可以有零到多个 标签,其中一个 ID3v2 标签可以有一到多个 帧 。然而,单独的文件也可以有多个 属性 未绑定到标签(即音频持续时间,位深度......) - 难怪 none 你的 frame 您搜索的名称不会显示在文件的 properties.
中
我正在尝试使用 TagLib C++ API 从任意音频文件中读取 ID3v2 元数据。此文件不一定是 .mp3
文件,也可能是其他常见的音频格式。我有以下内容:
std::string readId3v2Tag(std::string filePath, std::string tagName) {
// read from file
TagLib::FileRef f(filePath.c_str());
if (!f.isNull() && f.file()) {
// get tags from property map
TagLib::PropertyMap tags = f.file()->properties();
if (tags.find(tag) != tags.end()) {
return std::string(tags[tag][0].toCString());
}
}
}
然而,当我输入一个 ID3v2 框架名称时,它 return 什么也没有。我相信这是因为 f.file()->properties()
地图包含 TagLib 的标签格式。我必须能够通过名称访问 ID3v2 帧。
有人告诉我使用 ID3v2
class,但是我不知道如何从文件访问它,并且在阅读 API 文档时遇到问题。有人知道怎么做吗?
始终阅读手册:it tells you 不要使用 file()
方法。另外 properties()
不会给你 ID3v2 标签 frames - 你应该遍历所有它们以查看它们的键和值。
相反
一旦明确了条款就非常简单:一个文件可以有零到多个 标签,其中一个 ID3v2 标签可以有一到多个 帧 。然而,单独的文件也可以有多个 属性 未绑定到标签(即音频持续时间,位深度......) - 难怪 none 你的 frame 您搜索的名称不会显示在文件的 properties.
中