有没有办法知道 AVPlayer
的播放是否停顿或已经结束?
player.timeControlStatus == AVPlayer.TimeControlStatus.playing
let playerObserver = self.player.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, preferredTimescale: 1), queue: DispatchQueue.main, using: { [weak self] time in
if self?.player.timeControlStatus == .playing {
debugPrint("#player - info: isPlaying")
self?.playButton.isSelected = true
} else if self?.player.timeControlStatus == .paused {
debugPrint("#player - info: isPaused")
self?.playButton.isSelected = false
} else if self?.player.timeControlStatus == .waitingToPlayAtSpecifiedRate {
debugPrint("#player - info: isWaiting") //Buffering
}
})
AsyncStream
版本。extension AVPlayer {
func isPlaying() -> AsyncStream<Bool> {
AsyncStream { cont in
let observation = self.observe(\.rate) { player, value in
cont.yield(player.timeControlStatus == .playing)
}
cont.yield(timeControlStatus == .playing)
cont.onTermination = { _ in
observation.invalidate()
}
}
}
}
let stream = player.isPlaying()
for await isPlaying in stream {
self.isPlaying = isPlaying
}
.task
中使用它。.task {
let stream = player.isPlaying()
for await isPlaying in stream {
self.isPlaying = isPlaying
}
}