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 播放音频文件