gpt4 book ai didi

ios - 有没有办法使用 AVAudioPlayerNode 从头开始​​重播声音?

转载 作者:行者123 更新时间:2023-11-28 06:08:54 28 4
gpt4 key购买 nike

我设置了一堆音频节点

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

最佳答案

回答您提出的问题:

AVAudioPlayerNode没有seek功能,需要重新调度文件。

一种简洁的方法是在创建音频文件时保留对音频文件的引用。然后,在您的关键函数中重新安排文件并播放。

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

根据假设提供建议:)

对于作为按钮目标的按键功能,我假设您想要在按下按钮时播放不同的音频文件。如果您不介意从按下按钮到音频开始播放之间有一点延迟,或者如果您处理的是非常长的音频文件,那么您当前的方法就可以了。但是,如果不可预测的滞后时间 Not Acceptable ,您有几个选择。

安排音频 AVAudioBuffers 而不是文件,开始播放时的延迟时间要少得多。您将使用我上面概述的相同方法,但不是存储 AVAudioFile 和调度,而是存储和调度 AVAudioBuffer。

如果您正在制作打击垫或键盘风格的采样器,则需要将延迟降到绝对最小值。 AVAudioUnitSampler是这个的理想选择。它能够实现非常低延迟的音频,并且可以配置为将文件映射到键。设置起来有点困难,但如果时机很重要,那么值得付出努力。

关于ios - 有没有办法使用 AVAudioPlayerNode 从头开始​​重播声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47302803/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com