iOS 通过 AVAudioUnitTimePitch 播放时调整音调

标签 ios swift audio avaudioengine

我正在尝试获取一些音频,以便能够在演奏时调整音调。我对 Swift 和 iOS 非常陌生,但我最初的尝试是在播放时更改 timePitchNode.pitch ;但是,它不会在播放时更新。我当前的尝试是重置 audioEngine,并让它从播放的位置恢复(如下)。如何确定音频当前所在的位置,以及如何让它从那里恢复?

var audioFile: AVAudioFile?
var audioEngine: AVAudioEngine?
var audioPlayerNode: AVAudioPlayerNode?
var pitch: Int = 1 {
    didSet {
        playResumeAudio()
    }
}

…

func playResumeAudio() {
    var currentTime: AVAudioTime? = nil

    if audioPlayerNode != nil {
        let nodeTime = audioPlayerNode!.lastRenderTime!
        currentTime = audioPlayerNode!.playerTimeForNodeTime(nodeTime)
    }

    if audioEngine != nil {
        audioEngine!.stop()
        audioEngine!.reset()
    }

    audioEngine = AVAudioEngine()

    audioPlayerNode = AVAudioPlayerNode()
    audioEngine!.attachNode(audioPlayerNode!)

    let timePitchNode = AVAudioUnitTimePitch()
    timePitchNode.pitch = Float(pitch * 100)
    timePitchNode.rate = rate
    audioEngine!.attachNode(timePitchNode)

    audioEngine!.connect(audioPlayerNode!, to: timePitchNode, format: nil)
    audioEngine!.connect(timePitchNode, to: audioEngine!.outputNode, format: nil)

    audioPlayerNode!.scheduleFile(audioFile!, atTime: nil, completionHandler: nil)
    let _ = try? audioEngine?.start()

    audioPlayerNode!.playAtTime(currentTime)
}

最佳答案

我显然是愚蠢的。您可以在播放期间修改音高,并且它会更新。无需重置任何音频,只需在播放时改变节点即可工作。

关于iOS 通过 AVAudioUnitTimePitch 播放时调整音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37238703/

相关文章:

matlab - 将数组作为声音播放并并行记录其输出

ios - AS3 中的配置文件?

ios - 如何使用 strftime 在 Swift 中格式化字符串

ios - MPNowPlayingInfoCenter 播放暂停图像不变

ios - Swift - 根据阿拉伯组合字符拆分文本

ios - 显示空单元格的 TableView

c++ - Arduino 立体声音量表

internet-explorer - 当我在文本框中按 Enter 时,我需要抑制什么事件才能从 "Dinging"停止 IE?

iOS:同步缩放和 3D 旋转动画

ios - Facebook 注册