【发布时间】:2018-10-31 09:26:36
【问题描述】:
我正在为 iOS 开发一个现场音乐流媒体应用程序。我想要做的是,提取当前正在播放的音乐的元数据值。元数据存储在 URL 中。现在写,我可以将其提取为元数据。
Optional([<AVMetadataItem: 0x600001c69860, identifier=common/title, keySpace=comn, key class = __NSCFConstantString, key=title,
commonKey=title, extendedLanguageTag=(null), dataType=(null),
time={19392/22050 = 0.879}, duration={INVALID}, startDate=(null),
extras={ }, value class=__NSCFString, value=Electricity - Silk City &
Dua Lipa f./Diplo - 03:39 >])
问题是元数据项中只有一个通用键,即“标题”。这个公共键的值由歌曲标题、艺术家和歌曲持续时间组成。如何从这个公用键中仅提取艺术家值..
这就是我提取元数据的方式。
我为关键路径“timedMetadata”向 AVPlayerItem 添加了一个观察者
playerItem.addObserver(self, forKeyPath: "timedMetadata", options: [], context: nil)
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath != "timedMetadata" { return }
var data: AVPlayerItem = object as! AVPlayerItem
for item in data.timedMetadata as! [AVMetadataItem] {
if let stringValue = item.value as? String {
//print(item.commonKey)
if item.commonKey!.rawValue == "title" {
print(stringValue.description)
}
}
}
}
将此作为值:Electricity - Silk City & Dua Lipa f./Diplo - 03:39
此值包含歌曲名称、歌曲艺术家和歌曲持续时间。我想要的是只获得歌曲艺术家作为价值。元数据会针对当前正在播放的每首歌曲更改其值。
【问题讨论】:
-
我猜使用developer.apple.com/documentation/avfoundation/… 和目标developer.apple.com/documentation/avfoundation/… 你应该只能得到艺术家。但是如果音频项目在
title部分中没有提供好的信息(混合标题+作者+持续时间),您需要自己解析它,但这可能会因每个项目而改变。 -
查看了苹果文档,但仍然无法找到解决此问题的方法。如果音频只有一个公共密钥,是否可以只提取作者?
标签: swift metadata avasset avplayeritem