2012-04-06 6 views
2

나는 오디오 플레이어를 개발 중이다. 나는 mp3 파일의 다른 정보를 성공적으로 얻는다. mp3 파일의 앨범 아트를 가져올 수 없습니다. 이 코드를 사용하여 mp3 파일 정보를 얻습니다.MP3 파일의 앨범 아트를 얻는 방법

- (NSDictionary *)songID3Tags 
{ 
AudioFileID fileID = nil; 
OSStatus error = noErr; 
error = AudioFileOpenURL((CFURLRef)self.filePath, kAudioFileReadPermission, 0, &fileID); 
    if (error != noErr) { 
    NSLog(@"AudioFileOpenURL failed"); 
} 
UInt32 id3DataSize = 0; 
    char *rawID3Tag = NULL; 

error = AudioFileGetPropertyInfo(fileID, kAudioFilePropertyID3Tag, &id3DataSize, NULL); 
if (error != noErr) 
    NSLog(@"AudioFileGetPropertyInfo failed for ID3 tag"); 

rawID3Tag = (char *)malloc(id3DataSize); 
if (rawID3Tag == NULL) 
    NSLog(@"could not allocate %lu bytes of memory for ID3 tag", id3DataSize); 

error = AudioFileGetProperty(fileID, kAudioFilePropertyID3Tag, &id3DataSize, rawID3Tag); 
if(error != noErr) 
    NSLog(@"AudioFileGetPropertyID3Tag failed"); 

UInt32 id3TagSize = 0; 
UInt32 id3TagSizeLength = 0; 

error = AudioFormatGetProperty(kAudioFormatProperty_ID3TagSize, id3DataSize, rawID3Tag, &id3TagSizeLength, &id3TagSize); 

if (error != noErr) { 
    NSLog(@"AudioFormatGetProperty_ID3TagSize failed"); 
    switch(error) { 
     case kAudioFormatUnspecifiedError: 
      NSLog(@"Error: audio format unspecified error"); 
      break; 
     case kAudioFormatUnsupportedPropertyError: 
      NSLog(@"Error: audio format unsupported property error"); 
      break; 
     case kAudioFormatBadPropertySizeError: 
      NSLog(@"Error: audio format bad property size error"); 
      break; 
     case kAudioFormatBadSpecifierSizeError: 
      NSLog(@"Error: audio format bad specifier size error"); 
      break; 
     case kAudioFormatUnsupportedDataFormatError: 
      NSLog(@"Error: audio format unsupported data format error"); 
      break; 
     case kAudioFormatUnknownFormatError: 
      NSLog(@"Error: audio format unknown format error"); 
      break; 
     default: 
      NSLog(@"Error: unknown audio format error"); 
      break; 
    } 
} 

CFDictionaryRef piDict = nil; 
UInt32 piDataSize = sizeof(piDict); 

error = AudioFileGetProperty(fileID, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict); 
if (error != noErr) 
    NSLog(@"AudioFileGetProperty failed for property info dictionary"); 

free(rawID3Tag); 

return (NSDictionary*)piDict; 
} 

나는 내가 MP3 파일의 앨범 아트를 얻을 수 kAudioFilePropertyAlbumArtwork을 통해 알고,하지만 난 그것을 얻을하는 방법을 모르겠어요.

+0

오디오를 스트리밍하는 경우 artwork/thumbnail을 가져올 수 없습니다. 아마도이 링크가 도움이 될 것입니다. "http://stackoverflow.com/questions/9723449/mpmovieplayercontroller-getting-thumbnail-from-streaming-video" –

+0

아니요 스트리밍 오디오 파일이 없습니다. 오디오 파일은 이미 앱에 다운로드됩니다. –

+0

시험해보십시오 http://stackoverflow.com/questions/6607401/get-album-artwork-from-id3-tag-convert-function-from-java-to-objective-c – Yomo710

답변

4
- (NSArray *)artworksForFileAtPath:(NSString *)path { 
NSMutableArray *artworkImages = [NSMutableArray array]; 
NSURL *u = [NSURL fileURLWithPath:path]; 
AVURLAsset *a = [AVURLAsset URLAssetWithURL:u options:nil]; 
NSArray *artworks = [AVMetadataItem metadataItemsFromArray:a.commonMetadata withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; 

for (AVMetadataItem *i in artworks) 
{ 
    NSString *keySpace = i.keySpace; 
    UIImage *im = nil; 

    if ([keySpace isEqualToString:AVMetadataKeySpaceID3]) 
    { 
     NSDictionary *d = [i.value copyWithZone:nil]; 
     im = [UIImage imageWithData:[d objectForKey:@"data"]]; 
    } 
    else if ([keySpace isEqualToString:AVMetadataKeySpaceiTunes]) 
     im = [UIImage imageWithData:[i.value copyWithZone:nil]]; 

    if (im) 
     [artworkImages addObject:im]; 
} 
NSLog(@"array description is %@", [artworkImages description]); 
return artworkImages; } 

위의 코드는 mp3 파일의 album_art를 반환합니다. 여기서 path는 오디오 파일 경로입니다.

+0

고마워, 작동 중입니다. – saturngod

+0

iOS 7에서 위와 같이 사용했지만 iOS 8에서는 치명적인 충돌이 발생합니다. 특히 [d objectForKey : @ "data"]는 인식 ​​할 수없는 선택기 예외를 발생시킵니다. –

관련 문제