AVPlayer 播放、暂停和缓冲问题

3
我的应用程序播放流媒体视频时,当它缓冲时,播放器会进入暂停模式,我必须手动将其设置为播放模式。我在AVPlayer类中有以下代码以处理此情况,但它不起作用。
在ViewDidLoad方法中:
[playerItem addObserver:self forKeyPath:@"playbackBufferEmpty" options:NSKeyValueObservingOptionNew context:nil];
[playerItem addObserver:self forKeyPath:@"playbackLikelyToKeepUp" options:NSKeyValueObservingOptionNew context:nil];

接下来,使用以下方法处理观察者:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                    change:(NSDictionary *)change context:(void *)context {
if (!player)
{
    return;
}

else if (object == playerItem && [keyPath isEqualToString:@"playbackBufferEmpty"])
{
    if (playerItem.playbackBufferEmpty) {
        //Your code here
    }
}

else if (object == playerItem && [keyPath isEqualToString:@"playbackLikelyToKeepUp"])
{
    if (playerItem.playbackLikelyToKeepUp)
    {
        //Your code here
    }
}

这个问题是否有其他解决方案,以便让播放器继续播放模式?


有人能帮我吗? - Yrol
你对这个问题有答案了吗? - Skywalker
在iOS 9中,您不需要使用KVO的额外代码。系统会自动处理它,无需手动添加。但我不知道如何解决iOS 8的这个问题。一直在寻找答案。 - Skywalker
1个回答

1
这可能有所帮助,
假设这是您的AVPlayer对象 player1 = [AVPlayer playerWithURL:streamURL];
当您的视频进入缓冲模式时,您可以将其暂停,当它完成后再播放,例如: 在观察者方法中,
if ([object isKindOfClass:[AVPlayerItem class]])
{
    AVPlayerItem *item = (AVPlayerItem *)object;
    //playerItem status value changed?
    if ([keyPath isEqualToString:@"status"])
    {   //yes->check it...

        NSLog(@"STATUS = %d",item.status);
        switch(item.status)
        {
            case AVPlayerItemStatusFailed:
                NSLog(@"player item status failed");
                break;
            case AVPlayerItemStatusReadyToPlay:

                 [playButton setTitle:@"Pause" forState:UIControlStateNormal];
                [player1 play];

                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)
        {
            [playButton setTitle:@"Play" forState:UIControlStateNormal];
            [player1 pause];
            NSLog(@"player item playback buffer is empty");
        }
    }
}

或者您可以在按钮点击事件上维护。 在屏幕上放置一个按钮以保持播放和暂停,并添加OnClick事件的addTarget。


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