2012-03-20 23 views
1

ライブHTTPストリーミングをサポートしていないAVAlayerPlayerではなく、実際のHTTPオーディオをストリーミングするためにAVPlayerを使用しています。質問は、現在の再生のステータスをどのように取得しますか?たとえば:AVPlayerからオーディオストリーミングステータスの通知を受け取る方法は?

タッププレイボタン - > [ロード] - > タップPAUSEボタン[遊ぶ] - > [一時停止]

を私がロードするときに演奏して表示すると、一時停止ボタンを表示するスピナーを表示する必要があります一時停止時に再生ボタンを押すと、私はAVPlayerの 'ステータス'と 'レート'プロパティを見ることができることを知っています:

レート: 再生の現在のレート。 0.0は「停止」を意味し、1.0は「現在のアイテムの自然レートで再生」を意味する。

ステータス: プレイヤーが再生に使用できるかどうかを示します。

AVPlayerStatusUnknown, 
AVPlayerStatusReadyToPlay, 
AVPlayerStatusFailed 

ので、オーディオを示すための方法はありませんが、「LOADING」であり、(それがライブオーディオであるかもしれないので)AVPlayerStatusReadyToPlayへのステータス変更後、それはまだオーディオの再生を持っているいくつかの時間がかかります。

しかし、とにかく、現在の再生の正しいステータスを取得するにはどうすればよいですか?私はMattのAudioStreamがあることを知っていますが、HTTP Liveオーディオはサポートしていません。

ありがとうございました!

+0

を[avPlayerはスタート] 1.0に向かうレートは「ローディング」期間です。 [start]を呼ぶとすぐに自分の内部状態を 'loading'に設定してから、レートが1.0になるとすぐに 'playing'に設定します。 – SteveB

答えて

3

私は、ステータスキー( "状態")を監視するために

[self.mPlayerItem addObserver:self 
        forKeyPath:kStatusKey 
         options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew 
         context:AVPlayerDemoPlaybackViewControllerStatusObservationContext]; 

を使用。その後、私は選手

[self setPlayer:[AVPlayer playerWithPlayerItem:self.mPlayerItem]]; 

を作成し、observeValueForKeyPath

if (context == AVPlayerDemoPlaybackViewControllerStatusObservationContext) 
{   
    AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue]; 
    switch (status) 
    { 
      /* Indicates that the status of the player is not yet known because 
      it has not tried to load new media resources for playback */ 
     case AVPlayerStatusUnknown: 
     { 
      [lblvalidation setText:@"Loading..."]; 

      NSLog(@"AVPlayerStatusUnknown"); 
     } 
      break; 

     case AVPlayerStatusReadyToPlay: 
     { 
      /* Once the AVPlayerItem becomes ready to play, i.e. 
      [playerItem status] == AVPlayerItemStatusReadyToPlay, 
      its duration can be fetched from the item. */ 

      NSLog(@"AVPlayerStatusReadyToPlay"); 

      [self.player play]; 
      [lblvalidation setText:@"Playing..."]; 
     } 
      break; 

     case AVPlayerStatusFailed: 
     { 
      [lblvalidation setText:@"Error..."]; 
      NSLog(@"AVPlayerStatusFailed"); 
     } 
      break; 
    } 
} 

で、これは私の作品...私はそれがあなたのために役立ちたいと考えています。スウィフト2用に更新

+0

次のようなシナリオで動作しますか?ネットワークが遅くなったり、ダウンしてAVPlayerStatusUnknownが返ってくると、プレイヤーは再生していますか? – jailani

1

private var AVPlayerDemoPlaybackViewControllerStatusObservationContext = 0 

は、観察者の追加:私はあなたの質問の中で何かが、呼び出しの間の時間を逃す可能性があります

player.currentItem!.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: &AVPlayerDemoPlaybackViewControllerStatusObservationContext) 

オブザーバー

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 

    if context == &AVPlayerDemoPlaybackViewControllerStatusObservationContext { 
     if let change = change as? [String: Int] 
     { 
      let status = change[NSKeyValueChangeNewKey]! 

      switch status { 
      case AVPlayerStatus.Unknown.rawValue: 
       print("The status of the player is not yet known because it has not tried to load new media resources for playback") 

      case AVPlayerStatus.ReadyToPlay.rawValue: 
       self.playButtonPressed(playButton) 
       print("The player is Ready to Play") 

      case AVPlayerStatus.Failed.rawValue: 
       print("The player failed to load the video") 

      default: 
       print("Other status") 
      } 
     } 
    } else { 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
    } 

} 
関連する問題