- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我在 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
框架。
我不知道您使用的具体工作流程是什么,但我希望您可以根据自己的需要进行调整。为了确定媒体文件是否明确/干净,我做了如下操作:
我需要获取包含我要检查的文件的 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:...];
....
}
一旦我有了我的 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];
....
获得 Assets 后,我们需要从中获取元数据。根据实验,这是 iTunes 元数据。因此,让我们从我们的 Assets 中提取它。
NSArray* metadata = [asset metadataForFormat:AVMetadataFormatiTunesMetadata];
这是有趣的、未记录的工作开始的地方。我们现在必须为我们想要的找到正确的元数据项。由于在 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;
}];
完成后,我们需要确定它是什么。这个比较简单,可以根据自己的需要进行调整。我刚刚写了一个简单的 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/
所以我使用一个带有整个 block 的标签作为链接,它是一个产品展示,所以你点击它会转到产品页面。现在我创建了一个标签作为链接到购物车页面的按钮。所以我让它工作,但是当我点击购物车按钮时,两个页面都会
根据 Web 标准,创建带有标题 1 的链接的正确代码是什么? 是吗 stackoverflow 或 stackoverflow 谢谢 最佳答案 根据网络标准,您不能将 block 元素放入内
在Java中它是这样写的..当我移植这段代码时...意识到没有这样的东西 break 和continue . 我知道这些命令没有包含在内,因为在使用带有命令的 goto 时必须有一种更简洁的方法来执
我们有一个相当标准的发布过程,使用 Visual Source Safe 在发布之前标记构建。这允许我们在出现任何问题时从该标签中获取,并在需要更改时使用它进行分支。 我们有几个不同的项目,并且总是使
我必须创建一个搜索内容,其中包含搜索框、标题和段落描述。默认情况下,描述被禁用,当我输入一些与描述文本匹配的文本时,描述段落标签应该打开。一些匹配的演示是这样的: [ fiddle ][1] 但默认情
我一直在阅读有关 的文档标签,我似乎无法理解它与简单地使用 有何不同那是 display: none; 文档:template tag 例子 对比 例子
我需要一个脚本来复制当开关按钮打开时标记,当开关按钮关闭时删除标记。我需要一个简单的方法。这是开关按钮: 我试过这个: var change
JSF 是一个 MVC 框架,但我很困惑为什么我们已经有了这么多 HTML 标签还需要 JSF 标签。毫无疑问,JSF 简化了很多事情。我想进一步了解 JSF 中的模型 View 和 Controll
我在这个 website 上看到了那些 html 代码: Homepa
我添加了 photoswipe 插件,可以使用 搜索我的所有照片。标签,如果点击,照片就会变成全屏。我让它工作了,但现在我的导航栏(有 标签)在点击时会触发 photoswipe 插件。 在 ph
标签
我正在尝试截断显示自 的文本标签,但它不工作。我将样式应用于其他标签样式并且它确实有效(我看到的示例中没有一个使用 标签)。我想知道是否有人可以向我解释为什么会这样(我不是最擅长 HTML/CSS
HTML 是这样的: Menu 1 Menu 2 Sub menu 2
我可以更改 TextInputLayout 的位置 float 标签(底部 float 标签)吗?我需要为波纹管 float 标签设置正确的位置。 最佳答案 我解决了我的问题,这是我的 xml:
我的代码是 printMsg : function(data) { $("#message").html(data.bodyText); ... } 这里 data.body
我是 Scrapy 和 Xpath 的初学者,我正在寻找解析具有以下结构的网站 cat1 value1 value2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及
我必须从 xml 中解析数据。这是我的 xml- 或者它的 url 是:http://mobileecommerce.site247365.com/admin/catdata.xml News f
如何创建应该允许多行数据的标记。不要说使用textarea标签。我知道,但我只想 标记因为标签具有 value 属性。所以当我从 xml 文件获取值时,我应该使用 jquery 语法动态获取.. 最佳
我有一个页面使用我定义的某些样式。 在同一页面上,我刚刚导入了一个使用自己样式的外部 jQuery 插件,例如,包括 。被我自己覆盖的标签样式。 如何确保我的样式表中的样式不会覆盖 jQuery 插件
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我是一名优秀的程序员,十分优秀!