如何解决在SwiftUI中使用Combine观察AVPlayer currentItem timedMetadata;退货时不更新
我正在构建一个无线电应用程序,通过观察项目的timedMetadata来更新歌曲标题。第一次按播放时,当前的实现成功更新了歌曲标题。但是,如果我暂停播放,锁定屏幕,解锁屏幕并按播放,则即使播放同一首歌曲,元数据也为零。然后,如果歌曲改变,它就会神奇地再次开始更新。
这是我的观察班:
import Combine
import AVFoundation
class MetadataObserver {
@Published var songTitle: String?
private var itemObservation: AnyCancellable?
init(player: AVPlayer) {
itemObservation = player.currentItem?.publisher(for: \.timedMetadata).sink { metadata in
guard let title = metadata?.first?.value as? String else { return }
self.hymnTitle = title
}
}
}
这是我更新视图的方式
import SwiftUI
struct HymnNameView: View {
@ObservedObject var player: AudioPlayer
@State private var hymnName = "Song Title"
let metadataObserver: MetadataObserver
init(player: AudioPlayer) {
self.player = player
self.metadataObserver = MetadataObserver(player: player)
}
var body: some View {
Text(hymnName)
.onReceive(metadataObserver.$hymnTitle) { hymnName in
self.hymnName = hymnName ?? "Song Title"
}
}
}
SIDENOTE 我也收到此警告:“'timedMetadata'在iOS 13.0中已过时:使用AVPlayerItemMetadataOutput获取定时的元数据”。如果有人知道如何使用AVPlayerItemMetadataOutput并解决我的问题,请告诉我!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。