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

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

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

7
您还可以观察AVPlayerItem对象的playbackBufferEmpty属性,以检测播放期间缓冲区何时为空,从而显示活动指示器或“缓冲”警告。 - reddersky
2
如果你喜欢我的评论,你可以点个赞哦;-) - reddersky
2
小提示:您应该使用“context”来确定如何处理KVO通知!如果您正在子类化NSObject,则可能不重要,但是一旦您正在子类化比它更高级的东西,不转发“observeValueForKeyPath:…”可能会导致最奇特的副作用。 - danyowdee
最好的方法是移除这个观察者? - jose920405
2
@ZaidPathan 你应该在最初开始动画,每当出现 playbackBufferEmpty 时都要开始动画,并在出现 status 更改时立即停止动画。 - Till
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接