私はTagLibで遊んでいます(Windowsでは、MingWで構築されています)。MP3 ファイルに ID3v1 または ID3v2 情報がない場合、TagLib に認識させようとしています。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;
なく実行されます。また、 Icout << 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 ではありません。
プログラムが完成しました。