有没有一种方法来从ios中从mp3中提取embedded的图像数据

据我所知,MP3有时包含专辑封面(在我的情况下,我正在使用播客文件)。 有没有办法在iOS从一个MP3文件中提取图像数据?

包括播客在内的MP3经常包含embedded的元数据,包括艺术作品。 获取embedded式元数据(对于不在iTunes库中的MP3)最简单的方法是通过AVAsset类。 如果您尝试通过networking获取元数据,请改用AVURLAsset ,但访问元数据与两者中的元数据相同。

AVAsset具有名为commonMetadataNSArray属性,其中包含类AVMetadataItem实例。 你可以遍历这个数组来查找具有commonKey (通常是)“ artwork ”的元素。这个commonKeyvalue属性应该是一个关于这个图片的NSDictionary数据。 在这个字典中,你会发现关键的“ data ”应该包含你可以用来构造一个UIImage 。 这是相当嵌套的,这种描述无疑是令人困惑的。 所以这里是一个代码示例。

 NSURL *url = <# url of resource here #>; AVAsset *asset = [AVAsset assetWithURL:url]; for (AVMetadataItem *metadataItem in asset.commonMetadata) { if ([metadataItem.commonKey isEqualToString:@"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; } } 

再次,这是一个非常简单的如何从本地资源加载的例子; 如果你通过networking加载,你应该使用AVURLAsset 。 也要注意这个调用的阻塞性质。

看看苹果的示例AddMusic项目,你会看到他们如何通过MPMediaItem和MPMediaItemArtwork对象获取专辑封面。

 -(UIImage *)getMP3Pic:(NSURL *)url { AVAsset *asset = [AVAsset assetWithURL:url]; for (AVMetadataItem *metadataItem in asset.commonMetadata) { if ([metadataItem.commonKey isEqualToString:@"artwork"]){ return [UIImage imageWithData:(NSData *)metadataItem.value]; } } }