首页 文章

AVQueuePlayer / AVPlayer加载通知?

提问于
浏览
7

我有 AVQueuePlayer (显然扩展 AVPlayer )加载流式音频的播放列表 . 流媒体工作正常,但我似乎在 AVQueuePlayer (或 AVPlayer )中找到任何此类通知,指示音频缓冲区何时完成加载/准备播放(似乎也没有委托方法) . 有什么想法吗?

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

    现在,您可以在observer方法中评估该项目的状态;

    - (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");
                }
            }
        }
    }
    

相关问题