SceneKit - 我第一次播放声音时,音频会导致 cxa_throw 出现延迟

Posted

技术标签:

【中文标题】SceneKit - 我第一次播放声音时,音频会导致 cxa_throw 出现延迟【英文标题】:SceneKit - Audio causes cxa_throw with a lag the first time I play a sound 【发布时间】:2015-07-29 12:15:44 【问题描述】:

我播放这样的声音(这是在 SCNNode 子类中):

    let audiosource = SCNAudioSource(named: "coin.wav")
    let audioPlayer = SCNAudioPlayer(source: audioSource)
    self.addAudioPlayer(audioPlayer)

第一次调用它时,我得到了严重的延迟并且抛出了一个期望。 当我禁用 All_Expection_Breakpoint 时,我注意到了延迟。

对此我能做些什么?

【问题讨论】:

【参考方案1】:

C++ 异常来自 SceneKit 音频层使用的 AVAudioEngine。 AVAudio* 框架在内部使用 C++ 异常,因此如果您在 Xcode 中设置断点以在引发 C++ 异常时中断,Xcode 将在 AVAudio* 代码中中断很多(主要是在初始化时)。您可以放心地忽略它们,因为它们在到达您的代码之前就被框架捕获了。

如果您不希望出现延迟,您可以实例化您的音频源并在启动时加载它: 让 audioSource = SCNAudioSource(命名:“coin.wav”) audioSource.load()

然后在以后需要的时候添加播放器: 让 audioPlayer = SCNAudioPlayer(来源:audioSource) self.addAudioPlayer(audioPlayer)

顺便说一句,播放器被缓存和回收,所以你不必太担心内存被无用使用。

还请注意,SCNAction 使用的 API 与您使用的 API 完全相同,因此,如果您创建的动作包含以前未使用 .load() 加载到内存中的声音,您也会遇到延迟。

希望这会有所帮助,

S.

【讨论】:

谢谢,我试过了,但使用加载功能也没有帮助。防止延迟发生的原因是在真正使用音频引擎之前播放无声的声音(任何声音)。我很确定这是 SceneKit 音频引擎中的一个错误,它只会在第一次播放任何声音时造成任何延迟。你有没有注意到类似的事情? 你能提交一份关于这个滞后问题的雷达吗?这显然是一个错误。谢谢!【参考方案2】:

这实际上仅适用于大气、环境和背景环境类型的声音,可以与角色一起循环和移动,或者附加到瀑布或类似的位置。

对于需要低延迟的即时音效而言,它不是一个高性能的即时声音播放器。

为此,您最好在需要时使用 SCNAction 将音频作为 Action 播放,或者使用专为低延迟声音播放而设计的 Fmod 之类的东西。

我不知道我是怎么知道的。

【讨论】:

谢谢!这是正确的,但是尽管最初抛出的 C++ 异常仍然存在。 AVAudioPlayer 有一个有趣的功能,称为“prepareToPlay” 闲逛看看能不能挑起这个prepareToPlay方法会不会很糟糕? 但我无法通过操作访问它。 您可以在方便的时候调用 SCNAudioSource.load() 函数来提前加载 coin.wav 文件。这可能会达到同样的效果,并且无需使用 Actions 来播放即时声音。

以上是关于SceneKit - 我第一次播放声音时,音频会导致 cxa_throw 出现延迟的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit AVPlayer 仅播放音频

捕获音频/视频后无法播放系统声音

我正在尝试显示文本,单击时播放音频,当声音结束时出现新文本,单击时播放新音频

iOS - 在录制视频时播放音频/声音

2 个音频声音,我想一次播放一个 HTML5 音频元素

播放音乐时,我的音频应用程序中没有收到通知或消息的声音 | AV音频播放器