我正在玩 TagLib(在 Windows 上,使用 MingW 构建)。我试图让 TagLib 识别 MP3 文件中何时没有 ID3v1 或 ID3v2 信息。根据TagLib 文档,当文件中没有 ID3v2 信息时,MPEG 文件对象中的 ID3v2Tag() 函数应该返回一个 NULL 指针。
不幸的是,这并没有发生。我有一些我在我的代码中使用的测试 MP3 文件(我已经使这些文件可用):
- blank.mp3(下载),根本没有 ID3v1 或 ID3v2 信息。我可以通过在文件二进制内容中对“TAG”和“ID3”进行纯文本搜索来确认这一点。
- only_album_id3v2.mp3(下载),有ID3v2信息(只设置专辑)
- only_album_id3v1.mp3(下载),有ID3v1信息(只设置专辑)
这是我的代码。
#include <iostream>
#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>
using namespace std;
int main()
{
cout << "Test." << endl;
TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");
TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();
cout << at->album() << endl;
cout << bt->album() << endl;
cout << ct->album() << endl;
cout << "The program is done.";
return 0;
}
由于 NULL 指针错误,运行这个程序应该会中断,cout << at->album() << endl;
但它运行得很好。此外,当 I 时cout << ct << endl;
,它返回一个内存地址。
这是输出:
测试。
测试专辑id3v2
程序完成。
编辑: 这是一个新的测试。
#include <iostream>
#include <mpeg/mpegfile.h>
#include <mpeg/id3v2/id3v2tag.h>
using namespace std;
int main()
{
cout << "Test." << endl;
TagLib::MPEG::File a("tests/other/blank.mp3");
TagLib::MPEG::File b("tests/id3v2/only_album_id3v2.mp3");
TagLib::MPEG::File c("tests/id3v1/only_album_id3v1.mp3");
TagLib::ID3v2::Tag * at = a.ID3v2Tag();
TagLib::ID3v2::Tag * bt = b.ID3v2Tag();
TagLib::ID3v2::Tag * ct = c.ID3v2Tag();
if(at == NULL)
{
cout << "at is NULL.";
}
else
{
cout << "at is not NULL.";
}
cout << endl;
if(bt == NULL)
{
cout << "bt is NULL.";
}
else
{
cout << "bt is not NULL.";
}
cout << endl;
if(ct == NULL)
{
cout << "ct is NULL.";
}
else
{
cout << "ct is not NULL.";
}
cout << endl;
cout << "The program is done.";
return 0;
}
这是输出。
测试。
at 不为 NULL。
bt 不为 NULL。
ct 不为 NULL。
程序完成。