【问题标题】:AVQueuePlayer/AVPlayer loading notification?AVQueuePlayer/AVPlayer 加载通知?
【发布时间】:2011-12-06 22:57:57
【问题描述】:

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

【问题讨论】:

    标签: objective-c ios avfoundation avplayer avqueueplayer


    【解决方案1】:

    您必须使用 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");
                }
            }
        }
    }
    

    【讨论】:

    • 您还可以观察 AVPlayerItem 对象的playbackBufferEmpty 属性,以检测播放期间缓冲区是否/何时清空,以便显示活动指示器或“缓冲”警告。
    • 如果你喜欢我的评论,你可以随时评论 ;-)
    • 小提示:您应该使用context 来了解如何处理KVO 通知!如果您将 NSObject 子类化可能无关紧要,但一旦您将比这更高级的东西子类化,不转发 observeValueForKeyPath:... 可能会导致最特殊的副作用。
    • @danyowdee 你说的太对了——这真的只是为了这个例子。我永远不会使用关键路径来检查我的观察者是否被调用来处理我真正打算注册的事件。使用上下文当然更快、更可靠。
    • @ZaidPathan 你应该开始动画,只要你有一个playbackBufferEmpty,一旦你得到一个status 就停止动画。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    相关资源
    最近更新 更多