gpt4 book ai didi

objective-c - iOS - 从 Objective-C 中的媒体获取 [Explicit] 和 [Clean] 标签

转载 作者:可可西里 更新时间:2023-11-01 03:30:11 30 4
gpt4 key购买 nike

当我在 iTunes 中查看我购买的音乐时,歌曲列表中的歌曲旁边会显示一个红色的露骨框。 IE。您在购买歌曲时看到的显式标签会传递到 iTunes 资料库。对于标记为干净的 itunes 歌曲也是如此。我真的很想能够识别我的 ios 应用程序中明确的任何歌曲,但我找不到任何关于标签是否与其他歌曲信息 (MPMediaItemProperty) 一起传递到 ios 设备的资源,如果是,如何传递得到它(我无休止地搜索!)有些歌曲在标题末尾包含“[Explicit],但这只是某些歌曲的情况,而不是全部。有谁知道标签是否存在并且可以从 Objective 读取-C代码?

最佳答案

好吧,这花了我好几个小时才找到!做好准备,它并不像使用 MPMediaQuery 那样简单。

概览

您需要的数据无法通过标准 channel 轻松访问(即 MediaPlayer 或 AVFoundation 框架中没有预定义的 key 来访问此元数据)。它可以通过大多数 ID3 标签编辑器使用,名称为 ITUNESADVISORY。这个标签可以有 3 个值:

0 - No advisory information

1 - Explicit

2 - Clean

这就是我们正在寻找的,但我们如何访问它。 MediaPlayer 框架级别相当高,这意味着我们可以访问/使用的数据有限。为了更深入地查看媒体文件,我们还需要使用 AVFoundation 框架。

操作方法

我不知道您使用的具体工作流程是什么,但我希望您可以根据自己的需要进行调整。为了确定媒体文件是否明确/干净,我做了如下操作:

  1. 我需要获取包含我要检查的文件的 MPMediaItem。我使用 MPMediaPickerController 执行此操作,呈现它,并通过其委托(delegate)方法检索选定的媒体项:

    - (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection {
    // Do whatever is appropriate in your case to extract the media items
    MPMediaItem* item = [mediaItemCollection.items objectAtIndex:...];
    ....
    }
  2. 一旦我有了我的 MPMediaItem,我就需要获得等效的 AVAsset,这样我才能使用 AVFoundation 框架。为此,我可以使用媒体项中的 URL 路径来创建 Assets 。

    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];
    ....
  3. 获得 Assets 后,我们需要从中获取元数据。根据实验,这是 iTunes 元数据。因此,让我们从我们的 Assets 中提取它。

    NSArray* metadata = [asset metadataForFormat:AVMetadataFormatiTunesMetadata];
  4. 这是有趣的、未记录的工作开始的地方。我们现在必须为我们想要的找到正确的元数据项。由于在 Apple 的任何文档中都没有将咨询 key 声明为常量,经过大量试验和错误后,我发现它是 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;
    }];
  5. 完成后,我们需要确定它是什么。这个比较简单,可以根据自己的需要进行调整。我刚刚写了一个简单的 switch 语句,说明歌曲/媒体的类型。 (记住:媒体文件完全有可能不包含建议标签,因此我们必须检查索引是否存在)

    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;
    }
    }

结论

这就是确定一首歌曲是干净的还是露骨的,或者两者都不是的方法。因为这是使用静态数字来查找咨询数据,并且没有链接到 Apple header 中定义的任何常量,所以我不能保证这适用于过去、现在和 future 的所有 iOS 版本。我已经在 iOS 6 上测试过了,似乎没问题。您的里程可能会有所不同。

很遗憾 Apple 没有提供开箱即用的此功能(即使他们只是提供了 Advisory Key)。如果您愿意,可以将此功能放在一个类别中。

关于objective-c - iOS - 从 Objective-C 中的媒体获取 [Explicit] 和 [Clean] 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208169/

30 4 0