Search code examples
objective-ciosavfoundationavplayeravqueueplayer

AVQueuePlayer/AVPlayer loading notification?


I have an AVQueuePlayer (which obviously extends AVPlayer) that loads a playlist of streaming audio. Streaming is all working fine, but I'd like to have an activity indicator to show the user audio is loading. Trouble is, I can't seem to find any such Notification in AVQueuePlayer (or AVPlayer) that would indicate when the audio buffer has finished loading/is ready to play (nor does there appear to be a delegate method). Any thoughts?


Solution

  • You will have to use KVO to get this done.

    For each item you are adding to the queue, you may setup observers like this:

    item_ = [[AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"http://somefunkyurl"]] retain];
    [item_ addObserver:self forKeyPath:@"status" options:0 context:nil];
    [item_ addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];
    

    Now you can evaluate the status of that item within the observer method;

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if ([object isKindOfClass:[AVPlayerItem class]])
        {
            AVPlayerItem *item = (AVPlayerItem *)object;
            //playerItem status value changed?
            if ([keyPath isEqualToString:@"status"])
            {   //yes->check it...
                switch(item.status)
                {
                    case AVPlayerItemStatusFailed:
                        NSLog(@"player item status failed");
                    break;
                    case AVPlayerItemStatusReadyToPlay:
                        NSLog(@"player item status is ready to play");
                    break;
                    case AVPlayerItemStatusUnknown:
                        NSLog(@"player item status is unknown");
                    break;
                }
            }
            else if ([keyPath isEqualToString:@"playbackBufferEmpty"])
            {
                if (item.playbackBufferEmpty)
                {
                    NSLog(@"player item playback buffer is empty");
                }
            }
        }
    }