AVQueuePlayer/AVPlayer loading notification?
10,423
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");
}
}
}
}
Author by
Keller
Updated on June 04, 2022Comments
-
Keller almost 2 years
I have an
AVQueuePlayer
(which obviously extendsAVPlayer
) 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 inAVQueuePlayer
(orAVPlayer
) 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? -
reddersky over 12 yearsYou can also observe the playbackBufferEmpty property of the AVPlayerItem objects to detect if/when your buffer empties during playback so that you can show an activity indicator or 'buffering' warning.
-
reddersky over 12 yearsYou could always up my comment if you liked it ;-)
-
danyowdee over 12 yearsMinor remark: You should use the
context
to discern how to handle a KVO notification! It probably won't matter if you're subclassingNSObject
but as soon as you're subclassing something a little more advanced than that, not forwardingobserveValueForKeyPath:...
can lead to the most peculiar side-effects. -
mostafa tourad over 12 years@danyowdee you are so right - this really is just for the sake of the of this example. I shall never ever use the key path for checking if my observer is invoked for an event I actually intend to register. Using the context certainly is quicker and more reliable.
-
jose920405 over 8 yearsBest way for remove this observer?
-
Mohammad Zaid Pathan over 8 years@Till , when should we stopAnimating our activity indicator?
-
mostafa tourad over 8 years@ZaidPathan you should start animating initially and whenever you got a
playbackBufferEmpty
and stop animating as soon as you get astatus
change. -
Gabriel.Massana almost 8 years@reddersky / Till to detect when the buffer is empty you can also use AVPlayerItemPlaybackStalledNotification notification