【发布时间】:2011-10-18 21:58:24
【问题描述】:
我了解 mp3 有时包含专辑插图(在我的情况下,我正在处理播客文件)。 iOS 中有没有办法从 mp3 文件中提取图像数据?
【问题讨论】:
标签: iphone objective-c ios image mp3
我了解 mp3 有时包含专辑插图(在我的情况下,我正在处理播客文件)。 iOS 中有没有办法从 mp3 文件中提取图像数据?
【问题讨论】:
标签: iphone objective-c ios image mp3
MP3(包括播客)通常具有嵌入的元数据,包括艺术作品。获取嵌入元数据(对于不在 iTunes 库中的 MP3)的最简单方法是通过 AVAsset 类。如果您尝试通过网络获取元数据,请改用AVURLAsset,但访问元数据与任何一个都相同。
AVAsset 有一个名为commonMetadata 的NSArray 属性,其中包含AVMetadataItem 类的实例。您可以遍历此数组以找到具有(通常)“artwork”的commonKey 的元素此AVMetadataItem 的value 属性应该是有关艺术品数据的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;
}
}
这又是一个如何从本地资源加载的非常简单的示例;如果您通过网络加载它,您应该使用AVURLAsset。还要注意此调用的阻塞性质。
【讨论】:
看看 Apple 的示例 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];
}
}
}
【讨论】: