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

问题描述 投票:0回答:1

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

java javafx playback
1个回答
0
投票

这是一个带有

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。

© www.soinside.com 2019 - 2024. All rights reserved.