2013-10-17 17 views
9

Quando si utilizza AVPlayer per riprodurre l'audio da un url, si interromperà la riproduzione di quando, per esempio, si disconnette dal wifi.AVPlayer: come gestire le interruzioni di rete

[player play]; 

non riprenda l'AVPlayer

player.rate // Value is 1.0 

player.currentItem.isPlaybackLikelyToKeepUp // Value is YES 

player.status // Value is AVPlayerStatusReadyToPlay 

player.error // Value is nil 

Ma il giocatore non sta giocando alcun audio.

Come si gestisce una disconnessione da AVPlayer, per ricollegare AVPlayer e avviare la riproduzione?

+0

Non sono sicuro di quando si gioca solo l'audio, ma per il video, ascoltare 'AVPlayerItemFailedToPlayToEndTimeNotification' come suggerito in altre risposte. Inoltre sembra che per gli streaming video live di HLS, dobbiamo ricreare l'AVPlayerItem e impostarlo su AVPlayer. Basta chiamare 'play()', fare la ricerca ecc non sembra funzionare per noi. Alla ricerca di una soluzione migliore in questo momento, ma questo è il migliore che conosco a questo punto. Anche se avplayeritem ha '.status' fallito, dobbiamo anche ricrearlo (la mia ipotesi). – Jonny

risposta

11

Per gestire le modifiche di rete, è necessario aggiungere un osservatore per AVPlayerItemFailedToPlayToEndTimeNotification.

- (void) playURL:(NSURL *)url 
{ 
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemFailedToPlayToEndTime:) name:AVPlayerItemFailedToPlayToEndTimeNotification object:playerItem]; 
    self.player = [AVPlayer playerWithPlayerItem:playerItem]; 
    [self.player play]; 
} 

- (void) playerItemFailedToPlayToEndTime:(NSNotification *)notification 
{ 
    NSError *error = notification.userInfo[AVPlayerItemFailedToPlayToEndTimeErrorKey]; 
    // Handle error ... 
} 
0

di 0xced risposta a Swift 3:

var playerItem: AVPlayerItem? 
var player: AVPlayer? 

func instantiatePlayer(_ url: URL) { 
    self.playerItem = AVPlayerItem(url: url)    
    self.player = AVPlayer(playerItem: self.playerItem) 
     NotificationCenter.default.addObserver(self, selector: #selector(playerItemFailedToPlay(_:)), name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime, object: nil) 
} 

func playerItemFailedToPlay(_ notification: Notification) { 
    let error = notification.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? Error 

} 
Problemi correlati