Je comprends que les mp3 contiennent parfois des illustrations d'albums (dans mon cas, je travaille avec des files podcast). Existe-t-il un moyen d'extraire datatables d'image à partir d'un file mp3?
Les MP3, y compris les podcasts, ont souvent des métadonnées incorporées, y compris des illustrations. La manière la plus simple d'get les métadonnées incorporées (pour les MP3 ne se trouvant pas dans la bibliothèque iTunes) est la class AVAsset
. Si vous essayez d'get des métadonnées sur un réseau, utilisez plutôt AVURLAsset
, mais l'access aux métadonnées est identique.
AVAsset
a une propriété NSArray
appelée commonMetadata
qui contient des instances de la class AVMetadataItem
. Vous pouvez itérer sur ce tableau pour find l'élément avec la commonKey
de (généralement) " artwork
" La propriété value
de cet AVMetadataItem
devrait être un NSDictionary
de données sur l'oeuvre. Dans ce dictionary, vous findez la key " data
" qui doit contenir datatables que vous pouvez utiliser pour build un UIImage
. Ceci est assez nested et cette description est certes confuse. Donc, voici un exemple de code.
NSURL *url = <# url of resource here #>; AVAsset *asset = [AVAsset assetWithURL:url]; for (AVMetadataItem *metadataItem in asset.commonMetadata) { if ([metadataItem.commonKey isEqualToSsortingng:@"artwork"]){ NSDictionary *imageDataDictionary = (NSDictionary *)metadataItem.value; NSData *imageData = [imageDataDictionary objectForKey:@"data"]; UIImage *image = [UIImage imageWithData:imageData]; // Display this image on my UIImageView property imageView self.imageView.image = image; } }
Encore une fois, il s'agit d'un exemple très simple de la façon de charger à partir d'une ressource locale; Si vous chargez ceci sur un réseau, vous devez utiliser un AVURLAsset
. Faites également attention à la nature bloquante de cet appel.
Jetez un oeil à l'exemple de projet AddMusic d' Apple et vous verrez comment ils obtiennent la pochette d'album via les objects MPMediaItem & MPMediaItemArtwork .
-(UIImage *)getMP3Pic:(NSURL *)url { AVAsset *asset = [AVAsset assetWithURL:url]; for (AVMetadataItem *metadataItem in asset.commonMetadata) { if ([metadataItem.commonKey isEqualToSsortingng:@"artwork"]){ return [UIImage imageWithData:(NSData *)metadataItem.value]; } } }