AVAudioPlayer 使用数组对音频文件进行排队 - Swift

Posted

技术标签:

【中文标题】AVAudioPlayer 使用数组对音频文件进行排队 - Swift【英文标题】:AVAudioPlayer using array to queue audio files - Swift 【发布时间】:2017-07-23 23:14:28 【问题描述】:

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

但我不明白在哪里以及如何编写对 AVAudioPlayer 的第二次调用以播放第二个文件?

“audioPlayerDidFinishPlaying”函数没有反应。为什么?

感谢收看。

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
        catchprint("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"
        
    

【问题讨论】:

【参考方案1】:

但我不明白在哪里以及如何编写第二次调用 AVAudioPlayer 来播放第二个文件?

因此,为了播放第二个文件,您需要编写一个方法来初始化音频播放器并在音频播放器委托方法audioPlayerDidFinishPlaying 中调用相同的方法,如下所示:-

func playAudioFile(_ index: Int) 
  do

  action = try AVAudioPlayer(contentsOf: array1[index] as! URL)
  action.numberOfLoops = 0
  action.prepareToPlay()
  action.volume = 1
  catchprint("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 以便调用 audioPlayerDidFinishPlaying 方法是这样的。

action.delegate = self

【讨论】:

我能够使用您的示例更改我的代码,但委托除外。它给出了“预期声明”错误。另外我不知道如何确保索引(Int)变量从“0”开始。不应该申报吗? 在“NSViewController”之后添加了“AVAudioPlayerDelegate”。但是,我仍然不知道在哪里插入“action.delegate = self”代码,它会使应用程序崩溃。 我已经找到了摆脱这个难题的方法。我将不得不找到另一个答案,因为每个播放的网址之间存在音频差距。感谢您让我更好地了解代表的工作方式。干杯。【参考方案2】:

更改代码...

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()
        
        catchprint("error")
    

    @IBAction func Lancer(_ sender: NSButton)
    
      playAudioFile(0)
    


    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
    
        if flag == true
        
            playAudioFile(1)
        
    


【讨论】:

以上是关于AVAudioPlayer 使用数组对音频文件进行排队 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:AVAudioPlayer 并不总是在设备上播放音频

AVAudioPlayer 无法播放使用 ExtAudioFileWriteAsync 编写的音频 (.wav) 文件

使用 AVAudioPlayer 播放多个音频文件

录制音频并保存到文档目录后无法使用 AVAudioPlayer 播放音频文件

如何使用 AVAudioPlayer 连续播放多个音频文件?

如何在 Swift 3 中使用 AVAudioPlayer 播放 .ogg 音频文件?