2017-12-04 10 views
1

私はオブジェクトの配列を持っています。各オブジェクトにはプロパティURLがあります。このURLを使用して私はAVPlayerでオーディオを再生しています。AVPlayerは連続して再生します

func playAudio(url: URL) 
    { 
     let player = AVPlayer(url: url) 
     let playerViewController = AVPlayerViewController() 
     playerViewController.player = player 
     self.present(playerViewController, animated: true) 
     { 
      do 
      { 
       try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
        try AVAudioSession.sharedInstance().setActive(true) 
      } 
      catch _ as NSError { 

      } 

      playerViewController.player!.play() 
     } 

     NotificationCenter.default.addObserver(self, selector: #selector(CourseDetailViewController.moviePlayBackDidFinish(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil) 
    } 

すべてのオブジェクトの音声を連続して再生したい。そのために私は、私は再びplayAudioを呼び出していますCourseDetailViewController.moviePlayBackDidFinish

NotificationCenter.default.addObserver(self, selector: #selector(CourseDetailViewController.moviePlayBackDidFinish(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil) 

を設定しています。私はグローバル変数としてプレーヤを取得し、再び初期化されないようにしました。しかし、既に存在するAVPlayerにURLを提供できるところで、AVPlayerの過負荷はありません。そして、次のオーディオのためにlet player = AVPlayer(url: url)を行うと、前のAVPlayerインスタンスがフォアグラウンドにあるため再生されません。 これは私が連続したオーディオを再生する際に直面している課題です。私はこれを行うためのより良い、きちんとした方法があれば感謝します。

+0

これらの 'try'ステートメントをネストする必要はありません。それらを両方とも1つの 'do'ブロックに入れることができます。 – Fogmeister

+0

私はあなたが必要と思うAVPlayerQueueオブジェクトがあります。それはGoogleです。 – Fogmeister

+0

@Fogmeister:同意します。コードを変更しました。ありがとう。 – Nitish

答えて

0

私はAVPlayerで同じことをしましたが、ビデオを連続して再生していました。この問題をまったく同じ方法で解決できることを願っています。プレイヤーがアイテムの最後に到達したかどうかを確認するオブザーバーを追加します。各項目が最後に到達すると、通知が呼び出されます。

  • オブザーバー追加:

    NotificationCenter.default.addObserver(self, 
                 selector: #selector(playerItemDidReachEnd(notification:)), 
                 name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, 
                 object: avPlayer.currentItem) 
    avPlayer.play() 
    
  • 通知方法:

    func playerItemDidReachEnd(notification: Notification){ //TODO: Add your code here.. }

+0

ありがとうございます。あなたが提案したコードは、私はすでにそれをやっています。私が直面している問題は、私が今作業することができる上記のコードの後です。 – Nitish

0

をあなたはAVQueuePlayerを見ていました。このプレイヤーは、複数のアイテムを順番に再生するために使用されます。 SDK Docs at link

関連する問題