Handle streaming events with AVPlayer Handle streaming events with AVPlayer xcode xcode

Handle streaming events with AVPlayer


For the first question

You can refer to my answer on this topic ios avplayer trigger streaming is out of buffer

For the second

Here is how I solved this same problem:

Inside where you handle the event for buffer empty add this code:

    if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])    {        if (playerItem.playbackBufferEmpty) {            [[NSNotificationCenter defaultCenter] postNotificationName:@"message" object:@"Buffering..."];                        if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)            {                task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void) {                }];            }        }    }

Now you will have to stop this background task after your buffer is ready to go again:

if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"]){    if (playerItem.playbackLikelyToKeepUp)    {        [player play];                if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)        {            [[UIApplication sharedApplication] endBackgroundTask:task];            task = 0;        }    }}

ps: task is declared on my .h file as UIBackgroundTaskIdentifier task;


I have found the solution to this problem.

if (self.avPlayer.currentItem.playbackLikelyToKeepUp == NO) {    // Show activity indicator}


For Swift 3

This works fine for me, maybe it can help, call self?.bufferState() inside addPeriodicTimeObserver

    private func bufferState() {    if let currentItem = self.avPlayer.currentItem {        if currentItem.status == AVPlayerItemStatus.readyToPlay {            if currentItem.isPlaybackLikelyToKeepUp {                print("Playing ")            } else if currentItem.isPlaybackBufferEmpty {                print("Buffer empty - show loader")            }  else if currentItem.isPlaybackBufferFull {                print("Buffer full - hide loader")            } else {                print("Buffering ")            }        } else if currentItem.status == AVPlayerItemStatus.failed {            print("Failed ")        } else if currentItem.status == AVPlayerItemStatus.unknown {            print("Unknown ")        }    } else {        print("avPlayer.currentItem is nil")    }}