0

我正在制作一个游戏,其中有一系列事件(例如,在 60fps 设置中每 30 帧发生一次),我想与音乐同步(以 120 bpm)。在通常情况下,例如节奏游戏,将事件与音乐同步更容易,因为人类似乎感知到音乐中的间隙比视频中小得多。然而,就我而言,游戏很大程度上依赖于基于帧的时间,如果我改变我的系列赛事的时间表,很多事情都会中断。

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

在这种情况下,最简单的出路是什么?我可以参考有关此主题的任何参考吗?任何建议表示赞赏!

4

1 回答 1

0

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

如果您在页面上搜索短语“在这里,对音频数据做一些有用的事情”,则可以在本教程 Using Files and Format Converters中看到一些显示帧计数的示例代码。它们是在计算字节数,而不是 PCM 帧,但该示例确实给出了基本概念。

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

于 2021-08-21T19:37:32.657 回答