我正在为iOS开发一个实时音乐流应用程序。我想做的是,提取当前正在播放的音乐的元数据值。元数据存储在URL中。现在写,我能够将其提取为metaData。
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 >])
问题在于元数据项中只有一个公用密钥,即“ title”。此公用密钥的值包括歌曲标题,艺术家和歌曲持续时间。我该如何从此公用密钥中仅提取演出者价值。
这是我提取元数据的方式。
我在AVPlayerItem的关键路径“ timedMetadata”中添加了一个观察者
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
此值包含歌曲标题,歌曲艺术家和歌曲持续时间。我想要的只是获得歌手的价值。元数据会更改当前正在播放的每首歌曲的值。
答案 0 :(得分:-1)
最后找到了解决此问题的方法。
我得到的值由一个公共字符(-)分隔。我所做的就是将单个字符串转换为字符串数组。
let stringValueArray = stringValue.components(separatedBy: "-")
let title = stringValueArray[0]
let author = stringValueArray[1]
let duration = stringValueArray[2]
我知道这可能不是正确的方法,但仍然可行。