Existe-t-il un moyen d'extraire des données d'image embarquées à partir d'un mp3 dans ios

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]; } } }