2014-09-02 675 views
3

我的应用程序播放流视频,但是当它缓冲时,播放器进入暂停模式,我必须手动将它设置为播放模式,我在我的AVPlayer类中有以下代码为了处理这种情况,但它不起作用。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 
    } 
} 

}

有在为了获得一个另一个针对此问题的解决方案处理观察员玩家继续玩模式?

+0

任何人都想帮助我? – Yrol 2014-09-03 05:54:37

+0

你得到了这个答案吗? – Skywalker 2016-03-14 12:35:04

+0

在iOS 9中,您不需要使用此附加代码与KVO。系统无需处理它。我不知道如何解决iOS 8的这个问题。我正在为此寻找答案 – Skywalker 2016-03-14 14:05:07

回答

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事件将其添加到该按钮。