AVPlayer ne lance pas playbackBufferEmpty mais ne joue pas non plus

J'utilise AVPlayer pour jouer un livestream audio via internet. J'aime récupérer la lecture si elle a été mise en pause pendant plus d'une minute.

J'appelle player.rate = 1.0 pour reprendre. Cependant, si le stream a été suspendu pendant> 1 minute, il ne joue plus. J'ai besoin de recréer AVPlayerItem dans ce cas pour le faire fonctionner à nouveau.

Alors, comment puis-je attraper ce cas, alors je sais que la lecture n'a pas récupéré?

  • J'ai essayé KVO sur player.rate . Il rest à 1.0 si. Le joueur ne joue pas!
  • J'ai essayé KVO sur currentItem.playbackBufferEmpty . Il n'est pas appelé dans ce cas cependant.
  • currentItem.status ne passe pas à .Failed . Cela ne change pas du tout.

L'AVPlayer semble ne rien faire dans ce cas. Des idées?

Je construis un code Playground pour montrer le problème:

 import UIKit import AVFoundation // keep it running forever so it plays audio import XCPlayground XCPSetExecutionShouldContinueIndefinitely(true) class AVPlayerTest { let player = AVPlayer() let streamurl = NSURL(ssortingng: "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()