Arrays AVAudioPlayer使用阵列对音频文件进行排队-Swift

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

我正在寻找一种简单的方式来播放音频文件一个接一个。 使用数组的AVAudioPlayer似乎是最好的解决方案。事实上,我可以使用Sleek在本页上的建议来播放数组的第一个元素:

但是我不知道在哪里以及如何编写对AVAudioPlayer的第二个调用来播放第二个文件

“AudioPlayerDifInishPlay”功能没有反应。为什么?

谢谢收看

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

}