使用SwiftUI获取AVPlayerItem曲目标题



我正在尝试创建一个广播应用程序,它可以从http流中流式传输音频。

我试图从流媒体中获取当前播放曲目的标题,但我能找到的只是不推荐使用的方法。

我的模型是这样的:

struct RadioStreamer {
let streamingURL: URL
private let player: AVPlayer?
private let playerItem: AVPlayerItem?
init(streamingURL: URL) {
self.streamingURL = streamingURL
self.playerItem = AVPlayerItem(url: self.streamingURL)
self.player = AVPlayer(playerItem: self.playerItem)
}
public func playStreaming() { self.player?.play() }
}

我的内容视图如下:

let streamer = RadioStreamer(streamingURL: URL(string: "MY-STREAMING-URL")!)
var body: some View {
VStack {
Text("HERE I WANT THE TRACK TITLE")
Button(action: {
self.streamer.playStreaming()
}) {
Text("Play")
}
}
}

如何在SwiftUI中使用不推荐使用的方法获取曲目标题?

谢谢!

当引用类型更可取时,就会出现这种情况。下面是可能方法的简化演示

import AVKit
import Combine
class RadioStreamer: NSObject, ObservableObject {
@Published var itemTitle: String = "Unknown"
let streamingURL: URL
private let player: AVPlayer?
private let playerItem: AVPlayerItem?
init(streamingURL: URL) {
self.streamingURL = streamingURL
self.playerItem = AVPlayerItem(url: self.streamingURL)
self.player = AVPlayer(playerItem: self.playerItem)
super.init()
// setup output for player item metadata
let metaOutput = AVPlayerItemMetadataOutput(identifiers: [ // nil, for all
// specify needed meta to be output, 
AVMetadataIdentifier.commonIdentifierTitle.rawValue     
])
metaOutput.setDelegate(self, queue: DispatchQueue.main)
self.playerItem?.add(metaOutput)
}
public func playStreaming() { self.player?.play() }
}
extension RadioStreamer: AVPlayerItemMetadataOutputPushDelegate {
func metadataOutput(_ output: AVPlayerItemMetadataOutput, didOutputTimedMetadataGroups groups: [AVTimedMetadataGroup], from track: AVPlayerItemTrack?) {
// simplest demo, in common case iterate all groups and all items in group
// to find what you need if you requested many metadata
if let group = groups.first,
let item = group.items.first {
self.itemTitle = item.stringValue ?? "Unknown"
}
}
}

我遇到了信息从未更改的问题。在更改了一行代码后,魔术开始发挥作用:

更改以下行:

let metaOutput = AVPlayerItemMetadataOutput(identifiers: [ // nil, for all
// specify needed meta to be output, 
AVMetadataIdentifier.commonIdentifierTitle.rawValue     
])

到以下行:

let metaOutput = AVPlayerItemMetadataOutput(identifiers: nil)
metaOutput.setDelegate(self, queue: DispatchQueue.main)

最新更新