实时更改SCNAudioPlayer的音量 - Swift

时间:2017-05-11 12:37:30

标签: ios swift audio scenekit avaudioengine

我正在努力弄清楚如何实时更改SCNAudioPlayer的音量。

目前,我SCNAudioSourceSCNAudioPlayer相关联。然后将此音频播放器分配给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卷属性应该是我需要的!

但是,对于我的生活,我无法解决如何在我当前设置中的代码中实现此过程。我可以访问mainMixer.volume / outputvolume,例如:

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

但这似乎不起作用。 AV和SCN组件如何连接在一起?

任何有关如何实现此功能的帮助或示例都将非常感激!

先谢谢。

1 个答案:

答案 0 :(得分:1)

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

在我的代码中起作用(尽管花了很多年才发现,但迅速熟悉并没有完全帮助)。 playerGuitar是一个SCNAudioPlayer变量。