我正在构建一个音乐应用程序,我试图用这段代码获取MP3文件元数据:
for (NSString *format in [assest availableMetadataFormats]) {
for (AVMetadataItem *item in [assest metadataForFormat:format]) {
if ([[item commonKey] isEqualToString:@"title"]) {
[SongNameMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
}
if ([[item commonKey] isEqualToString:@"artist"]) {
[ArtistMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
}
if ([[item commonKey] isEqualToString:@"albumName"]) {
}
if ([[item commonKey] isEqualToString:@"artwork"]) {
UIImage *img = nil;
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) {
img = [UIImage imageWithData:item.dataValue];
}
else {
NSDictionary *dict ;
[item.value copyWithZone:nil];
img = [UIImage imageWithData:[dict objectForKey:@"data"]];
}
}
}
}密码很好用。唯一的情况是,当可变数组被填充时,它们会按照以下方式进行填充:
因为并非所有的歌曲都有一个艺术家在元数据中。
根据代码的这个特定部分
if ([[item commonKey] isEqualToString:@"artist"]) {
[ArtistMutableArray addObject:[NSString stringWithFormat:@"%@",[item value]]];
}如果找到的项目是艺术家,则将其插入数组中。
现在我的问题是,当一首歌在元数据中没有艺术家时,如何检测?这样我就可以在ArtistMutableArray => Artists1中插入"null“,null,Artist3,null,Artist 5,ArtistX;
我尝试过的:
if ([[item commonKey] isEqualToString:@"null"])
if ([[item value] isEqualToString:@"null"])我不知道我在这里错过了什么。
发布于 2018-03-15 23:13:51
你所做的每一件事都需要做不同的事情。不要将数据分割成单独的数组,特别是如果您希望每个数组具有相同数量的元素,并且每个相应的索引都引用相同的资产。
相反,定义一个类,其中包含要跟踪的每个资产的几个属性。然后有一个这些类实例的数组。然后无需担心保持多个数组的同步,并通过在需要时向数组中添加"null“值来执行技巧。
拥有一个数据数组还有许多其他好处。例如,排序。例如,通过拥有一个数组,您可以按艺术家对数据数组进行排序。在排序或过滤时试图保持多个数组的同步是一个巨大的痛苦。
因为您只获得了常见的元数据,所以不需要对所有格式进行迭代并查看每种格式的属性。只需使用资产的commonMetadata属性即可。
获取commonKey值时,不要将其与硬编码字符串进行比较。使用API提供的常量,如AVMetadataCommonKeyAlbumName。
由于每个元数据项只能有一个commonKey值,所以使用if/else可以提高代码的效率。并使用元数据项的stringValue属性获得字符串值,而不是使用stringWithFormat。
这里是元数据类的一个开始。请按您认为合适的名称命名,并添加所需的任何其他属性。
@interface MyMetaData: NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *artist;
@property (nonatomic, copy) NSString *albumName;
@property (nonatomic, copy) UIImage *artwork;
@end
@implementation MyMetaData
@end下面是您在问题中发布的代码的替代品:
NSMutableArray *metadata = [NSMutableArray array]; // your array of obtained metadata
AVAsset *asset = // some asset
MyMetaData *data = [[MyMetaData alloc] init];
NSArray *commonData = asset.commonMetadata;
for (AVMetadataItem *item in commonData) {
AVMetadataKey key = item.commonKey;
if ([key isEqual: AVMetadataCommonKeyTitle]) {
data.title = item.stringValue;
} else if ([key isEqual:AVMetadataCommonKeyArtist]) {
data.artist = item.stringValue;
} else if ([key isEqual:AVMetadataCommonKeyAlbumName]) {
data.albumName = item.stringValue;
} else if ([key isEqual:AVMetadataCommonKeyArtwork]) {
data.artwork = // your code to get the image
}
}
[metadata addObject:data];这要干净得多,您现在只有一个数组需要处理。如果给定的资产没有数据,比如说艺术家,那么这个值只是在给定的nil实例上保持为MyMetaData。
https://stackoverflow.com/questions/49310363
复制相似问题