0

再生中にピッチを調整できるオーディオを取得しようとしています。私は 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)
}
4

1 に答える 1

0

私は明らかにばかだった。再生中にピッチを変更でき、更新されます。オーディオをリセットする必要はありません。再生中にノードを変更するだけで機能します。

于 2016-05-15T14:19:04.127 に答える