7

我有一个AVQueuePlayer(显然是扩展AVPlayer的)加载流音频的播放列表。流媒体一切正常,但我想要一个活动指示器来显示用户音频正在加载。AVQueuePlayer麻烦的是,我似乎在( 或) 中找不到任何这样的通知AVPlayer来指示音频缓冲区何时完成加载/准备好播放(似乎也没有委托方法)。有什么想法吗?

4

1 回答 1

26

您将不得不使用 KVO 来完成这项工作。

对于要添加到队列中的每个项目,您可以像这样设置观察者:

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];

现在您可以在观察者方法中评估该项目的状态;

- (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");
            }
        }
    }
}
于 2011-12-06T23:12:42.333 回答