Swift中不断变化的场景混响环境?
我正在尝试使用Swift中的SceneKit获得3d音频效果 My scene.rootNode是一个尺寸为100x100x100的长方体几何体。在scene.rootNode内部,我有一个尺寸为50x5050的boxNode。然后在boxNode内部,我有一个audioNode,它可以生成1x1x1尺寸的声音,还有一个cameraNode,它可以生成1x1x1尺寸的声音。audioNode的位置为0,0,0,cameraNode的位置为0,0,-10 为了给人更深刻的空间感受,我想放一个混响。但是,我无法访问SCNView.avaudioenvironment节点 它可以编译,但环境会导致nil和崩溃Swift中不断变化的场景混响环境?,swift,macos,scenekit,scnaudioplayer,Swift,Macos,Scenekit,Scnaudioplayer,我正在尝试使用Swift中的SceneKit获得3d音频效果 My scene.rootNode是一个尺寸为100x100x100的长方体几何体。在scene.rootNode内部,我有一个尺寸为50x5050的boxNode。然后在boxNode内部,我有一个audioNode,它可以生成1x1x1尺寸的声音,还有一个cameraNode,它可以生成1x1x1尺寸的声音。audioNode的位置为0,0,0,cameraNode的位置为0,0,-10 为了给人更深刻的空间感受,我想放一个混响。
let environment = sceneView.audioEnvironmentNode
environment.reverbBlend = 0.5 // CRASH!: LLBD
environment.renderingAlgorithm = .HRTFHQ
let reverb = environment.reverbParameters
reverb.enable = true
reverb.loadFactoryReverbPreset(.mediumRoom)
我还尝试创建自己的AVAudioEnvironment,启用混响,然后分配给sceneView.audioEnvironmentNode,但XCode表示sceneView.audioEnvironmentNode是不可变的
如果有人能帮我在我的场景中添加混响,我将不胜感激
这是我的测试代码。谢谢
import Cocoa
import AVFoundation
import SceneKit
class ViewController: NSViewController {
@IBOutlet weak var sceneView: SCNView!
override func viewDidLoad() {
super.viewDidLoad()
let path = Bundle.main.path(forResource: "Sounds/Test_mono.mp3", ofType: nil)
let url = URL(fileURLWithPath: path!)
let source = SCNAudioSource(url: url)!
source.loops = true
source.shouldStream = false
source.isPositional = true
source.load()
let player = SCNAudioPlayer(source: source)
if let apn = player.audioNode as? AVAudioPlayerNode {
apn.renderingAlgorithm = .HRTFHQ
apn.reverbBlend = 0.5
}
let audioNode = SCNNode(geometry: SCNBox(width:1, height:1, length:1, chamferRadius: 0.1))
let cameraNode = SCNNode(geometry: SCNBox(width:1, height:1, length:1, chamferRadius: 0.1))
cameraNode.camera = SCNCamera()
let boxNode = SCNNode(geometry: SCNBox(width:50, height:50, length:50, chamferRadius: 1))
boxNode.addChildNode(audioNode)
audioNode.position = SCNVector3(x: 0, y: 0, z: 0)
boxNode.addChildNode(cameraNode)
cameraNode.position = SCNVector3(x: 0, y: 0, z: -10)
let scene = SCNScene()
scene.rootNode.geometry = SCNBox(width:100, height:100, length:100, chamferRadius: 0.1)
scene.rootNode.addChildNode(boxNode)
boxNode.position = SCNVector3(x: 0, y: 0, z: 0)
sceneView.scene = scene
sceneView.pointOfView = cameraNode
sceneView.audioListener = cameraNode
let environment = sceneView.audioEnvironmentNode
environment.reverbBlend = 0.5 // CRASH!: LLBD
environment.renderingAlgorithm = .HRTF
let reverb = environment.reverbParameters
reverb.enable = true
reverb.loadFactoryReverbPreset(.mediumRoom)
audioNode.addAudioPlayer(player)
let move = SCNAction.moveBy(x:0, y:1, z:0, duration: 1)
let sequence = SCNAction.sequence([move])
let loop = SCNAction.repeatForever(sequence)
audioNode.runAction(loop)
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
查看第一个代码段,您无法写入只读文件。是一个只读属性,用于对已添加到场景的
SCNPlayer
中的音频进行空间化
查看第二个(较长)片段,您正在创建两个节点并应用混响,但这些节点从未添加到场景中
根据
SCNAudioPlayer对象控制SceneKit场景中位置音频源的播放。要使用位置音频,首先创建可重用的SCNAudioSource或AVAudioNode对象以提供音频流。然后,创建一个音频播放器来控制该音频源的播放。最后,根据该节点相对于场景的audioListener节点的位置,将音频播放器连接到SCNNode对象以进行空间化的3D音频播放
如果您查看您的代码,即使您已经创建了player:SCNPlayer
,并通过强制转换将混响添加到apn=player.audioNode as?AVAudioPlayerNode
在代码中的任何一点上,都不能将任一节点附加到场景中的SCNNode
我建议您将apn
作为子节点添加到节点,并将其添加到场景中
如果您已经这样做了,但仍然遇到问题,请更新上面的代码片段 查看第一个代码段,您无法写入只读文件。是一个只读属性,用于对已添加到场景的
SCNPlayer
中的音频进行空间化
查看第二个(较长)片段,您正在创建两个节点并应用混响,但这些节点从未添加到场景中
根据
SCNAudioPlayer对象控制SceneKit场景中位置音频源的播放。要使用位置音频,首先创建可重用的SCNAudioSource或AVAudioNode对象以提供音频流。然后,创建一个音频播放器来控制该音频源的播放。最后,根据该节点相对于场景的audioListener节点的位置,将音频播放器连接到SCNNode对象以进行空间化的3D音频播放
如果您查看您的代码,即使您已经创建了player:SCNPlayer
,并通过强制转换将混响添加到apn=player.audioNode as?AVAudioPlayerNode
在代码中的任何一点上,都不能将任一节点附加到场景中的SCNNode
我建议您将apn
作为子节点添加到节点,并将其添加到场景中
如果您已经这样做了,但仍然遇到问题,请更新上面的代码片段 谢谢你的回复。事实上,我确实在末尾将播放器添加到了一个节点。“audioNode.addAudioPlayer(播放器)”。否则,我就听不到任何声音。另外,audioNode被添加到一个框中,而box被添加到一个sceneView.rootNode中。感谢您的回复。事实上,我确实在末尾将播放器添加到了一个节点。“audioNode.addAudioPlayer(播放器)”。否则,我就听不到任何声音。此外,audioNode被添加到框中,而box被添加到sceneView.rootNode中。