高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1135
Using QuickTime to access MP3 ID3 Tags


Q: QuickTime が MP3 形式の音楽ファイルの ID3 タグへのアクセスを可能にするのは知っていますが、その機能の利用方法がわかりません。私は、曲のタイトル、アルバムのタイトル、アーティスト名、発表年、およびトラック番号の情報がどうしても必要なのです。

A: QuickTime/MP3 の Movie Importer は ID3 タグを認識し、それらをムービーのユーザデータとして保存されるムービーの注釈に変換します。.mp3 ファイルをムービーとしてインポートし、その後 GetMovieUserData、GetNextUserDataType、および GetUserDataText のような Movie Toolbox API を呼び出すことによって、このユーザデータにアクセスすることができます。

リスト 1 に示すコードは、ユーザデータのリストを受け取り、ユーザデータの項目をコンソールに出力します。ユーザデータの各タイプは一意の識別子を持っています。たとえば次のようになります。

kUserDataTextFullName = FOUR_CHAR_CODE('©nam')
kUserDataTextArtist = FOUR_CHAR_CODE('©ART')
kUserDataTextAlbum = FOUR_CHAR_CODE('©alb')

興味深いユーザデータタイプのリストを見るには Movies.h を参照します。

Movie のトラックとメディアも独自のユーザデータリストを持っています。これらのリストはそれぞれ、GetTrackUserData または GetMediaUserData を呼び出すことによってアクセスできます。

const UInt8 kUserDataIsText = 0xA9; // 著作権記号

OSErr PrintUserData(UserData inUserData)
{
  OSType udType;
  short count, i;
  char nul = 0;
  Handle hData = NULL;
  Ptr p;

  OSErr err = noErr;

  hData = NewHandle(0);
  udType = GetNextUserDataType(inUserData, 0);
  if(0 != udType) {
    printf("\nMeta-data:\n");

    do {
      count = CountUserDataType(inUserData, udType);
      for(i = 1; i <= count; i++) {
        if((udType>>24) == kUserDataIsText) {

          // udType の最初の文字が 0xA9(著作権記号)の場合、
          // GetUserData の代わりに GetUserDataText を使用する。
          // 興味深いユーザデータタイプのリストを見るには Movies.h を参照する
          err = GetUserDataText(inUserData, hData, udType, i, langEnglish);
          if (err) goto bail;

          // ハンドルが指す文字列をヌルで終了する
          PtrAndHand(&nul, hData, 1);

          // キャリッジリターンはすべてスペースに変換
          p = *hData;
          while(*p) {
            if (*p == kReturnCharCode) *p = ' ';
            p++;
          };

          HLock(hData);
          printf("  %c%c%c%c: %s\n", (char)(udType>>24),
                (char)(udType>>16),
                (char)(udType>>8),
                (char)udType, *hData);
          HUnlock(hData);

        } else {

          err = GetUserData(inUserData, hData, udType, i);
          if (err) goto bail;

          printf("  %c%c%c%c: [%d bytes]\n",
                (char)(udType>>24),
                (char)(udType>>16),
                (char)(udType>>8),
                (char)udType, GetHandleSize(hData));
        }
      }

      udType = GetNextUserDataType(inUserData, udType);

    } while(0 != udType);
  }

bail:
  printf("\n");

  // 注意:割り当てていない UserData は破棄しない
  DisposeHandle(hData);

  return err;
}

リスト 1 PrintUserData


{
  UserData userData = 0;
  OSErr err;

  ...

  userData = GetMovieUserData(theMovie);
  if (userData) {
    err = PrintUserData(userData);
  }

  ...
}                  

リスト 2 リスト 1 を呼び出すコードの抜粋

.mp3 ファイルを使ってリスト 1 により生成された出力の例

Meta-data:

    ©nam: allthewayhome.mp3

    ©ART: Spinal Tap

    ©alb: Break Like The Wind

    ©day: 1992

    ©trk: 14/14

    ©cmt: It goes to 11


参考文献:

Working with Movie UserData

Track Names - Ice Floe #2


[2002 年 4 月 8 日]