Arrays AVAudioPlayer使用阵列对音频文件进行排队-Swift
我正在寻找一种简单的方式来播放音频文件一个接一个。 使用数组的AVAudioPlayer似乎是最好的解决方案。事实上,我可以使用Sleek在本页上的建议来播放数组的第一个元素: 但是我不知道在哪里以及如何编写对AVAudioPlayer的第二个调用来播放第二个文件 “AudioPlayerDifInishPlay”功能没有反应。为什么? 谢谢收看Arrays AVAudioPlayer使用阵列对音频文件进行排队-Swift,arrays,swift,macos,audio,avaudioplayer,Arrays,Swift,Macos,Audio,Avaudioplayer,我正在寻找一种简单的方式来播放音频文件一个接一个。 使用数组的AVAudioPlayer似乎是最好的解决方案。事实上,我可以使用Sleek在本页上的建议来播放数组的第一个元素: 但是我不知道在哪里以及如何编写对AVAudioPlayer的第二个调用来播放第二个文件 “AudioPlayerDifInishPlay”功能没有反应。为什么? 谢谢收看 import Cocoa import AVFoundation var action = AVAudioPlayer() let path = B
import Cocoa
import AVFoundation
var action = AVAudioPlayer()
let path = Bundle.main.path(forResource: "test.aif", ofType:nil)!
let url = URL(fileURLWithPath: path)
let path2 = Bundle.main.path(forResource: "test2.aif", ofType:nil)!
let url2 = URL(fileURLWithPath: path2)
let array1 = NSMutableArray(array: [url, url2])
class ViewController: NSViewController
{
@IBOutlet weak var LanceStop: NSButton!
override func viewDidLoad()
{
super.viewDidLoad()
do
{
action = try AVAudioPlayer(contentsOf: array1[0] as! URL)
action.numberOfLoops = 0
action.prepareToPlay()
action.volume = 1
}catch{print("error")}
}
...
@IBAction func Lancer(_ sender: NSButton)
{
if action.isPlaying == true
{
action.stop()
action.currentTime = 0.0
LanceStop.title = "Lancer"
}
else
{
action.play()
LanceStop.title = "Stopper"
}
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
if flag == true
{
LanceStop.title = "Lancer"
}
}
}
但是我不知道第二次打电话给为了播放第二个文件 因此,为了播放第二个文件,您需要编写一个方法,其中需要初始化audioplayer并在audioplayer委托方法中调用相同的方法,如下所示:-
func playAudioFile(_ index: Int) {
do
{
action = try AVAudioPlayer(contentsOf: array1[index] as! URL)
action.numberOfLoops = 0
action.prepareToPlay()
action.volume = 1
} catch{print("error")
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
//This delegate method will called once it finished playing audio file.
//Here you can invoke your second file. You can declare counter variable
//and increment it based on your file and stop playing your file acordingly.
counter = counter + 1
playAudioFile(counter)
}
注意:-将Audioplayer委托设置为ViewController以获取调用
AudioPlayerDifinishPlaying这样的播放方法
更改代码
class ViewController: NSViewController, AVAudioPlayerDelegate
{
@IBOutlet weak var LanceStop: NSButton!
override func viewDidLoad()
{
super.viewDidLoad()
}
override var representedObject: Any?
{
didSet
{
// Update the view, if already loaded.
}
}
func playAudioFile(_ index: Int)
{
do
{
action = try AVAudioPlayer(contentsOf: array1[index] as! URL)
action.delegate = self
action.numberOfLoops = 0
action.prepareToPlay()
action.volume = 1
action.play()
}
catch{print("error")}
}
@IBAction func Lancer(_ sender: NSButton)
{
playAudioFile(0)
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
if flag == true
{
playAudioFile(1)
}
}
}
我可以使用您的示例更改代码,但委托除外。它给出了一个“预期声明”错误。另外,我不知道如何确保index(Int)变量从“0”开始。我是否应该声明它?在“NSViewController”之后添加了“AVAudioPlayerDelegate”。但是,我仍然不知道在哪里插入“action.delegate=self”代码,它会使应用程序崩溃。我已经找到了解决这个难题的方法。我必须找到另一个答案,因为播放的每个url之间都有音频间隔。感谢您让我更好地了解了代理的工作原理。干杯
class ViewController: NSViewController, AVAudioPlayerDelegate
{
@IBOutlet weak var LanceStop: NSButton!
override func viewDidLoad()
{
super.viewDidLoad()
}
override var representedObject: Any?
{
didSet
{
// Update the view, if already loaded.
}
}
func playAudioFile(_ index: Int)
{
do
{
action = try AVAudioPlayer(contentsOf: array1[index] as! URL)
action.delegate = self
action.numberOfLoops = 0
action.prepareToPlay()
action.volume = 1
action.play()
}
catch{print("error")}
}
@IBAction func Lancer(_ sender: NSButton)
{
playAudioFile(0)
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{
if flag == true
{
playAudioFile(1)
}
}
}