2012年03月11日

ID3タグの読み込み(id3lib) 第2部



ID3タグを含んだ音楽ファイルからCID3Tagクラスを使って、ID3タグを読み込む手順は以下の通りです。

  1. CID3TagクラスのインスタンスをID3タグを含んだ音楽ファイルのファイル名を指定して作成するか、或いはファイル内のID3タグをバージョン毎に読み込む場合は、ファイル名を指定せずに作成します。

  2. ファイル名を指定せずにCID3Tagクラスのインスタンスを作成した場合は、ファイルから直接読み込んだID3タグの生データを、CID3Tag::Parse関数に入力してID3タグの内容を解析します。

  3. CID3Tag::Parse関数の戻り値や、CID3Tag::GetFrameCount関数で取得したフレーム数を元に、CID3Tag::GetFrame関数を使ってフレームの内容を順に読み出し、リストビュー等のコントロールを用いて結果を表示します。






CID3Tagクラスコンストラクタの引数にID3タグを含むファイル名を指定するか、CID3Tag::Parse関数でID3タグの生データを解析してから、このGetFrame関数の引数に読み出すフレーム番号を指定して、フレームの内容をメンバー変数文字列に読み出します。

//ID3タグ内にある指定番号のフレームの内容を、メンバー変数文字列に書き出します。
BOOL CID3Tag::GetFrame(UINT indexFrame)
{
if (!m_pID3Tag) return FALSE;
//各文字列の初期化
m_strTitle.Empty();
m_strID.Empty();
m_strDesc.Empty();
m_strBinary.Empty();
m_strText.Empty();
m_strImmediate.Empty();
m_strTextEnc.Empty();
m_strTimeStamp.Empty();
m_strPictureName.Empty();

uint32 nCounter=0;
uint32 nRating=0;
uint32 nSymbol=0;

ID3_Frame* frame=_FindFrame(indexFrame);
if (!frame) return FALSE;


#ifdef _UNICODE
CStringA strA=frame->GetDescription();
m_strTitle =strA;
strA=frame->GetTextID();
m_strID =strA;
#else //_UNICODE
m_strTitle =frame->GetDescription();
m_strID =frame->GetTextID();
#endif//_UNICODE

ID3_FrameID eFrameID=frame->GetID();
switch (eFrameID){
//一意的なファイル識別子
case ID3FID_UNIQUEFILEID: //UFID
if (!_GetString(frame,ID3FN_OWNER,m_strText)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//ユーザー定義文字情報フレーム
case ID3FID_USERTEXT: //TXXX
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
if (!_GetString(frame,ID3FN_DESCRIPTION,m_strDesc)) return FALSE;
if (!_GetString(frame,ID3FN_TEXT,m_strText)) return FALSE;
break;

//ユーザー定義URLリンクフレーム
case ID3FID_WWWUSER: //WXXX
if (!_GetTextEncoding(frame,ID3FN_DESCRIPTION,m_strTextEnc)) return FALSE;
if (!_GetString(frame,ID3FN_DESCRIPTION,m_strDesc)) return FALSE;
if (!_GetString(frame,ID3FN_URL,m_strText)) return FALSE;
break;

//音楽CD識別子
case ID3FID_CDID: //MCDI
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//イベント タイム コード
case ID3FID_EVENTTIMING: //ETCO
if (!_GetTimeStampFormat(frame,m_strTimeStamp)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//MPEG ロケーション ルックアップ テーブル(省略します)
case ID3FID_MPEGLOOKUP: //MLLT
ASSERT(FALSE);
break;

//同期テンポコード
case ID3FID_SYNCEDTEMPO: //SYTC
if (!_GetTimeStampFormat(frame,m_strTimeStamp)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//非同期の歌詞/文章のコピー
case ID3FID_UNSYNCEDLYRICS: //USLT
//コメント
case ID3FID_COMMENT: //COMM
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
if (!_GetString(frame,ID3FN_LANGUAGE,m_strImmediate)) return FALSE;
if (!_GetString(frame,ID3FN_DESCRIPTION,m_strDesc)) return FALSE;
if (!_GetString(frame,ID3FN_TEXT,m_strText)) return FALSE;
break;

//同期をとった歌詞/文章
case ID3FID_SYNCEDLYRICS: //SYLT
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
if (!_GetString(frame,ID3FN_LANGUAGE,m_strImmediate)) return FALSE;
if (!_GetTimeStampFormat(frame,m_strTimeStamp)) return FALSE;
if (!_GetContentType(frame,m_strDesc)) return FALSE;
if (!_GetString(frame,ID3FN_TEXT,m_strText)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//相対ボリューム(v2.3)
case ID3FID_SYNCEDLYRICS: //RVAD
//均一化
case ID3FID_EQUALIZATION: //EQUA
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//リバーブ量(省略します)
case ID3FID_REVERB: //RVRB
ASSERT(FALSE);
break;

//イメージ
case ID3FID_PICTURE: //APIC
if (!_GetTextEncoding(frame,ID3FN_DESCRIPTION,m_strTextEnc)) return FALSE;
if (!_GetString(frame,(m_strID==_T("APIC"))?ID3FN_MIMETYPE:ID3FN_IMAGEFORMAT,
m_strImmediate)) return FALSE;
if (!_GetString(frame,ID3FN_DESCRIPTION,m_strText)) return FALSE;
if (!_GetPictureName(frame,m_strPictureName)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//パッケージ化された一般的なオブジェクト
case ID3FID_GENERALOBJECT: //GEOB
if (!_GetTextEncoding(frame,ID3FN_MIMETYPE,m_strTextEnc)) return FALSE;
if (!_GetString(frame,ID3FN_MIMETYPE,m_strImmediate)) return FALSE;
if (!_GetString(frame,ID3FN_DESCRIPTION,m_strDesc)) return FALSE;
if (!_GetString(frame,ID3FN_FILENAME,m_strText)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//再生回数
case ID3FID_PLAYCOUNTER: //PCNT
nCounter=frame->GetField(ID3FN_COUNTER)->Get();
m_strText.Format(_T("counter=%d"),nCounter);
break;

//人気
case ID3FID_POPULARIMETER: //POPM
if (!_GetString(frame,ID3FN_EMAIL,m_strDesc)) return FALSE;
nCounter=frame->GetField(ID3FN_COUNTER)->Get();
nRating =frame->GetField(ID3FN_RATING)->Get();
m_strText.Format(_T("counter=%d rating=%d"),nCounter,nRating);
break;

//おすすめバッファサイズ(省略します)
case ID3FID_BUFFERSIZE: //RBUF
//オーディオの暗号化(省略します)
case ID3FID_AUDIOCRYPTO: //AENC
ASSERT(FALSE);
break;

//同期位置フレーム
case ID3FID_POSITIONSYNC: //POSS
if (!_GetTimeStampFormat(frame,m_strTimeStamp)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//所有権フレーム(省略します)
case ID3FID_OWNERSHIP: //OWNE
ASSERT(FALSE);
break;

//暗号化の手法
case ID3FID_CRYPTOREG: //ENCR
//グループ識別子の登録
case ID3FID_GROUPINGREG: //GRID
if (!_GetString(frame,ID3FN_OWNER,m_strDesc)) return FALSE;
nSymbol=frame->GetField(ID3FN_ID)->Get();
m_strText.Format(_T("%02x"),nSymbol);
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

//プライベートデータ
case ID3FID_PRIVATE: //PRIV
if (!_GetString(frame,ID3FN_OWNER,m_strDesc)) return FALSE;
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;

case ID3FID_ALBUM: //TALB
case ID3FID_BPM: //TBPM
case ID3FID_COMPOSER: //TCOM
case ID3FID_COPYRIGHT: //TCOP
case ID3FID_DATE: //TDAT
case ID3FID_PLAYLISTDELAY: //TDLY
case IID3FID_ENCODEDBY: //TENC
case ID3FID_LYRICIST: //TEXT
case ID3FID_FILETYPE: //TFLT
case ID3FID_TIME: //TIME
case ID3FID_CONTENTGROUP: //TIT1
case ID3FID_TITLE: //TIT2
case ID3FID_SUBTITLE: //TIT3
case ID3FID_INITIALKEY: //TKEY
case ID3FID_LANGUAGE: //TLAN
case ID3FID_SONGLEN: //TLEN
case ID3FID_MEDIATYPE: //TMED
case ID3FID_ORIGALBUM: //TOAL
case ID3FID_ORIGFILENAME: //TOFN
case ID3FID_ORIGLYRICIST: //TOLY
case ID3FID_ORIGARTIST: //TOPE
case ID3FID_ORIGYEAR: //TORY
case ID3FID_FILEOWNER: //TOWN
case ID3FID_LEADARTIST: //TPE1
case ID3FID_BAND: //TPE2
case ID3FID_CONDUCTOR: //TPE3
case ID3FID_MIXARTIST: //TPE4
case ID3FID_PARTINSET: //TPOS
case ID3FID_PUBLISHER: //TPUB
case ID3FID_TRACKNUM: //TRCK
case ID3FID_RECORDINGDATES: //TRDA
case ID3FID_NETRADIOSTATION://TRSN
case ID3FID_NETRADIOOWNER: //TRSO
case ID3FID_SIZE: //TSIZ
case ID3FID_ISRC: //TSRC
case ID3FID_ENCODERSETTINGS://TSSE
case ID3FID_YEAR: //TYER
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
if (!_GetString(frame, ID3FN_TEXT,m_strText)) return FALSE;
break;

case ID3FID_CONTENTTYPE: //TCON
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
if (!_GetString(frame, ID3FN_TEXT,m_strText)) return FALSE;
{
int genre=0;
if (_stscanf(m_strText,_T("(%d)"),&genre)==1){
CStringA strA=g_GenreName(genre);
m_strText=strA;
}
}
break;

case ID3FID_WWWAUDIOFILE: //WOAF
case ID3FID_WWWARTIST: //WOAR
case ID3FID_WWWAUDIOSOURCE: //WOAS
case ID3FID_WWWCOMMERCIALINFO://WCOM
case ID3FID_WWWCOPYRIGHT: //WCOP
case ID3FID_WWWPUBLISHER: //WPUB
case ID3FID_WWWPAYMENT: //WPAY
case ID3FID_WWWRADIOPAGE: //WORS
if (!_GetString(frame,ID3FN_URL,m_strText)) return FALSE;
break;

//協力者
case ID3FID_INVOLVEDPEOPLE: //IPLS
{
if (!_GetTextEncoding(frame,ID3FN_TEXT,m_strTextEnc)) return FALSE;
int nItems=(int)frame->GetField(ID3FN_TEXT)->GetNumTextItems();
CString str;
for(int i=0;i<nItems;i++){
if (!_GetStringList(frame,ID3FN_TEXT,str,i)) return FALSE;
m_strText.AppendFormat((i==0)? _T("%s"):_T(", %s"),str);
}
break;
}

//暗号化メタフレーム(省略します)
case ID3FID_METACRYPTO: //CRM Encrypted meta frame (id3v2.2x)
//圧縮されたメタフレーム(省略します)
case ID3FID_METACOMPRESSION://CDM Compressed meta frame (id3v2.2.1)
//未知のフレーム
case ID3FID_NOFRAME: //???? No known frame
//その他
default:
if (!_GetBinaryData(frame,m_strBinary)) return FALSE;
break;
}
//正常終了
return TRUE;
}



ID3Tag(id3lib-3.8.3).h
ID3Tag(id3lib-3.8.3).cpp



posted by ひろし at 04:03| Comment(0) | MP3ファイルフォーマット | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。