iOS通过AVAudioUnitTimePitch播放时调整音高

时间:2016-05-15 13:10:36

标签: 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)
}

1 个答案:

答案 0 :(得分:0)

我显然是愚蠢的。您可以在播放期间修改音高,并且会更新。

,无需重置任何音频,只需在节点播放时改变节点即可。