2011-12-06 36 views
6

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

回答

26

你将不得不使用志愿来完成这件事。

对于要添加到队列中的每个项目,您可以设置观察家这样的:

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

您也可以观察AVPlayerItem对象的playbackBufferEmpty属性时,您的缓冲区播放过程中清空,如果/检测,这样就可以显示一个活动的指标或“缓冲”的警告。 – reddersky

+0

@virorum好点,补充说,我的答案 - 一个! – Till

+2

你总是可以了我的评论,如果你喜欢它;-) – reddersky