【问题标题】:Sync music to frame-based time将音乐同步到基于帧的时间
【发布时间】:2021-10-22 17:35:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: audio audio-video-sync


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多