同步音乐到基于帧的时间



我正在制作一款包含一系列事件(游戏邦注:比如在60fps的设置下每30帧发生一次)的游戏,我希望这些事件能够与音乐(120 bpm)同步。在通常情况下,例如节奏游戏,将事件与音乐同步更容易,因为人类似乎在音乐中比在视频中感知到更小的间隙。然而,在我的例子中,游戏很大程度上依赖于基于框架的时间,如果我改变了一系列事件的时间表,很多事情就会中断。

经过大量的实验,在我看来,在不干扰人耳的情况下调整音乐几乎是不可能的:~1ms的跳跃是明显的,视频和音频之间~10ms的差异是明显的,音调的0.5%变化是明显的。而且我没有方便的工具来加速音频而不改变音高。

在这种情况下,最简单的出路是什么?这方面有什么资料可供我参考吗?任何建议都是感激的!

我成功使用的方法I(在Java中)是通过允许PCM帧计数的路径路由播放信号(音频帧以44100 fps的速率运行,而不是以60 fps的速率运行的屏幕更新)。我不知道其他语言,但在Java中,这可以通过使用SourceDataLine类输出来完成。随着音频帧数的增加,可以将其与需要触发其他系统或线程的事件集合上的下一个项目(待处理项目)进行比较。Java有一个处理事件集合的优秀类:ConcurrentSkipListSet。它是异步的,并通过Comparator设置到所需的PCM帧数自动对元素进行排序。

一些显示帧计数的示例代码可以在本教程使用文件和格式转换器中看到,如果您在页面上搜索短语"这里,对音频数据做一些有用的事情"。他们计算的是字节数,而不是PCM帧数,但这个例子确实给出了基本的概念。

为什么计算PCM有效?我认为这与以下事实有关:这段代码(在Java中)是我们最接近将音频数据馈送到控制声音系统的本地代码的地方,并且这段代码使用了阻塞队列。因此,只有当音频系统准备好接收和播放更多的声音数据时,写入操作才会发生,并且音频系统必须非常准确地保持其处理速度。这里发生的时间变化量(特别是如果线程被赋予高优先级)小于JVM在处理多个线程和进程时所做的选择所引起的时间变化。

最新更新