FC2ブログ

ホーム > MP3ファイルフォーマット > ID3タグの読み込み 第2部

ID3タグの読み込み 第2部



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

  1. ID3FileクラスのインスタンスをID3タグを含んだ音楽ファイルのファイル名を指定して作成するか、或いはファイル内の音楽データを演奏しながら同時にID3タグを読み込む場合は、ファイル名を指定せずに作成します。
    libid3tag-0.15.1bにおいて、ファイル内の音楽データを演奏しながら、同時にファイル内のID3タグを読むというようなことは出来ないようです。)

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

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




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

//指定位置のフレームの内容を、メンバー変数文字列に読み出します。
BOOL CID3File::GetFrame(UINT indexFrame)
{
ASSERT(m_id3tag);
if (!m_id3tag) return FALSE;
//id3タグバージョンの取得
if (!_GetTagVersion(m_id3tag,m_strVersion)) 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();

int int32=0;
m_memfileImage.Detach();

//指定番号に該当する、フレームへのポインタを取得します。
struct id3_frame* frame=::id3_tag_findframe(m_id3tag,NULL,indexFrame);
if (!frame) return FALSE;

m_strTitle =frame->description;//フレームの説明文
m_strID =frame->id; //フレームID名

//一意的なファイル識別子
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_BINARYDATA

if (::memcmp(frame->id,"UFID",4)==0){
ASSERT(frame->nfields==2);
if (!_GetLatin1(frame,0,m_strText)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//ユーザー定義文字情報フレーム
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_STRING

else if (::memcmp(frame->id,"TXXX",4)==0){
ASSERT(frame->nfields==3);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetString(frame,1,m_strDesc)) return FALSE;
if (!_GetString(frame,2,m_strText)) return FALSE;
}

//ユーザー定義URLリンクフレーム
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_LATIN1

else if (::memcmp(frame->id,"WXXX",4)==0){
ASSERT(frame->nfields==3);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetString(frame,1,m_strDesc)) return FALSE;
if (!_GetLatin1(frame,2,m_strText)) return FALSE;
}

//音楽CD識別子
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"MCDI",4)==0){
ASSERT(frame->nfields==1);
if (!_GetBinaryDump(frame,0,m_strBinary)) return FALSE;
_GetBinaryText(frame,0,m_strText);
}

//イベント タイム コード
// ID3_FIELD_TYPE_INT8, timeStampFormat
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"ETCO",4)==0){
ASSERT(frame->nfields==2);
if (!_GetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//MPEG ロケーション ルックアップ テーブル(省略します)
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_INT24,
// ID3_FIELD_TYPE_INT24,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"MLLT",4)==0) ASSERT(FALSE);

//同期テンポコード
// ID3_FIELD_TYPE_INT8, timeStampFormat
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"SYTC",4)==0){
ASSERT(frame->nfields==2);
if (!_GetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//非同期の歌詞/文章のコピー
//コメント
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LANGUAGE,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_STRINGFULL

else if ((::memcmp(frame->id,"USLT",4)==0)||
(::memcmp(frame->id,"COMM",4)==0)){
ASSERT(frame->nfields==4);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_GetString(frame,2,m_strDesc)) return FALSE;
if (!_GetStringFull(frame,3,m_strText)) return FALSE;
}

//同期をとった歌詞/文章
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LANGUAGE,
// ID3_FIELD_TYPE_INT8, timeStampFormat
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"SYLT",4)==0){
ASSERT(frame->nfields==6);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_GetTimeStampFormat(frame,2,m_strTimeStamp)) return FALSE;
if (!_GetContentType(frame,3,m_strDesc)) return FALSE;
if (!_GetString(frame,4,m_strText)) return FALSE;
if (!_GetBinaryDump(frame,5,m_strBinary)) return FALSE;
}

//相対ボリューム(v2.3)
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"RVAD",4)==0){
ASSERT(frame->nfields==1);
if (!_GetBinaryDump(frame,0,m_strBinary)) return FALSE;
}

//相対ボリューム(v2.4)
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"RVA2",4)==0){
ASSERT(frame->nfields==2);
if (!_GetLatin1(frame,0,m_strDesc)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//均一化
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"EQU2",4)==0){
ASSERT(frame->nfields==3);
if (!_GetInterpolationMethod(frame,0,m_strDesc)) return FALSE;
if (!_GetLatin1(frame,1,m_strText)) return FALSE;
if (!_GetBinaryDump(frame,2,m_strBinary)) return FALSE;
}

//リバーブ量(省略します)
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT8

else if (::memcmp(frame->id,"RVRB",4)==0) ASSERT(FALSE);

//イメージ
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"APIC",4)==0){
ASSERT(frame->nfields==5);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLatin1(frame,1,m_strImmediate)) return FALSE;
if (!_GetPictureName(frame,2,m_strPictureName)) return FALSE;
if (!_GetString(frame,3,m_strText)) return FALSE;
if (!_GetImageData(frame,4,m_memfileImage)) return FALSE;
}

//パッケージ化された一般的なオブジェクト
//ID3_FIELD_TYPE_TEXTENCODING,
//ID3_FIELD_TYPE_LATIN1,
//ID3_FIELD_TYPE_STRING,
//ID3_FIELD_TYPE_STRING,
//ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"GEOB",4)==0){
ASSERT(frame->nfields==5);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLatin1(frame,1,m_strImmediate)) return FALSE;
if (!_GetString(frame,2,m_strDesc)) return FALSE;
if (!_GetString(frame,3,m_strText)) return FALSE;
if (!_GetBinaryDump(frame,4,m_strBinary)) return FALSE;
}

