iOS AVFoundation:如何从mp3文件中获取作品?

我的代码:

- (void)metadata { AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.fileURL options:nil]; NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; NSArray *titles = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon]; NSArray *artists = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtist keySpace:AVMetadataKeySpaceCommon]; NSArray *albumNames = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyAlbumName keySpace:AVMetadataKeySpaceCommon]; AVMetadataItem *artwork = [artworks objectAtIndex:0]; AVMetadataItem *title = [titles objectAtIndex:0]; AVMetadataItem *artist = [artists objectAtIndex:0]; AVMetadataItem *albumName = [albumNames objectAtIndex:0]; if ([artwork.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSDictionary *dictionary = [artwork.value copyWithZone:nil]; self.currentSongArtwork = [UIImage imageWithData:[dictionary objectForKey:@"data"]]; } else if ([artwork.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { self.currentSongArtwork = [UIImage imageWithData:[artwork.value copyWithZone:nil]]; } self.currentSongTitle = [title.value copyWithZone:nil]; self.currentSongArtist = [artist.value copyWithZone:nil]; self.currentSongAlbumName = [albumName.value copyWithZone:nil]; self.currentSongDuration = self.audioPlayer.duration; } 

这适用于从m4a文件中获取图稿,但不适用于mp3文件。 如果asset指向一个mp3文件, artworks是空的。 我做错了什么,如何解决?

我发现这些作品是asynchronous加载的,而图像是同步设置的。 我这样解决了它:

 - (void)metadata { AVURLAsset *asset = [AVURLAsset URLAssetWithURL:self.fileURL options:nil]; NSArray *titles = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon]; NSArray *artists = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtist keySpace:AVMetadataKeySpaceCommon]; NSArray *albumNames = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyAlbumName keySpace:AVMetadataKeySpaceCommon]; AVMetadataItem *title = [titles objectAtIndex:0]; AVMetadataItem *artist = [artists objectAtIndex:0]; AVMetadataItem *albumName = [albumNames objectAtIndex:0]; NSArray *keys = [NSArray arrayWithObjects:@"commonMetadata", nil]; [asset loadValuesAsynchronouslyForKeys:keys completionHandler:^{ NSArray *artworks = [AVMetadataItem metadataItemsFromArray:asset.commonMetadata withKey:AVMetadataCommonKeyArtwork keySpace:AVMetadataKeySpaceCommon]; for (AVMetadataItem *item in artworks) { if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSDictionary *d = [item.value copyWithZone:nil]; self.currentSongArtwork = [UIImage imageWithData:[d objectForKey:@"data"]]; } else if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { self.currentSongArtwork = [UIImage imageWithData:[item.value copyWithZone:nil]]; } } }]; self.currentSongTitle = [title.value copyWithZone:nil]; self.currentSongArtist = [artist.value copyWithZone:nil]; self.currentSongAlbumName = [albumName.value copyWithZone:nil]; self.currentSongDuration = self.audioPlayer.duration; } 

我刚刚在这里find了答案: 如何从ios开发中的mp3文件提取元数据,现在正在查看为什么代码不能在m4a文件上工作。 我从你的代码中拿出了一点点,并提出了似乎适用于m4a和mp3的以下内容。 请注意,我把这个代码作为一个没有限定符的open else子句来工作 – 如果有人获得更多的经验,那么欢迎他们的提炼!

  - (void)getMetaDataForSong:(MusicItem *)musicItem { AVAsset *assest; // filePath looks something like this: /var/mobile/Applications/741647B1-1341-4203-8CFA-9D0C555D670A/Library/Caches/All Summer Long.m4a NSURL *fileURL = [NSURL fileURLWithPath:musicItem.filePath]; NSLog(@"%@", fileURL); assest = [AVURLAsset URLAssetWithURL:fileURL options:nil]; NSLog(@"%@", assest); for (NSString *format in [assest availableMetadataFormats]) { for (AVMetadataItem *item in [assest metadataForFormat:format]) { if ([[item commonKey] isEqualToString:@"title"]) { musicItem.strSongTitle = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"artist"]) { musicItem.strArtistName = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"albumName"]) { musicItem.strAlbumName = (NSString *)[item value]; } if ([[item commonKey] isEqualToString:@"artwork"]) { UIImage *img = nil; if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { img = [UIImage imageWithData:[item.value copyWithZone:nil]]; } else { // if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) { NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"]; img = [UIImage imageWithData:data] ; } musicItem.imgArtwork = img; } } } }