我试图播放一个声音,在你无法分辨它何时重新开始的地方完美地循环。我知道我可以用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代英特尔(R)酷睿(TM)i5- 1135 G7。有什么办法可以解决这个问题吗?
1条答案
按热度按时间jslywgbw1#
下面是一个
javax.sound
的例子,它循环一个wav
文件(你在问题中链接的名为tone.wav
的正弦波文件)。我把声音循环播放五次,但你可以想循环多少次就循环多少次。
要在JavaFX应用程序中使用它,可以在JavaFX任务中使用
javax.sound
Package 声音播放,并为其提供接口(注意并发应用程序的线程编码)。字符串
对我来说,我得到了一个连续的,无缝的音频循环与
javax.sound
播放。但是使用Java MediaPlayer或AudioClip,使用您的示例代码,我在循环之间得到了一个中断,就像您在问题中提到的那样。我不知道为什么会这样,如果它被限制在您正在播放的声音的某些属性上,或者在某些或所有平台上的JavaFX音频播放的某些当前限制。您可能想要询问openjfx-dev mailing list以获得更多信息。
使用的测试系统是OS X 14.1.2 Mac上的JavaFX 21.0.1和OpenJDK 21。
javax.sound
用法的说明。*javax.sound
是JavaFX媒体的替代声音播放接口。javax.sound
包是java.desktop
模块的一部分,该模块(从JavaFX 21开始)是任何JavaFX安装所必需的(即使javax.sound
系统与JavaFX无关)。javax.sound
系统可能不符合您的要求,因为它可能无法播放您想要的声音格式,但对于某些声音格式,它可能是一个可行的替代方案。如果需要,Oracle提供tutorial for the
javax.sound
API。