Как изменить высоту звука во время воспроизведения? (Swift 4)

Я хочу изменить высоту звука и скорость воспроизведения некоторого звука в реальном времени с помощью ползунка или переменной (то есть во время воспроизведения звука) в 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, каковы другие возможные решения?


person will    schedule 04.03.2018    source источник


Ответы (2)


Собственно, я получил ответ от Reddit. Все, что мне нужно было сделать, это объявить переменные pitch и speed вне функции Play() вместе с выражениями pitch.pitch = speedIncrement * (-500) и speed.rate = speedIncrement. Я знал, что мне не хватает чего-то простого ...

person will    schedule 07.03.2018

То, что вы хотите сделать, решено здесь, по этой ссылке: https://www.hackingwithswift.com/example-code/media/how-to-control-the-pitch-and-speed-of-audio-using-avaudioengine Я использовал его, и он работает. Я заметил, что изменения высоты тона и скорости очень чувствительны. Я установил свой:

pitch.pitch -= 0.2
speed.rate -= 0.2
person Andrew    schedule 12.02.2020