AVPlayer を使用して、インターネット経由でオーディオ ライブ ストリームを再生します。一時停止が 1 分を超えた場合は、再生を回復するのが好きです。
player.rate = 1.0
再開するよう呼びかけます。ただし、ストリームが 1 分以上一時停止された場合、それ以上は再生されません。この場合、再び機能させるには、AVPlayerItem を再作成する必要があります。
では、どうすればこのケースを見つけて、再生が回復しなかったことを知ることができますか?
- KVO on を試してみました
player.rate
。それはそのまま1.0
です。プレイヤーはプレイしていません! - KVO on を試してみました
currentItem.playbackBufferEmpty
。ただし、この場合は呼び出されません。 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()