带有 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 中播放的声音