gpt4 book ai didi

java - Java 中是否有一致的方法来跟踪剪辑(或音频文件)中的位置?

转载 作者:行者123 更新时间:2023-12-02 09:56:39 24 4
gpt4 key购买 nike

我正在尝试用 Java 编写节奏游戏。我正在使用 javax.sound.sampled.Clip 播放音频文件,我想知道我所在的确切位置。

根据我的研究,节奏游戏的一个很好的做法是使用音乐播放中的位置而不是系统时间来跟踪时间(以避免音频和游戏之间的转换)。

我已经编写了一个主循环,它使用 System.nanoTime() 来保持一致的帧速率。但是当我尝试获取剪辑的时间时,我返回了几帧的相同时间。这是我的代码的摘录:

while (running) {
// Get a consistent frame rate
now = System.nanoTime();
delta += (now - lastTime) / timePerTick;
timer += now - lastTime;
lastTime = now;
if (delta >= 1) {
if(!paused) {
tick((long) Math.floor(delta * timePerTick / 1000000));
}
display.render();
ticks++;
delta--;
}
// Show FPS ...
}

// ...

private void tick(long frameTime) {
// Doing some stuff ...
System.out.println(clip.getMicrosecondPosition());
}

我期望获得一致的输出(120 fps 下每帧增量约为 8,333 µs),但我得到了多个帧的相同时间。

控制台返回:

0
0
748
748
748
10748
10748
10748
20748
20748
20748
30748

我怎样才能持续准确地掌握我在歌曲中的位置?有没有 javax Clip 的替代品?

最佳答案

有很多困难需要解决。首先,Java 不提供实时保证,因此处理部分声音数据的时刻并不一定对应于听到声音的时刻。其次,操作系统时钟缺乏粒度很容易造成困惑,我猜这就是导致您看到计时多次出现的原因。几年前,我们在 java-gaming.org 上对此进行了很多反复讨论。 [编辑:现在我认为您的检查循环速度比剪辑使用的缓冲区大小的粒度更快。]

我知道要获得真正精确的计时的唯一方法是放弃使用 Clip完全,而是在 SourceDataLine 上输出时对帧进行计数。我在这方面取得了很好的成功。这是输出到 native 声音渲染代码之前的最后一点,因此具有最佳时机。

也就是说,有可能以固定的时间间隔(对应于四分音符或十六分音符)实现某种脉冲(例如,使用 util.Timer),并让 TimerTask 启动 Clip 的播放。对象。我自己还没有尝试过,但这对于节奏游戏来说已经足够了。为此,您可以使用 Clip对象而不是 SourceDataLine 。但请确保每个 Clip已满载并准备好播放。不要犯每次播放时重新加载它们的常见错误。

但是当我上次尝试使用常见的游戏循环做这样的事情时,结果并不是那么热。

JavaFX 非常适合游戏编写!我发现图形比 AWT 更容易处理。我写了一个tutorial开始使用 JavaFX 进行游戏编程。如果您使用的是 JavaFX 11,就使用 Eclipse 进行设置而言,它已经过时了。但如果您使用的是 Java 8,我认为它仍然涵盖了基础知识。

在 JGO,人们处于两个不同的阵营。许多人喜欢使用 Libgdx 这个库,我们中的一些人继续使用 JavaFX 或 AWT/Swing。还有另外几个图书馆也受到了各个成员的支持。

JavaFX 有自己的声音输出,但我没有玩过它,不知道它是否比 Clip 的节奏精度更好。所有的提示都发挥得很好,但是考虑到 Java 系统在线程之间不断切换,从提示中获取可用的计时信息总是很困难。

刚刚查看 JGO 上的内容。你可能会发现这个线程很有趣,OP 试图制作一个节拍器。 http://www.java-gaming.org/topics/java-audio-metronome-timing-and-speed-problems/33591/view.html

[编辑:P.S.,我已经编写了一个可靠的节拍器,并且有一个足够可靠的事件回放系统,可以以无缝的节奏将音乐事件串在一起,并且监听器可以跟踪正在播放的音符的音量包络等内容实时。最终应该可以做你想做的事。]

关于java - Java 中是否有一致的方法来跟踪剪辑(或音频文件)中的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55952501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com