2011-12-06 14 views
6

ストリーミングオーディオの再生リストをロードするAVQueuePlayer(明らかにAVPlayerまで拡張)があります。ストリーミングはうまくいきますが、ユーザーのオーディオがロードされていることを示すアクティビティインジケータが必要です。問題は、オーディオバッファのロードが完了したときや再生準備ができていることを示すAVQueuePlayer(またはAVPlayer)の通知が見つからないようです(デリゲートメソッドがないようです)。何かご意見は?AVQueuePlayer/AVPlayer読み込み通知?

答えて

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]; 

を評価することができます。あなたが活動の指標または「バッファリング」の警告を表示することができるように

- (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良い点は、私の答えに1つを加えました。 – Till

+2

あなたが好きなら、いつでも私のコメントをアップすることができます;-) – reddersky