//再生回数
//ID3_FIELD_TYPE_INT32PLUS

else if (::memcmp(frame->id,"PCNT",4)==0){
ASSERT(frame->nfields==1);
if ((int32=_GetInt32Plus(frame,0))==-1) return FALSE;
m_strText.Format("%d",int32);
}

//人気(省略します)
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT32PLUS

else if (::memcmp(frame->id,"POPM",4)==0) ASSERT(FALSE);

//おすすめバッファサイズ(省略します)
// ID3_FIELD_TYPE_INT24,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_INT32

else if (::memcmp(frame->id,"RBUF",4)==0) ASSERT(FALSE);

//オーディオの暗号化(省略します)
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"AENC",4)==0) ASSERT(FALSE);

//リンク情報
// ID3_FIELD_TYPE_FRAMEID,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_LATIN1LIST

else if (::memcmp(frame->id,"LINK",4)==0){
ASSERT(frame->nfields==3);
if (!_GetFrameID(frame,0,m_strImmediate)) return FALSE;
if (!_GetLatin1(frame,1,m_strDesc)) return FALSE;
if (!_GetLatin1List(frame,2,m_strText)) return FALSE;
}

//同期位置フレーム
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"POSS",4)==0){
ASSERT(frame->nfields==2);
if (!_GetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//使用条件
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LANGUAGE,
// ID3_FIELD_TYPE_STRING

else if (::memcmp(frame->id,"USER",4)==0){
ASSERT(frame->nfields==3);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_GetString(frame,2,m_strText)) return FALSE;
}

//所有権フレーム
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_DATE,
// ID3_FIELD_TYPE_STRING

else if (::memcmp(frame->id,"OWNE",4)==0){
ASSERT(frame->nfields==4);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetLatin1(frame,1,m_strDesc)) return FALSE;
if (!_GetDate(frame,2,m_strImmediate)) return FALSE;
if (!_GetString(frame,3,m_strText)) return FALSE;
}

//コマーシャルフレーム(省略します)
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_DATE,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_STRING,
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"COMR",4)==0) ASSERT(FALSE);

//暗号化の手法(省略します)
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"ENCR",4)==0) ASSERT(FALSE);

//グループ識別子の登録(省略します)
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"GRID",4)==0) ASSERT(FALSE);

//プライベートデータ
// ID3_FIELD_TYPE_LATIN1,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"PRIV",4)==0){
ASSERT(frame->nfields==2);
if (!_GetLatin1(frame,0,m_strDesc)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//署名フレーム(省略します)
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"SIGN",4)==0) ASSERT(FALSE);

//シークフレーム(省略します)
// ID3_FIELD_TYPE_INT32

else if (::memcmp(frame->id,"SEEK",4)==0) ASSERT(FALSE);

//オーディオ シーケンス ポイント インデックス(省略します)
// ID3_FIELD_TYPE_INT32,
// ID3_FIELD_TYPE_INT32,
// ID3_FIELD_TYPE_INT16,
// ID3_FIELD_TYPE_INT8,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"ASPI",4)==0) ASSERT(FALSE);

//テキスト情報フレーム
// ID3_FIELD_TYPE_TEXTENCODING,
// ID3_FIELD_TYPE_STRINGLIST

else if (frame->id[0]=='T'){
ASSERT(frame->nfields==2);
if (!_GetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_GetStringList(frame,1,m_strText)) return FALSE;
//ジャンルの取得
if (::memcmp(frame->id,"TCON",4)==0){
union id3_field* field=::id3_frame_field(frame,1);
const id3_ucs4_t* ucs4=::id3_field_getstrings(field,0);
const id3_ucs4_t* genre=::id3_genre_name(ucs4);
id3_utf8_t* utf8=::id3_ucs4_utf8duplicate(genre);
m_strText=(char*)utf8;
::free(utf8);
}
//オーディオファイルの長さ
else if (::memcmp(frame->id,"TLEN",4)==0){
int ms=0;
::sscanf(m_strText.GetBuffer(),"%d",&ms);
m_strText.Format("%02d:%02d:%03d",ms/60000,(ms/1000)%60,ms%1000);
}
}

//URL リンクフレーム
// ID3_FIELD_TYPE_LATIN1

else if (frame->id[0]=='W'){
ASSERT(frame->nfields==1);
if (!_GetLatin1(frame,0,m_strText)) return FALSE;
}

//使われていないフレーム
// ID3_FIELD_TYPE_FRAMEID,
// ID3_FIELD_TYPE_BINARYDATA

else if (::memcmp(frame->id,"ZOBS",4)==0){
ASSERT(frame->nfields==2);
if (!_GetFrameID(frame,0,m_strImmediate)) return FALSE;
if (!_GetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//その他
// ID3_FIELD_TYPE_BINARYDATA

else if (!_GetBinaryDump(frame,0,m_strBinary)) return FALSE;

//正常終了
return TRUE;
}




<<ID3タグの読み込み 第1部ページの先頭ID3タグの読み込み 第3部>>


スポンサーサイト



コメント: 0

この記事へのコメント
ブログ著者にのみ知らせます。

Trackback+Pingback: 0

TrackBack URL for this entry
http://hiroshi0945.blog75.fc2.com/tb.php/57-88307a3d
Listed below are links to weblogs that reference
ID3タグの読み込み 第2部 from マルチメディアファイルフォーマット

Home > MP3ファイルフォーマット > ID3タグの読み込み 第2部

タグクラウド
ブロとも申請フォーム

この人とブロともになる

ブロとも一覧

このページの先頭へ戻る