swift 如何在RealityKit中与AirPods结合使用空间音频?

wbrvyc0a  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(145)

我正在为我的应用程序使用RealityKit,并尝试像这样使用空间音频:

let resource = try AudioFileResource.load(named: "CardMatchingSound.mp3",
                                      inputMode: .spatial,
                                loadingStrategy: .preload,
                                     shouldLoop: false)
entity.playAudio(resource)

我也已经尝试了prepareAudioplay之后,当使用应用程序没有任何耳机它甚至工作正常,我可以听到空间音频正确的设备上。
我遇到的唯一问题是,一旦我使用AirPods,第一次播放声音,就会出现巨大的滞后,有时它根本不再播放任何音频,或者在滞后后仍然可以工作,不断地将[BTAudio] XPC server error: Connection invalid放入控制台/日志。
有人知道我做错了什么吗?我是否必须先请求蓝牙许可?那会有点奇怪,因为我只是想播放音频,无论连接的是什么设备。注意:我也运行一个AVAudioPlayer的背景音乐在我的游戏。

xeufq47z

xeufq47z1#

RealityKit中的空间音频

我的答案取决于以下事实:你说的是什么样的空间音频为了在AR/VR环境中播放RealityKit Spatial Audio,您需要使用.aiff.mp3.caf的文件。要获得最佳效果,请使用MONO文件。但是,如果您的意思是Dolby,那么RealityKit不支持它。
我的Shure Aonic 50无线耳机完美再现了RealityKit的空间声音。苹果AirPods无法在AR场景中播放这样的音频没有明显的前提。
下面是你的代码应该是这样的:

import UIKit
import RealityKit

extension ViewController {       
    fileprivate func loadAudio() {       
        do {
            let audioResource = try AudioFileResource.load(
                                               named: "audio.mp3",
                                                  in: nil,
                                           inputMode: .spatial,
                                     loadingStrategy: .preload,
                                          shouldLoop: false)

            self.audioController = aEntity.prepareAudio(audioResource)
            self.audioController?.speed = 1.2
            self.audioController?.gain = 30                
            self.audioController?.play()                
        } catch {
            print("Get error while loading audio...")
        }
    }
}
class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    let aEntity = Entity()
    let aAnchor = AnchorEntity()
    var audioController: AudioPlaybackController? = nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
                    
        self.aAnchor.addChild(aEntity)
        self.arView.scene.anchors.append(aAnchor)
        self.loadAudio()
        
        // 100 meters away
        aEntity.move(to: Transform(translation: [0,0,-100]),
             relativeTo: nil, 
               duration: 10)
    }
}

相关问题