| 
         
          
 Q: I know QuickTime allows access to ID3 tags in
         MP3 music files, but I can't figure out how to access this
         capability. I really need the Song Title, Album Title,
         Artist, Year, and Track Number. A: The QuickTime MP3 Movie Importer recognizes ID3
         tags and turns them into movie annotations stored as Movie
         User Data. You can import an .mp3 file as a Movie, then
         access this user data by calling Movie Toolbox APIs such as
         GetMovieUserData, GetNextUserDataType and
         GetUserDataText. The code snippet in Listing 1 takes a user data
         list, and outputs user data items to the console. Each user
         data type has a unique identifier: kUserDataTextFullName =
         FOUR_CHAR_CODE('©nam')kUserDataTextArtist = FOUR_CHAR_CODE('©ART')
 kUserDataTextAlbum = FOUR_CHAR_CODE('©alb')
 etc. See Movies.h for the list of interesting user data
         types. Movie Tracks and Media can also have their own user
         data lists. These lists can be accessed by calling
         GetTrackUserData or GetMediaUserData respectively. 
            
               | 
const UInt8 kUserDataIsText = 0xA9; // the copyright symbol
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) {
          // if the first letter of udType is 0xA9 (the copyright symbol),
          // then use GetUserDataText instead of GetUserData
          // See Movies.h for a list of interesting user data types
          err = GetUserDataText(inUserData, hData, udType, i, langEnglish);
          if (err) goto bail;
          // null-terminate the string in the handle
          PtrAndHand(&nul, hData, 1);
          // turn any CRs into spaces
          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");
  // NOTE: don't dispose UserData you did not allocate
  DisposeHandle(hData);
  return err;
}
 |  
               | Listing 1. PrintUserData |  
 
            
               | {
  UserData userData = 0;
  OSErr err;
  ...
  userData = GetMovieUserData(theMovie);
  if (userData) {
    err = PrintUserData(userData);
  }
  ...
}                   |  
               | Listing 2. Snippet calling Listing 1 |  Example output produced by Listing 1 using an .mp3
         file: 
| 
Meta-data:
    ©nam: allthewayhome.mp3
    ©ART: Spinal Tap
    ©alb: Break Like The Wind
    ©day: 1992
    ©trk: 14/14
    ©cmt: It goes to 11
 |  
 
 References:Working
         with Movie UserData Track
         Names - Ice Floe #2 
         
          
 [Apr 08 2002] |