如何从iOS上的音频文件中提取元数据
我正在尝试使用AVFoundation框架从mp3和m4a文件中提取元数据。
这是测试代码:
+ (void)printMetadataForFileAtPath:(NSString *)path { NSURL *url = [NSURL fileURLWithPath:path]; AVAsset *asset = [AVURLAsset assetWithURL:url]; NSArray *availableFormats = [asset availableMetadataFormats]; NSLog(@"Available formats: %@", availableFormats); NSArray *iTunesMetadata = [asset metadataForFormat:AVMetadataFormatiTunesMetadata]; for (AVMetadataItem *item in iTunesMetadata) { NSLog(@"%@ %x", item.key, [(NSNumber *)item.key integerValue]); if ([item.key isEqual:AVMetadataiTunesMetadataKeySongName]) { NSLog(@"FOUND song name: %@", item.stringValue); } } NSLog(@"===================="); NSLog(@"%@ %@ %@", AVMetadataiTunesMetadataKeySongName, AVMetadataiTunesMetadataKeyAlbum, AVMetadataiTunesMetadataKeyArtist); }
这是输出:
Available formats: ( "com.apple.itunes", "com.apple.quicktime.udta" ) -1452383891 a96e616d -1455336876 a9415254 1631670868 61415254 -1451789708 a9777274 -1453233054 a9616c62 -1452838288 a9677270 -1452841618 a967656e 1953655662 74726b6e 1684632427 6469736b -1453039239 a9646179 -1453101708 a9636d74 1668311404 6370696c 1885823344 70676170 1953329263 746d706f -1451987089 a9746f6f com.apple.iTunes.iTun com.apple.iTunes.Enco 1668249202 636f7672 -1452508814 a96c7972 ==================== @nam @alb @ART
当解释为4个ASCII字符时:
© nam © ART a ART © wrt © alb © grp © gen trkn disk © day © cmt cpil pgap tmpo © too
因此,似乎item.key
是一个NSNumber
对象,但以AVMetadataiTunesMetadataKey...
开头的常量是NSString
对象。 获取元数据的正确方法是什么? 当我使用[AVAsset commonMetadata]
,键也是NSString
对象,并且与AVMetadataCommonKey...
常量的比较按预期工作。
处理元数据时,AVFoundation API非常混乱。
AVMetadataiTunesMetadataKey *值定义的键与AVMetadataItem的键属性值不同。 AVMetadataiTunesMetadataKey *键将与[AVMetadataItem metadataItemsFromArray:withKey:keySpace:AVMetadataKeySpaceiTunes]
API一起使用,以使用特定的iTunes密钥过滤掉元数据项。
AVMetadataItem的键和值取决于资源文件的确切格式。 除了使用上述函数过滤掉键之外,我建议使用item的commonKey属性,该属性提供比其他属性更通用的“键”属性。
更改示例代码以打印出commonKey以及项目的值 。 这里有些例子:
- commonKey是“title” – value是一个带有歌曲标题的NSString
- commonKey是’artist’ – value是与歌曲艺术家的NSString
- commonKey是’albumName’ – value是一个带有专辑名称的NSString
希望这可以帮助!