如何在audioPlayerDidFinishPlaying方法中多次播放()

当我按“yourButton”或“yourButton2”或“yourButton3”时,每个播放audio文件,而audio正在播放时,UIButton被设置为选中状态。

我想“yourButton4”在一行中实现其他UIButtons的方法。 (首先,播放audio文件,并设置select“yourButton”,然后“yourButton2”和“yourButton3”)。

但是,当按“yourButton4”时,“yourButton2”和“yourButton3”与play()方法同时播放。asynchronous播放声音。

let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3") let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3") let url3 = Bundle.main.bundleURL.appendingPathComponent("music3.mp3") @IBOutlet weak var yourButton: customButton! @IBOutlet weak var yourButton2: customButton! @IBOutlet weak var yourButton3: customButton! @IBOutlet weak var yourButton4: customButton! fileprivate var player1:AVAudioPlayer? fileprivate var player2:AVAudioPlayer? fileprivate var player3:AVAudioPlayer? @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) } 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) } } 

在VC中不要使用这3种不同的

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

而不是在AppDelegate中只使用其中的一个,并从你的VC访问它,所以你不会有同样的问题。 当下一个audio将播放先前的audio将停止

在App委托中使用这个:

 var player1:AVAudioPlayer? 

再次在你的VC使用这个实例

 func Player1(url: URL) { do { let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate try appDelegate.player1 = AVAudioPlayer(contentsOf:url) appDelegate.player1!.play() yourButton2.isSelected = true appDelegate.player1!.delegate = self } catch { print(error) } } 

你们在同一时间玩,没有任何延迟或没有等待前一个完成。

你的类应该成为AVAudioPlayer的委托,所以你首先播放第一个audio文件,一旦你得到委托调用audioPlayerDidFinishPlaying:successfully:你播放下一个。

你应该修改你的委托调用看起来像这样:

 func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if (player === player1) { player2!.play() } else if (player === player2) { player3!.play() } else if (player === player3) { // You're done! } }