Play Stream with Poor Internet Access in AVPlayer

When AVPlayer plays an asset that comes from a network stream, it pauses when it reaches the end of the downloaded content.

So my question is: how do I know if it has stopped due to a bad network? And how to play it after loading, say, the next 10 seconds of an asset?

+6
source share
2 answers

You can add an observer when AVPlayer receives an empty buffer:

[[self.tracksPlayer currentItem] addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil]; 

And an observer, so you know when AVPlayer is buffered enough to keep up:

 [[self.tracksPlayer currentItem] addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil]; 

Then just check this in your KVO callback:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == [self.tracksPlayer currentItem] && [keyPath isEqualToString:@"playbackBufferEmpty"]) { if ([self.tracksPlayer currentItem].playbackBufferEmpty) { NSLog(@"Buffer Empty"); } } else if (object == [self.tracksPlayer currentItem] && [keyPath isEqualToString:@"playbackLikelyToKeepUp"]) { if ([self.tracksPlayer currentItem].playbackLikelyToKeepUp) { NSLog(@"LikelyToKeepUp"); } } } 
+6
source

For quick

 1) let playbackLikelyToKeepUpContext = UnsafeMutablePointer<(Void)>(nil) or let playbackLikelyToKeepUpContext = UnsafeMutablePointer<(Void)>() 2) //Add Observer player.addObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp", options: NSKeyValueObservingOptions.New, context: playbackLikelyToKeepUpContext) player.play() 3) //Add observer override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { guard keyPath != nil else { // a safety precaution super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) return } if (context == playbackLikelyToKeepUpContext) { if (player.currentItem!.playbackLikelyToKeepUp) { player.play() Utilities.hideHUD(self.view) } else { Utilities.showHUD(self.view) } } } 4) // Remove Observer override func viewDidDisappear(animated: Bool) { player.removeObserver(self, forKeyPath: "currentItem.playbackLikelyToKeepUp") } 
+3
source

All Articles