我使用AVPlayer通过互联网播放音频直播。如果暂停时间超过1分钟,我想恢复播放。
我调用player.rate = 1.0
来恢复播放。然而,如果流被暂停超过1分钟,则不再播放。在这种情况下,我需要重新创建AVPlayerItem才能使其再次工作。
那么我该如何捕获这种情况,以便知道播放没有恢复?
- 我尝试了对
player.rate
进行KVO。但它仍然保持为1.0
。播放器没有播放! - 我尝试了对
currentItem.playbackBufferEmpty
进行KVO。但在这种情况下它没有被调用。 currentItem.status
没有切换到.Failed
。它根本没有改变。
在这种情况下,AVPlayer似乎什么也没做。有什么想法吗?
我构建了一个Playground代码来演示这个问题:
import UIKit
import AVFoundation
// keep it running forever so it plays audio
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely(true)
class AVPlayerTest {
let player = AVPlayer()
let streamurl = NSURL(string: "http://detektor.fm/stream/mp3/musik/")!
func startTest() {
let item = AVPlayerItem(URL: streamurl)
player.replaceCurrentItemWithPlayerItem(item)
player.play()
// give it some start time to build a buffer
NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: #selector(timerTickedToPause), userInfo: nil, repeats: false)
}
@objc func timerTickedToPause(timer: NSTimer) {
player.pause()
// pause now for some time. 90s is not enough.
NSTimer.scheduledTimerWithTimeInterval(120, target: self, selector: #selector(timerTickedToPlay), userInfo: nil, repeats: false)
}
@objc func timerTickedToPlay(timer: NSTimer) {
// try to resume playback
print(player.rate)
player.play()
print(player.rate)
// check in some seconds if it recovered
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: #selector(timerTickedCheck), userInfo: nil, repeats: false)
}
@objc func timerTickedCheck(timer: NSTimer) {
// it reports rate = 1.0 but is not playing here though!
// there is no way to know for me it did not recover here!?
print(player.rate)
// recover by creating a new item works
let item = AVPlayerItem(URL: streamurl)
player.replaceCurrentItemWithPlayerItem(item)
player.play()
}
}
let test = AVPlayerTest()
test.startTest()
AVPlayerItem
。然而,我需要知道它是否失败了。 - funkenstrahlenplayer.pause()
和player.play()
就像苹果在其文档中所述的那样,相当于将player.rate
设置为0
或1
。调用player.rate = 1
后,它不会播放,但rate
保持在1
。 - funkenstrahlen