SceneKit:位置音频不起作用

Posted

技术标签:

【中文标题】SceneKit:位置音频不起作用【英文标题】:SceneKit: positional audio won't work 【发布时间】:2018-05-28 13:06:15 【问题描述】:

我正在尝试让 SceneKit 在我的一个角色移动时播放脚步声。当他们靠近(靠近播放器)时,音频的音量应该会增加。

这就是我设置音频源的方式:

private lazy var stepAudiosource:SCNAudioSource = 
    let tempAudioSource = SCNAudioSource(fileNamed: "art.scnassets/Audio/step_enemy.wav")!
    tempAudioSource.volume = 0.3
    tempAudioSource.rate = 0.1
    tempAudioSource.loops = true
    tempAudioSource.shouldStream = false
    tempAudioSource.isPositional = true

    return tempAudioSource
()

一开始我尝试使用 playAudioSource 播放音频,给动作一个键并尝试在每次角色停止时将其移除。不幸的是,即使删除动作似乎也没有停止音频播放,所以我这样做了:

private var isWalking:Bool = false 
    didSet
        if oldValue != isWalking 
            if isWalking
                addAnimation(runAnimation, forKey: "run")

                    let sfxPlayer = SCNAudioPlayer(source: stepAudioSource)
                    characterNode.addAudioPlayer(sfxPlayer)
            else
                removeAnimation(forKey: "run", blendOutDuration: 0.2)

                removeAllAudioPlayers()
            
        
    

音频文件是单声道的,因为我发现位置音频不适用于双声道音频。 shouldStream 属性设置为 false。

这在大多数情况下确实有效。不幸的是,如果节点开始距离玩家太远,脚步音频将不会开始播放,并且当它们真正靠近时不会听到任何声音。我做错了什么?

【问题讨论】:

【参考方案1】:

试试这个方法:

let tempAudioSource = SCNAudioSource(fileNamed: "art.scnassets/Audio/step_enemy.wav")!
tempAudioSource.volume = 0.3
tempAudioSource.rate = 0.1
tempAudioSource.loops = true
tempAudioSource.isPositional = true
tempAudioSource.shouldStream = false
tempAudioSource.load()            //loads audio data and prepares it for playing...
let player = SCNAudioPlayer(source: tempAudioSource)  
whatEverNode.addAudioPlayer(player)

不要忘记audio listener 节点——该节点代表听众在场景中的位置,用于位置音频效果。

var audioListener: SCNNode?  get set 

【讨论】:

如何设置audioListner?我找不到任何示例。。谢谢? 嗨@DamianoMiazzi,请将其发布为 SO 问题。 您好,我在这里发布问题:***.com/questions/66191859/…

以上是关于SceneKit:位置音频不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在特定时间播放音频文件的 JavaScript 程序似乎不起作用

Xml 音频列表播放器在移动设备上不起作用,并且自动播放不起作用

音频自动播放不起作用html5

音频遥控器不起作用

SDL 音频回叫不起作用?

html5 音频 currentTime 不起作用