我正在尝试播放一种完美循环的声音,你无法分辨它何时重新开始。我知道我可以使用 setCycleCount 方法让 AudioClip 或 MediaPlayer 无限循环,并且这是有效的。然而,音频并不是完全连续的;有一瞬间它没有播放,所以当它重新开始时它非常明显。我知道这不是音频文件本身的问题,因为当我在音频播放器上循环播放它时,它会完美循环。我尝试过 AudioClip 和 MediaPlayer,并尝试使用 setOnEndOfMedia 使其循环,但它们都有相同的问题。这是一个例子:
import java.io.File;
import java.net.*;
import java.util.Scanner;
import javafx.scene.media.*;
public class AudioTest {
public static void main(String[] args) {
URI audioURI = new File("filePath").toURI();
AudioClip audio = new AudioClip(audioURI.toString());
audio.setCycleCount(AudioClip.INDEFINITE);
audio.play();
/*
setOnEndOfMedia version
MediaPlayer audio = new MediaPlayer(new Media(audioURI.toString()));
audio.setOnEndOfMedia(new Runnable() {
@Override
public void run() {
audio.seek(Duration.ZERO);
audio.play();
}
});
*/
new Scanner(System.in).next(); // to prevent the program from closing immediately
}
}
以及示例音频文件的链接: https://drive.google.com/file/d/1NzlqY-K7m__qXE6iKJw3H26KZ8Ql4U2n/view?usp=sharing
我的操作系统是 Windows 11,我使用的是 Java 17 和 JavaFX 17。我的 CPU 是第 11 代 Intel(R) Core(TM) i5-1135G7。 有什么办法可以解决这个问题吗?
这是一个带有
javax.sound
的示例,它循环 wav
文件(您在问题中链接的名为 tone.wav
的正弦波文件)。
我将声音循环五次,但你可以根据需要循环多次。
要从 JavaFX 应用程序中使用它,您可以在 JavaFX 任务中使用
javax.sound
包装声音播放并为其提供接口(注意并发应用程序的线程编码)。
import javax.sound.sampled.*;
import java.io.IOException;
import java.util.Objects;
import java.util.Scanner;
public class SoundTest {
public static void main(String[] args) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
AudioInputStream stream = AudioSystem.getAudioInputStream(
Objects.requireNonNull(
SoundTest.class.getResource(
"tone.wav"
)
)
);
AudioFormat format = stream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, format);
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(stream);
clip.loop(5);
// clip.start();
new Scanner(System.in).next(); // to prevent the program from closing immediately
}
}
对我来说,我可以通过
javax.sound
播放获得连续、无缝的音频循环。
但是使用 Java MediaPlayer 或 AudioClip,使用您的示例代码,正如您在问题中提到的那样,我在循环之间得到了休息。我不知道为什么会这样,以及它是否受限于您正在播放的声音的某些属性,或者某些或所有平台上 JavaFX 音频播放的当前限制。您可能想询问 openjfx-dev 邮件列表以获取更多信息。
使用的测试系统是 OS X 14.1.2 Mac 上的 JavaFX 21.0.1 和 OpenJDK 21。