如何在播放过程中更改音频音调?(Swift 4)

如何在播放过程中更改音频音调?(Swift 4),swift,audio,avaudioengine,pitch,Swift,Audio,Avaudioengine,Pitch,我想用滑块或变量(即声音播放时)在Xcode,Swift 4中实时更改某些音频的音高和播放速度 目前,我正在使用AVAudioEngine,它允许我在播放开始前设置这些值,但我无法在音频实际播放时更改它们 以下是相关代码: func Play() { engine = AVAudioEngine() audioPlayer = AVAudioPlayerNode() audioPlayer.volume = 1.0 let path = Bundle.main.

我想用滑块或变量(即声音播放时)在Xcode,Swift 4中实时更改某些音频的音高和播放速度

目前,我正在使用AVAudioEngine,它允许我在播放开始前设置这些值,但我无法在音频实际播放时更改它们

以下是相关代码:

func Play() {
    engine = AVAudioEngine()
    audioPlayer = AVAudioPlayerNode()
    audioPlayer.volume = 1.0

    let path = Bundle.main.path(forResource: "filename", ofType: "mp3")!
    let url = NSURL.fileURL(withPath: path)

    let file = try? AVAudioFile(forReading: url)
    let buffer = AVAudioPCMBuffer(pcmFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length))
    do {
        try file!.read(into: buffer!)
    } catch _ {
    }

    let pitch = AVAudioUnitTimePitch()
    let speed = AVAudioUnitVarispeed()

    pitch.pitch = speedIncrement * (-500)
    speed.rate = speedIncrement

    engine.attach(audioPlayer)

    engine.attach(pitch)

    engine.attach(speed)

    engine.connect(audioPlayer, to: speed, format: buffer?.format)

    engine.connect(speed, to: pitch, format: buffer?.format)

    engine.connect(pitch, to: engine.mainMixerNode, format: buffer?.format)

    audioPlayer.scheduleBuffer(buffer!, at: nil, options: AVAudioPlayerNodeBufferOptions.loops, completionHandler: nil)

    engine.prepare()
    do {
        try engine.start()
    } catch _ {
    }

    audioPlayer.play()

}
使用AVAudioEngine是否可能实现这一点


如果AVAudioEngine无法做到这一点,还有什么其他可能的解决方案?

事实上,我从reddit那里得到了答案。我所要做的就是在
Play()
函数之外声明
pitch
speed
变量,以及
pitch.pitch=speedIncrement*(-500)
speed.rate=speedIncrement
表达式。我知道我错过了一些简单的事情…

您希望做的事情在这里的链接上得到解决: 我用过它,它很管用。我注意到音调和速度的变化是敏感的。我决定:

pitch.pitch -= 0.2
speed.rate -= 0.2