我正在尝试在Swift中使用SceneKit获得3d音频效果。
我的scene.rootNode是一个尺寸为100x100x100的长方体几何图形。在scene.rootNode中,我有一个50x5050维度的boxNode。然后在boxNode内部,我让audioNode生成1x1x1维度的声音,以及生成1x1x1维度的cameraNode。位置audioNode是0,0,0,cameraNode的位置是0,0,-10。
为了给人更深的空间感,我想放一个混响。但是,我不能访问SCNView.AVAudioEnvironmentNode。
它可以编译,但环境会导致nil和崩溃。
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.
}
}
}
发布于 2019-08-09 04:42:45
查看第一个代码段,您不能写入只读。audioEnvironmentNode
是一个只读属性,用于对已添加到场景中的SCNPlayer
中的音频进行空间化。
查看第二个(更长)代码段,您将创建两个节点并应用混响,但这些节点永远不会添加到场景中。
SCNAudioPlayer对象控制SceneKit场景中位置音频源的播放。若要使用位置音频,请首先创建可重用的SCNAudioSource或AVAudioNode对象以提供音频流。然后,创建一个音频播放器来控制该音频源的播放。最后,将音频播放器附加到SCNNode对象,以便基于该节点相对于场景的audioListener节点的位置进行空间化的3D音频播放。
如果查看您的代码,即使您已经创建了player : SCNPlayer
并通过强制转换为apn = player.audioNode as? AVAudioPlayerNode
添加了混响,但在代码中的任何一点都没有将任一节点附加到场景中的SCNNode。
我建议您将apn
作为子对象添加到节点,然后将其添加到场景中。
如果您已经这样做了,但仍然遇到问题,请更新上面的代码片段。
https://stackoverflow.com/questions/57351004
复制相似问题