如何在 audioPlayerDidFinishPlaying 方法中使用多个 play()
How to multiple play() in audioPlayerDidFinishPlaying method
当我按 "yourButton" 或 "yourButton2" 或 "yourButton3" 时,每个按钮都会播放一个音频文件,并且在播放音频时,UIButton 被设置为选中。
我想"yourButton4"连续实现其他UIButtons的方法。 (首先,播放音频文件并设置选择 "yourButton" 然后 "yourButton2" 和 "yourButton3")。
但是,当我按下 "yourButton4" 时,"yourButton2" 和 "yourButton3" 与 play() 方法同时播放异步播放声音。
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)
}
}
你们是同时玩的,没有延迟,也没有等待上一个完成的东西。
你的 class 应该成为 AVAudioPlayer
的代表,所以你首先播放第一个音频文件,一旦你收到代表电话 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!
}
}
不要在 VC
中使用这 3 个不同
fileprivate var player1:AVAudioPlayer?
fileprivate var player2:AVAudioPlayer?
fileprivate var player3:AVAudioPlayer?
而不是在 AppDelegate 中仅使用其中一个并从您的 VC 访问它,这样您就不会遇到同样的问题。下一个音频播放时,上一个音频将停止
在 App delegate 中使用:
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)
}
}
当我按 "yourButton" 或 "yourButton2" 或 "yourButton3" 时,每个按钮都会播放一个音频文件,并且在播放音频时,UIButton 被设置为选中。
我想"yourButton4"连续实现其他UIButtons的方法。 (首先,播放音频文件并设置选择 "yourButton" 然后 "yourButton2" 和 "yourButton3")。
但是,当我按下 "yourButton4" 时,"yourButton2" 和 "yourButton3" 与 play() 方法同时播放异步播放声音。
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)
}
}
你们是同时玩的,没有延迟,也没有等待上一个完成的东西。
你的 class 应该成为 AVAudioPlayer
的代表,所以你首先播放第一个音频文件,一旦你收到代表电话 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!
}
}
不要在 VC
中使用这 3 个不同fileprivate var player1:AVAudioPlayer?
fileprivate var player2:AVAudioPlayer?
fileprivate var player3:AVAudioPlayer?
而不是在 AppDelegate 中仅使用其中一个并从您的 VC 访问它,这样您就不会遇到同样的问题。下一个音频播放时,上一个音频将停止
在 App delegate 中使用:
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)
}
}