我有一堆音频节点设置为
var audioPlayers = [AVAudioPlayerNode]()
var engine = AVAudioEngine()
var player = AVAudioPlayerNode()
@IBAction func key(_ sender: UIButton) {
audioPlayers[someindex].play()
}
func createPlayers() {
for key in constructedArrayOfNotes {
player = AVAudioPlayerNode()
player.volume = 0.5
let reverb = AVAudioUnitReverb()
reverb.loadFactoryPreset(AVAudioUnitReverbPreset.cathedral)
reverb.wetDryMix = 50
let audiopath = Bundle.main.path(forResource: key, ofType: "mp3",inDirectory: directory)!
let url = NSURL.fileURL(withPath: audiopath)
do {
let file = try! AVAudioFile.init(forReading: url)
let buffer = AVAudioPCMBuffer(pcmFormat: file.processingFormat, frameCapacity: AVAudioFrameCount(file.length))
try file.read(into: buffer!)
engine.attach(player)
engine.attach(reverb)
engine.connect(player, to: reverb, format: buffer!.format)
engine.connect(reverb, to: engine.mainMixerNode, format: buffer!.format)
player.scheduleFile(file, at: nil, completionHandler: nil)
audioPlayers.append(player)
} catch {
print("error")
}
}
}
override func viewDidLoad() {
createPlayers()
engine.prepare()
try! engine.start()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
有没有办法让我重播从头开始存储在AVAudioPlayerNode中的音频文件?目前,当我按下IBAction时声音播放但我无法重播。我正在尝试相当于AVAudioPlayer.starttime = 0
答案 0 :(得分:1)
要回答您提出的问题:
AVAudioPlayerNode没有搜索功能,您必须再次安排该文件。
一种干净的方法是在创建音频文件时保持对音频文件的引用。然后,在您的键功能中重新安排文件并播放。
var audioPlayers = [AVAudioPlayerNode]()
var audioFiles = [AVAudioFile]() // Populate in same loop you create the players.
@IBAction func key(_ sender: UIButton) {
let player = audioPlayers[sender.tag]
let audioFile = audioFiles[sender.tag]
player.scheduleFile(audioFile, at: nil, completionHandler: nil)
player.play()
}
根据假设提供建议:)
使用作为按钮目标的按键功能,我假设您想在按下按钮时播放不同的音频文件。如果您不介意从按下按钮到音频开始播放的时间有一点滞后,或者,如果您正在处理非常长的音频文件,那么您当前的方法很好。但是,如果不可接受的是不可预测的延迟时间,您可以选择一些选项。
安排音频AVAudioBuffers而不是文件,开始播放时的延迟时间要少得多。您将使用我上面概述的相同方法,但不是存储AVAudioFile和调度,存储和调度AVAudioBuffer。
如果您正在制作打击垫或键盘式采样器,则需要将延迟降至绝对最小值。 AVAudioUnitSampler是理想的选择。它能够实现非常低延迟的音频,并且可以配置为将文件映射到键。设置起来有点困难,但如果时间安排很重要,那么值得付出努力。