Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中不断变化的场景混响环境?_Swift_Macos_Scenekit_Scnaudioplayer - Fatal编程技术网

Swift中不断变化的场景混响环境?

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 为了给人更深刻的空间感受,我想放一个混响。

我正在尝试使用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和崩溃

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中。