2017-02-18 2 views
1

Ich habe die 4 UIButtons auf dem Main StoryBoard erstellt.Wie spiele ich viele Audiodateien eins nach dem anderen

Ich möchte "Button4", um die anderen Tasten Funktion in einer Reihe zu implementieren. Das heißt, wenn ich Knopf 4 drücke, sollte Spieler 1 zuerst gespielt werden, danach Spieler 2 und danach 3.

Wenn ich jedoch "Button4" drücke, werden "Button2" und "Button3" gleichzeitig gespielt .

 fileprivate var player1:AVAudioPlayer? 
     fileprivate var player2:AVAudioPlayer? 
     fileprivate var player3:AVAudioPlayer? 

     let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3") 
     let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3") 
     let url3 = Bundle.main.bundleURL.appendingPathComponent("music3.mp3") 

     @IBAction func pushButton1(sender: UIButton) { 
      Player(url: url1) 
     } 

     @IBAction func pushButton2(sender: UIButton) { 
      Player1(url: url2) 
     } 

     @IBAction func pushButton3(_ sender: UIButton) { 
      Player2(url: url1, url2: url2, url3: url3) 
     } 

//"yourButton2" and "yourButton3" is played at same time in this code at player2 

     func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { 
      if (player === player1) { 
       yourButton.isSelected = false 
      } else if (player === player2) { 
       yourButton2.isSelected = false 
      } else if (player === player3) { 
       yourButton.isSelected = false 
       player2!.play() 
       yourButton2.isSelected = true 
       player2!.play() 
       yourButton3.isSelected = true 
       player1!.play() 
      } 
     } 

     func Player(url: URL) { 
      do { 
       try player1 = AVAudioPlayer(contentsOf:url) 
       player1!.play() 
       yourButton.isSelected = true 
       player1!.delegate = self 
      } catch { 
       print(error) 
      } 
     } 

     func Player1(url: URL) { 
      do { 
       try player2 = AVAudioPlayer(contentsOf:url) 
       player2!.play() 
       yourButton2.isSelected = true 
       player2!.delegate = self 

      } catch { 
       print(error) 
      } 
     } 

     func Player2(url: URL, url2: URL, url3: URL) { 
      do { 
       try player3 = AVAudioPlayer(contentsOf:url) 
       try player2 = AVAudioPlayer(contentsOf: url2) 
       try player1 = AVAudioPlayer(contentsOf: url3) 
       player3!.play() 
       yourButton.isSelected = true 
       player3!.delegate = self 
       player2!.delegate = self 
       player1!.delegate = self 
      } catch { 
       print(error) 
      } 
     } 
+0

Sie ketten UIAudio mit (UIAudio ...). Bearbeiten ** Umschreiben ... –

Antwort

1

Anstatt eine AVAudioPlayer verwenden, wie etwa eine AVQueuePlayer?

Hier ist ein kurzes Beispiel:

var files = ["file1", "file2", "file3"] 

var player: AVQueuePlayer = { 
    var pathArray = [String]() 
    files.forEach { resource in 
     if let path = Bundle.main.path(forResource: resource, ofType: "mp3") { 
      pathArray.append(path) 
     } 
    } 

    var urlArray = [URL]() 
    pathArray.forEach { path in 
     urlArray.append(URL(fileURLWithPath: path)) 
    } 

    var playerItems = [AVPlayerItem]() 
    urlArray.forEach { url in 
     playerItems.append(AVPlayerItem(url: url)) 
    } 

    let player = AVQueuePlayer(items: playerItems) 
    player.actionAtItemEnd = AVPlayerActionAtItemEnd.advance 

    return player 
}() 

und in Aktion Ihre Schaltfläche:

@IBAction func buttonTapped(_ sender: UIButton) { 
    files = ["file2", "file3", "file1"] 
    player.play() 
} 

Zugegeben, das ist ziemlich schnell und schmutzig, aber etwas ein bisschen wie das, weil wir die vorbei sind Dateien Array in den Player. Es sollte nicht zu schwierig sein, mehr Optimierung für diesen Code zu finden.

EDIT: realisiert, dass ich nicht in einem Array von AVPlayerItems übergeben wurde, so aktualisiert.

+0

Ich werde es mit AVQueuePlayer versuchen, danke !! – rebecca87

+0

Kein Problem. Lass es mich wissen, wenn du andere Fragen hast. – jasonnoahchoi

+0

Danke, es hat mit AVQueuePlayer geklappt! – rebecca87

-1

Bearbeiten ....

Jede der Tasten 1, 2, 3 usw. ... funktioniert aber "Druckknopf 2" ist ein bisschen eine Mischung ...

Wie auch immer, erneut erklären?

Verwandte Themen