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

ndasle7k  于 4个月前  发布在  Java
关注(0)|答案(1)|浏览(90)

我试图播放一个声音,在你无法分辨它何时重新开始的地方完美地循环。我知道我可以用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。有什么办法可以解决这个问题吗?

jslywgbw

jslywgbw1#

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

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 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。

相关问题