Изменение громкости SCNAudioPlayer в реальном времени - Swift

Я пытаюсь понять, как изменить громкость SCNAudioPlayer в реальном времени.

В настоящее время у меня SCNAudioSource подключен к SCNAudioPlayer. Затем этот аудиоплеер назначается SCNNode, чтобы в моем звуке использовалась пространственная обработка звука SceneKits.

В нынешнем виде я могу изменять громкость каждого SCNNode, используя SCNAudioSource.volume, запускаемый логической переменной vol. Отрывок из моего кода для этого показан ниже:

(audioSource, audioCount) = soundFileSelect(audioFileIndex: 0) 
    audioSource?.isPositional = true 
    if vol {
        audioSource?.volume = 1.0
    }
    else {
        audioSource?.volume = 0.0
    }
    let audioPlayer = SCNAudioPlayer(source: audioSource!) 
    geometryNode.addAudioPlayer(audioPlayer) 
    let play = SCNAction.playAudio(audioSource!, waitForCompletion: true) 
    let loopPlay = SCNAction.repeatForever(play) 
    geometryNode.runAction(loopPlay) 

Однако это изменяет только настройку громкости по умолчанию для источника, и это происходит только при порождении узла. Я пытаюсь изменить его громкость в реальном времени после нажатия кнопки.

Я чувствую, что мне не хватает чего-то простого, и я искал в Интернете документацию и примеры, но мне действительно трудно. Из документации Apple по API я вполне уверен, что это возможно. Насколько я могу судить, вы должны использовать свойство audioNode, связанное с SCNAudioPlayer, которое является частью протокола AVAudioMixing. Это свойство AVAudioMxing volume должно быть тем, что мне нужно!

Однако, хоть убей, я не могу понять, как реализовать этот процесс в коде в моей текущей настройке. Я могу получить доступ к _13 _ / _ 14_, например:

audioPlayer.audioNode?.engine?.mainMixerNode.outputVolume=0

но это, похоже, не работает. Как компоненты AV и SCN связаны друг с другом?

Мы будем очень благодарны за любую помощь или примеры того, как это можно реализовать!


person Killinger_94    schedule 11.05.2017    source источник
comment
Вы когда-нибудь находили решение этой проблемы?   -  person Daniel T.    schedule 26.04.2019


Ответы (1)


guard let avNode = playerGuitar?.audioNode as? AVAudioMixing else {
      return
}
avNode.volume = volume

работал в моем коде (хотя на поиск потребовалось много времени, и то, что я новичок в Swift, точно не помогло). playerGuitar - это переменная SCNAudioPlayer.

person Charlotte Magnusson    schedule 17.01.2020