FC2ブログ

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

ID3タグの書き込み 第2部



CIDFileクラスを使って、ID3タグへの編集/書き込みする手順は以下の通りです。

新たにフレームを作成して、ID3タグに追加/挿入する場合。
  1. ID3タグが存在しない場合は、CID3File::TagNew関数を呼び出して、ID3タグを新たに作成します。
  2. 追加するフレームIDを引数に入れてCID3File::InsertFrameNew関数を呼び出し、新規フレームの作成とID3タグにフレームへの追加/挿入をします。
  3. メンバー変数のCStringクラス文字列に必要なデータを設定した後、CID3File::SetFrame関数を呼び出してID3タグの内容を変更します。
  4. CID3File::Update関数を呼び出して、ID3タグの内容をメモリ或いはファイルに書き込みます。
ID3タグの読み込み 第2部」の手順に従って読み込んだ、ID3タグの内容を修正する場合。
  1. 修正するフレームの内容をCID3File::GetFrame関数で、メンバー変数のCStringクラス文字列に読み出します。
  2. メンバー変数のCStringAクラス文字列を編集後、CID3File::SetFrame関数を呼び出してID3タグの内容を変更します。
  3. CID3File::Update関数を呼び出して、ID3タグの内容をメモリ或いはファイルに書き込みます。
ID3タグの読み込み 第2部」の手順に従って読み込んだ、ID3タグのフレームを削除する場合。
  1. 削除するフレーム番号を引数に入れてCID3File::DeleteFrame関数を呼び出し、フレーム番号のフレームを削除します。
  2. CID3File::Update関数を呼び出して、ID3タグの内容をメモリ或いはファイルに書き込みます。




ID3タグを編集及び書き込むのためのCID3Fileクラスのメンバー関数です。

//画像をファイルから読み込みます。
BOOL CID3File::LoadImage(LPCTSTR lpszPathName)
{
//ファイル形式の取得
CString strFileType;
LPCTSTR pExt=::PathFindExtension(lpszPathName);
if ((::StrCmpNI(pExt,_T(".jpeg"),5)==0)||
(::StrCmpNI(pExt,_T(".jpg"),4)==0))
strFileType=_T("image/jpeg");
else if (::StrCmpNI(pExt,_T(".png"),4)==0)
strFileType=_T("image/png");
else return FALSE;

//ファイルからバイナリーデータを読み込みます。
CFile infile;
if (!infile.Open(lpszPathName,CFile::modeRead)) return FALSE;
UINT length=(UINT)infile.GetLength();
//メンバー変数のCByteArrayクラスに必要なメモリー領域を確保し、
//そのメモリーにデータ読み込みます。

m_arrayImage.SetSize(length);
BYTE* buffer=m_arrayImage.GetData();
UINT bytesRead=infile.Read(buffer,length);
infile.Close();
if (!bytesRead) return FALSE;
//メンバー変数のCMemFileクラスに、CByteArrayクラスのメモリー領域を結び付けます。
m_memfileImage.Detach();
m_memfileImage.Attach(buffer,length);
m_strImmediate=strFileType;
return TRUE;
}

//id3タグの内容をファイル/指定メモリーに更新します。
BOOL CID3File::Update(CByteArray* pArrayID3Tag)
{
if (!m_id3tag){
pArrayID3Tag->RemoveAll();
return FALSE;
}
//CByteArrayクラスへのポインタが有効な場合。
if (AfxIsValidAddressress(pArrayID3Tag,sizeof(CByteArray))){
int options=::id3_tag_options(m_id3tag,0,0);
//ID3v1タグの場合。
if (options&ID3_TAG_OPTION_ID3V1){
//ID3v1タグの生データのサイズを取得します。
id3_length_t size=::id3_tag_render(m_id3tag,0);
if (size!=128) return FALSE;
//確保したメモリー領域に書き出します。
pArrayID3Tag->SetSize(size);
size=::id3_tag_render(m_id3tag,pArrayID3Tag->GetData());
if (size!=128) return FALSE;
}
//ID3v2タグの場合。
else{
//ID3v2タグの生データのサイズを取得します。
id3_length_t size=::id3_tag_render(m_id3tag,0);
if (!size) return FALSE;
//確保したメモリー領域に書き出します。
pArrayID3Tag->SetSize(size);
size=::id3_tag_render(m_id3tag,pArrayID3Tag->GetData());
if (!size) return FALSE;
}
}
//ファイルからの読み込みで、CByteArrayクラスの指定が無い場合は
//ファイルを更新します。

else if (m_file){
int res=::id3_file_update(m_file);
if (res!=0) return FALSE;
}
return TRUE;
}


対象のフレームの内容をメンバー変数文字列に設定してから、引数にフレーム番号を指定して、このSetFrame関数を呼び出してID3タグに書き込み、Update関数で引数に指定したCByteArrayクラス、もしくはファイルにID3タグの内容を書き出します。

