iOS-从Objective-C中的媒体获取[Explicit]和[Clean]标记
当我在iTunes中查看购买的音乐时,在歌曲列表中,显式歌曲旁边会显示一个红色的显式框。也就是说,购买歌曲时看到的显式标签会传递到iTunes库。itunes标记为clean的歌曲也是如此。我真的很想能够识别ios应用程序中明确显示的任何歌曲,但我找不到任何关于标签是否通过其他歌曲信息(MPMediaItemProperty)传递到ios设备的资源,如果是,如何获取它(我已经搜索了无数次!)一些歌曲包括“[明确]在他们的标题末尾,但这只是一些歌曲的情况,而不是全部。有人知道标签是否存在并且可以从Objective-C代码中读取吗?好吧,这花了我好几个小时才找到!做好准备,这并不像使用iOS-从Objective-C中的媒体获取[Explicit]和[Clean]标记,objective-c,ios,avfoundation,explicit,mpmediaquery,Objective C,Ios,Avfoundation,Explicit,Mpmediaquery,当我在iTunes中查看购买的音乐时,在歌曲列表中,显式歌曲旁边会显示一个红色的显式框。也就是说,购买歌曲时看到的显式标签会传递到iTunes库。itunes标记为clean的歌曲也是如此。我真的很想能够识别ios应用程序中明确显示的任何歌曲,但我找不到任何关于标签是否通过其他歌曲信息(MPMediaItemProperty)传递到ios设备的资源,如果是,如何获取它(我已经搜索了无数次!)一些歌曲包括“[明确]在他们的标题末尾,但这只是一些歌曲的情况,而不是全部。有人知道标签是否存在并且可以从
MPMediaQuery
那么简单
概述
您需要的数据不容易通过标准通道访问(即MediaPlayer或AVFoundation框架中没有预定义的键来访问此元数据)。它可以通过大多数ID3标记编辑器使用,名称为ITUNESADVISORY
。此标记可以取3个值:
0-无咨询信息
1-明确的
2-清洁
这就是我们要寻找的,但我们如何访问它。MediaPlayer
框架的级别相当高,这意味着我们只能访问/使用哪些数据。为了更深入地查看媒体文件,我们还需要使用AVFoundation
框架
如何
我不知道您使用的确切工作流是什么,但我希望您可以根据自己的需要对其进行调整。为了确定媒体文件是否明确/干净,我执行了以下操作:
MPMediaItem
。我使用MPMediaPickerController
进行了此操作,并展示了它,并通过其委托方法检索了选定的媒体项:
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
// Do whatever is appropriate in your case to extract the media items
MPMediaItem* item = [mediaItemCollection.items objectAtIndex:...];
....
}
MPMediaItem
,我需要获得等效的AVAsset
,这样我就可以使用AVFoundation
框架。为此,我可以使用媒体项的URL路径来创建资产
MPMediaItem* item = ...;
NSURL* path = [item valueForProperty:MPMediaItemPropertyAssetURL];
// We have to check if a path exists, because a media item may not be present on the device. Blame iTunes Match.
if (path) {
AVAsset* asset = [AVAsset assetWithURL:path];
....
NSArray* metadata = [asset metadataForFormat:AVMetadataFormatiTunesMetadata];
1920233063
要获取正确的元数据项,我们需要对元数据数组执行筛选,如下所示:
NSUInteger advisoryIndex = [metadata indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[AVMetadataItem class]]) {
AVMetadataItem* metaItem = (AVMetadataItem*)obj;
NSNumber* advisoryKeyTest = @(1920233063);
if ([metaItem.key isEqual:advisoryKeyTest]) {
*stop = YES;
return YES;
}
return NO;
}
return NO;
}];
遗憾的是,苹果没有提供这种开箱即用的功能(即使他们只是提供了建议密钥)。如果您愿意,可以将此功能放在一个类别中。哇,非常感谢您解决了此问题。我想您一定是唯一发现此问题的人,因为在我所有的搜索中,我找不到任何人使用此功能。非常感谢!花了大量时间四处挖掘,并牺牲了一些我的音乐使其清晰/明确(!),但我很高兴能帮上忙:)@Adam你是在使用iTunes Match,还是在同步时为设备重新编码音乐?我今天实现了这一点,不幸的是,我发现这不是一个完整的解决方案,因为我的一些库显式歌曲没有该键,有些只有iTunes和iTunesMPB键。我想这可能意味着显式信息根本不存在对于所有曲目来说,这真是太丢脸了。我想可能是明确的标签实际上在iTunorm或iTunSMPB键的值范围内,对于使用它们而不是数字命名键(如1920233063)的歌曲来说,这是一种替代方式——不幸的是,我对这一领域一无所知。
if (advisoryIndex != NSNotFound) {
AVMetadataItem* metaItem = [metadata objectAtIndex:advisoryIndex];
NSInteger advisoryValue = [metaItem.numberValue integerValue];
switch (advisoryValue) {
case 0:
NSLog(@"%@", @"Unspecified");
break;
case 1:
NSLog(@"%@", @"Explicit");
break;
case 2:
NSLog(@"%@", @"Clean");
break;
default:
NSLog(@"%@", @"Unexpected Value");
break;
}
}