2017-12-04 3 views
1

Ich habe eine Reihe von Objekten. Jedes Objekt hat eine Eigenschafts-URL. Mit dieser URL spiele ich Audio unter .AVPlayer spielen kontinuierlich

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) 
    } 

Ich möchte die Audios aller Objekte kontinuierlich wiedergeben. Für die ich

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

In CourseDetailViewController.moviePlayBackDidFinish stelle ich wieder playaudio nenne. Ich habe dann Spieler als globale Variable genommen, so dass es nicht wieder initialisiert wird. Aber es gibt keine Überlastung von , wo wir die bereits vorhandene URL liefern können. Und wenn let player = AVPlayer(url: url) für das nächste Audio tun, wird es nicht wiedergegeben, da die vorherige AVPlayer-Instanz im Vordergrund ist. Das ist die Herausforderung, der ich mich gegenüberstellen muss, wenn ich ein kontinuierliches Audiosystem spiele. Ich würde mich freuen, wenn es einen besseren und sauberen Weg gibt, dies zu tun.

+0

Sie müssen diese 'try'-Anweisungen nicht verschachteln. Sie können sie beide in einen "do" -Block stellen. – Fogmeister

+0

Es gibt ein AVPlayerQueue-Objekt, das Sie brauchen werden. Google es. – Fogmeister

+0

@ Fogmeister: Zustimmen. Der Code wurde geändert. Vielen Dank. – Nitish

Antwort

0

Ich habe das gleiche in AVPlayer, aber Video kontinuierlich zu spielen. Ich hoffe, Sie können dieses Problem genau so lösen. Füge einen Beobachter hinzu, um zu überprüfen, ob der Spieler am Ende des Gegenstandes angekommen ist. Wenn jedes Element am Ende erreicht wird, wird die Benachrichtigung aufgerufen.

  • Hinzufügen Beobachter:

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

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

+0

Danke Anas. Den Code, den du vorgeschlagen hast, mache ich schon. Das Problem, mit dem ich konfrontiert bin, ist nach dem obigen Code, den ich jetzt in Arbeit bekommen kann. – Nitish

0

würden Sie AVQueuePlayer suchen. Dieser Player wird verwendet, um eine Reihe von Elementen nacheinander abzuspielen. SDK Docs at link