带有 AVAudioPlayerNode 的 SpriteKit 位置音频

Posted

技术标签:

【中文标题】带有 AVAudioPlayerNode 的 SpriteKit 位置音频【英文标题】:SpriteKit Positional Audio with AVAudioPlayerNode 【发布时间】:2021-11-22 01:55:40 【问题描述】:

我目前正在测试 SpriteKit 位置音频实现,发现自己在从加载 mp3 文件切换到缓冲文件后卡住了。

文件缓冲区正在正确加载,但我丢失了 SpriteKit 的位置音频效果,并且似乎无法通过更改父 SKSpriteNode 来更改音频源的位置(就像我以前一样)。

这是我的代码,我很高兴听到您的想法:

import SpriteKit
import AVFoundation

class GameScene: SKScene 

var audioFilePlayer = AVAudioPlayerNode()
var mainMixer = AVAudioMixerNode()
var bufferFormat = AVAudioPCMBuffer()

override func didMove(to view: SKView) 

   let player = SKSpriteNode(imageNamed: "player")
   player.position =  CGPoint(x:0,y:0)
   scene?.addChild(player)

   let sprite = SKSpriteNode(imageNamed: audiosourceImage)
   sprite.position = CGPoint(x:10,y:0)
   
   // setup nodes
   var backgroundMusic = SKAudioNode()
   sprite.addChild(backgroundMusic)
   player.addChild(sprite)
   // setup audio buffer and link to audioEngine
   let url = Bundle.main.url(forResource: "audioSourceMono", withExtension: "m4a")
   let file = try! AVAudioFile(forReading: url!)
   do 
       let audioFormat = file.processingFormat
       let audioFrameCount = UInt32(file.length)
       guard let audioFileBuffer = AVAudioPCMBuffer(pcmFormat: audioFormat, frameCapacity: audioFrameCount) else return 
       self.bufferFormat = audioFileBuffer
       try file.read(into: audioFileBuffer)
       
       //get scene main mixer and connect audioPlayer to mixer
       scene!.audioEngine.attach(self.audioFilePlayer)
       let mainMixer = scene!.audioEngine.mainMixerNode
       backgroundMusic.avAudioNode = audioFilePlayer
       scene!.audioEngine.connect(backgroundMusic.avAudioNode!, to: mainMixer, format: audioFileBuffer.format)
                            
       try audioEngine.start()

       audioFilePlayer.scheduleBuffer(audioFileBuffer, completionHandler: nil)
       audioFilePlayer.play()
    catch 
       print(error)
   

   // enable positional audio
   backgroundMusic.isUserInteractionEnabled = true
   backgroundMusic.isPositional = true


【问题讨论】:

【参考方案1】:

我的问题是我覆盖了预定义的场景 audioEngine 设置,而没有将其重新连接到场景 audioEngine 以及因此 audioEngine 环境节点。

【讨论】:

以上是关于带有 AVAudioPlayerNode 的 SpriteKit 位置音频的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 AVAudioPlayerNode 从头开始​​重播声音?

播放完成后在 AVAudioPlayerNode 上调用 stop() 会导致崩溃

AVAudioEngine 录制在 AVAudioPlayerNode 中播放的声音

AVAudioPlayerNode lastRenderTime

AVAudioPlayerNode音量更改不会立即应用

AVAudioPlayerNode 不播放声音