如何在JavaFX中完美地制作AudioClip/MediaPlayer?

ndasle7k  于 2024-01-05  发布在  Java
关注(0)|答案(1)|浏览(385)

我试图播放一个声音,在你无法分辨它何时重新开始的地方完美地循环。我知道我可以用setCycleCount方法让AudioClip或MediaPlayer无限循环,这很有效。然而,音频并不是完全连续的;有那么一瞬间它没有播放所以当它重新开始的时候,这是非常明显的。我知道这不是音频文件本身的问题,因为当我在音频播放器上循环播放时,它会完美地循环。我试过AudioClip和MediaPlayer,我尝试使用setOnEndOfMedia来使其循环,但它们都有同样的问题。下面是一个例子:

  1. import java.io.File;
  2. import java.net.*;
  3. import java.util.Scanner;
  4. import javafx.scene.media.*;
  5. public class AudioTest {
  6. public static void main(String[] args) {
  7. URI audioURI = new File("filePath").toURI();
  8. AudioClip audio = new AudioClip(audioURI.toString());
  9. audio.setCycleCount(AudioClip.INDEFINITE);
  10. audio.play();
  11. /*
  12. setOnEndOfMedia version
  13. MediaPlayer audio = new MediaPlayer(new Media(audioURI.toString()));
  14. audio.setOnEndOfMedia(new Runnable() {
  15. @Override
  16. public void run() {
  17. audio.seek(Duration.ZERO);
  18. audio.play();
  19. }
  20. });
  21. */
  22. new Scanner(System.in).next(); // to prevent the program from closing immediately
  23. }
  24. }

字符串
以及指向示例音频文件的链接: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。有什么办法可以解决这个问题吗?

jslywgbw

jslywgbw1#

下面是一个javax.sound的例子,它循环一个wav文件(你在问题中链接的名为tone.wav的正弦波文件)。
我把声音循环播放五次,但你可以想循环多少次就循环多少次。
要在JavaFX应用程序中使用它,可以在JavaFX任务中使用javax.sound Package 声音播放,并为其提供接口(注意并发应用程序的线程编码)。

  1. import javax.sound.sampled.*;
  2. import java.io.IOException;
  3. import java.util.Objects;
  4. import java.util.Scanner;
  5. public class SoundTest {
  6. public static void main(String[] args) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
  7. AudioInputStream stream = AudioSystem.getAudioInputStream(
  8. Objects.requireNonNull(
  9. SoundTest.class.getResource(
  10. "tone.wav"
  11. )
  12. )
  13. );
  14. AudioFormat format = stream.getFormat();
  15. DataLine.Info info = new DataLine.Info(Clip.class, format);
  16. Clip clip = (Clip) AudioSystem.getLine(info);
  17. clip.open(stream);
  18. clip.loop(5);
  19. // clip.start();
  20. new Scanner(System.in).next(); // to prevent the program from closing immediately
  21. }
  22. }

字符串
对我来说,我得到了一个连续的,无缝的音频循环与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。

展开查看全部

相关问题