3

我一直在尝试从 iPhone 应用程序的 .mp3 文件中提取元数据信息。我试过AVAsset这样使用。不起作用,常见的元数据是空的。但是 audacity 和来自应用商店的另一个 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错误(操作无法完成)。

所以最后,我用ObjClibId3 的包装器试试运气(在此处找到)。它工作得很好。我可以得到艺术品。

我的问题是,为什么AVAsset无法检索数据?我在那里想念什么?有人设法让它工作吗?样品将不胜感激。

为什么kAudioFilePropertyAlbumArtwork提取无法完成?这两个问题都发生在我拥有的所有 .mp3 文件中。

解决方案更新:

AVAsset对我不起作用,因为我使用了我的网址

 [NSURL URLWithString:[filePath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]

而不是

    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
4

2 回答 2

7

要使用 AVAsset 提取元数据信息,这篇文章很有用。以下代码是您需要的:

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]];
        }
    }
}];
于 2013-05-02T06:15:42.180 回答
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;
    }
}
于 2014-03-24T12:34:04.357 回答