//メンバー変数文字列を、指定位置のフレームに書き込みます。
BOOL CID3File::SetFrame(UINT indexFrame)
{
ASSERT(m_id3tag);
if (!m_id3tag) return FALSE;

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

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

int int32=0;

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

if (::memcmp(frame->id,"UFID",4)==0){
ASSERT(frame->nfields==2);
if (!_SetLatin1(frame,0,m_strText)) return FALSE;
if (!_SetBinaryDump(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetString(frame,1,m_strDesc)) return FALSE;
if (!_SetString(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetString(frame,1,m_strDesc)) return FALSE;
if (!_SetLatin1(frame,2,m_strText)) return FALSE;
}

//音楽CD識別子
// ID3_FIELD_TYPE_BINARYDATA

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

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

else if (::memcmp(frame->id,"ETCO",4)==0){
ASSERT(frame->nfields==2);
if (!_SetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_SetBinaryDump(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 (!_SetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_SetBinaryDump(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_SetString(frame,2,m_strDesc)) return FALSE;
if (!_SetStringFull(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_SetTimeStampFormat(frame,2,m_strTimeStamp)) return FALSE;
if (!_SetContentType(frame,3,m_strDesc)) return FALSE;
if (!_SetString(frame,4,m_strText)) return FALSE;
if (!_SetBinaryDump(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 (!_SetBinaryDump(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 (!_SetLatin1(frame,0,m_strDesc)) return FALSE;
if (!_SetBinaryDump(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 (!_SetInterpolationMethod(frame,0,m_strDesc)) return FALSE;
if (!_SetLatin1(frame,1,m_strText)) return FALSE;
if (!_SetBinaryDump(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLatin1(frame,1,m_strImmediate)) return FALSE;
if (!_SetPictureName(frame,2,m_strPictureName)) return FALSE;
if (!_SetString(frame,3,m_strText)) return FALSE;
if (!_SetImageData(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLatin1(frame,1,m_strImmediate)) return FALSE;
if (!_SetString(frame,2,m_strDesc)) return FALSE;
if (!_SetString(frame,3,m_strText)) return FALSE;
if (!_SetBinaryDump(frame,4,m_strBinary)) return FALSE;
}

//再生回数
// ID3_FIELD_TYPE_INT32PLUS

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

//人気(省略します)
// 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 (!_SetFrameID(frame,0,m_strImmediate)) return FALSE;
if (!_SetLatin1(frame,1,m_strDesc)) return FALSE;
if (!_SetLatin1List(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 (!_SetTimeStampFormat(frame,0,m_strTimeStamp)) return FALSE;
if (!_SetBinaryDump(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLanguage(frame,1,m_strImmediate)) return FALSE;
if (!_SetString(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 (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
if (!_SetLatin1(frame,1,m_strDesc)) return FALSE;
if (!_SetDate(frame,2,m_strImmediate)) return FALSE;
if (!_SetString(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 (!_SetLatin1(frame,0,m_strDesc)) return FALSE;
if (!_SetBinaryDump(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);

//テキスト情報フレーム
else if (frame->id[0]=='T'){
ASSERT(frame->nfields==2);
if (!_SetTextEncoding(frame,0,m_strTextEnc)) return FALSE;
CString str=m_strText;
//ジャンルの設定
if (::memcmp(frame->id,"TCON",4)==0){
#ifdef _UNICODE
id3_ucs4_t* ucs4=::id3_utf16_ucs4duplicate((const id3_utf16_t*)str.GetBuffer());
#else//_UNICODE
CStringW strW=(CStringW)str;
id3_ucs4_t* ucs4=::id3_utf16_ucs4duplicate((const id3_utf16_t*)strW.GetBuffer());
#endif//_UNICODE
int genre=::id3_genre_number((id3_ucs4_t const *)ucs4);
if (genre==-1) str.Empty();
else str.Format(_T("%d"),genre);
::free(ucs4);
}
//オーディオファイルの長さ
else if (::memcmp(frame->id,"TLEN",4)==0){
int min=0,sec=0,msec=0;
::_stscanf(str,_T("%02d:%02d:%03d"),&min,&sec,&msec);
int ms=min*60000+sec*1000+msec;
str.Format(_T("%d"),ms);
}
if (!_SetStringList(frame,1,str)) return FALSE;
}

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

else if (frame->id[0]=='W'){
ASSERT(frame->nfields==1);
if (!_SetLatin1(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 (!_SetFrameID(frame,0,m_strImmediate)) return FALSE;
if (!_SetBinaryDump(frame,1,m_strBinary)) return FALSE;
}

//その他
// ID3_FIELD_TYPE_BINARYDATA

else if (!_SetBinaryDump(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/60-21ca69b3
Listed below are links to weblogs that reference
ID3タグの書き込み 第2部 from マルチメディアファイルフォーマット

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

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

この人とブロともになる

ブロとも一覧

このページの先頭へ戻る