AVQueuePlayer/AVPlayer加载通知?

Kel*_*ler 7 objective-c avfoundation ios avplayer avqueueplayer

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

Til*_*ill 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];
Run Code Online (Sandbox Code Playgroud)

现在,您可以在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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以观察AVPlayerItem对象的playbackBufferEmpty属性,以检测缓冲区在播放期间是否/何时清空,以便您可以显示活动指示符或"缓冲"警告. (7认同)
  • 如果你喜欢它,你总是可以发表评论;-) (2认同)
  • 次要评论:您应该使用`context`来辨别如何处理KVO通知!如果你是'NSObject`的子类,那么可能无关紧要,但是一旦你将一些比它更先进的子类化,就不会转发`observeValueForKeyPath:...`会导致最特殊的副作用. (2认同)
  • @ZaidPathan你最初应该开始制作动画,每当你得到一个`playbackBufferEmpty`时,一旦你的'status`改变就停止制作动画. (2认同)