我一直在尝试从iPhone应用的.mp3文件中提取元数据信息。我尝试使用像this这样的AVAsset
。它不起作用,常见的元数据是空的。但是大胆和来自应用商店的另一个iOS应用可以检索元数据细节。我不知道为什么?。
因此,我尝试使用AudioToolBox
框架
CFDictionaryRef piDict = nil;
UInt32 piDataSize = sizeof(piDict);
// Populates a CFDictionary with the ID3 tag properties
err = AudioFileGetProperty(fileID, kAudioFilePropertyInfoDictionary, &piDataSize, &piDict);
if(err != noErr) {
NSLog(@"AudioFileGetProperty failed for property info dictionary");
return nil;
}
// Toll free bridge the CFDictionary so that we can interact with it via objc
NSMutableDictionary* nsDict = [(__bridge NSDictionary*)piDict mutableCopy];
这返回了除专辑封面之外的所有内容。当我尝试使用kAudioFilePropertyAlbumArtwork
提取专辑封面时,出现osstatus
错误(操作无法完成)。
最后,我尝试使用ObjC
包装器为libId3(找到here)运气。它工作得很好。我可以得到艺术品。
我的问题是,为什么AVAsset
无法检索数据?我在那里错过了什么?有人设法让它工作吗?我们将不胜感激。
为什么kAudioFilePropertyAlbumArtwork
提取无法完成?这两个问题都发生在我拥有的所有.mp3文件中。
解决方案更新:
AVAsset
对我不起作用,因为我使用
[NSURL URLWithString:[filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]
而不是
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
答案 0 :(得分:7)
要使用AVAsset提取元数据信息,this post非常有用。您需要以下代码:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"mp3"];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
AVAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
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 *dict = [item.value copyWithZone:nil];
self.imageView.image = [UIImage imageWithData:[dict objectForKey:@"data"]];
} else if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
self.imageView.image = [UIImage imageWithData:[item.value copyWithZone:nil]];
}
}
}];
答案 1 :(得分:1)
NSURL *fileURL1 = [NSURL fileURLWithPath:url];
AVAsset *asset = [AVAsset assetWithURL:fileURL1];
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];
imageThumb.image = image;
}
}