Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java声音API初始化_Java_Javasound - Fatal编程技术网

Java声音API初始化

Java声音API初始化,java,javasound,Java,Javasound,我使用以下代码在游戏中播放声音 import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.DataLine; import javax.sound.sampled.LineUnavaila

我使用以下代码在游戏中播放声音

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.IOException;

public class AudioController {

    public static void playback(String fileName) 
        throws LineUnavailableException, UnsupportedAudioFileException, IOException {
        AudioInputStream ais = AudioSystem.getAudioInputStream(AudioController.class.getClassLoader().getResourceAsStream("sounds/"+fileName));

        AudioFormat format = ais.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        Clip clip = (Clip) AudioSystem.getLine(info);

        clip.open(ais);
        clip.start();
    }
}

问题是:如果第一次播放声音,应用程序会挂起一小段时间,因为需要进行某种初始化工作。之后播放的每一个声音都不会显示这种行为。如何防止这种情况发生?

首先,与Java Media Framework之类的东西相比,Java的声音库相当薄弱,您可以研究一下,但是如果这是一个声音效果最小的简单游戏,Java的声音库就足够了。您可能需要提供更多关于您想要播放的声音文件类型(格式、长度等)的详细信息,以便我们能够更好地解决您的问题

如果要播放短片段声音(少于一秒),应在开始时初始化片段,并在需要时播放:

//initialize this at the beginning of your program
AudioInputStream soundStream = AudioSystem.getAudioInputStream(new File("sound.wav"));

Clip soundEffect = AudioSystem.getClip();
soundEffect.open(soundStream);

...

//later, play the sound
soundEffect.start();
问题是这个剪辑的缓冲区非常有限,你不能远程播放任何东西(根据我的经验,平均时间超过1秒)

如果您想播放背景音乐或更长的时间,并且希望避免自己管理字节流,那么您必须查看外部库。存在一个BigClip类,我似乎找不到该类的下载链接,但您可以查看:

当我不得不播放更长的声音时,我会使用我自己的PCMFilePlayer类的修改版本(我添加了一些额外的方法,使其工作起来更像一个BigClip):


在任何一种情况下,我都会在节目开始时加载尽可能多的合理声音,并播放所需的声音,但在所有情况下,声音的数量都非常有限。如果您正在播放大量的声音/音乐或担心内存使用,您可能需要查看功能强大得多的JMF之类的库。

首先,Java的声音库与Java Media Framework之类的东西相比相当薄弱,您可能会查看它,但如果这是一个声音效果非常小的简单游戏,Java的声音库应该足够了。您可能需要提供更多关于您想要播放的声音文件类型(格式、长度等)的详细信息,以便我们能够更好地解决您的问题

如果要播放短片段声音(少于一秒),应在开始时初始化片段,并在需要时播放:

//initialize this at the beginning of your program
AudioInputStream soundStream = AudioSystem.getAudioInputStream(new File("sound.wav"));

Clip soundEffect = AudioSystem.getClip();
soundEffect.open(soundStream);

...

//later, play the sound
soundEffect.start();
问题是这个剪辑的缓冲区非常有限,你不能远程播放任何东西(根据我的经验,平均时间超过1秒)

如果您想播放背景音乐或更长的时间,并且希望避免自己管理字节流,那么您必须查看外部库。存在一个BigClip类,我似乎找不到该类的下载链接,但您可以查看:

当我不得不播放更长的声音时,我会使用我自己的PCMFilePlayer类的修改版本(我添加了一些额外的方法,使其工作起来更像一个BigClip):


在任何一种情况下,我都会在节目开始时加载尽可能多的合理声音,并播放所需的声音,但在所有情况下,声音的数量都非常有限。如果您正在播放大量的声音/音乐或担心内存使用,您可能需要查看功能更强大的JMF之类的库。

我也遇到过这个问题,我的经验是,它与剪辑的大小无关,但事实上,由于许多JavaSound类的加载开销,很多类在您第一次尝试启动剪辑时都会被加载

如果将参数-verbose:class添加到java中,您可能也会看到这个问题


对我来说,有效的方法是使用一个没有任何音频的silent.wav文件。我在主声音开始前播放它,它让一切都准备好了。

我也遇到过这个问题,我的经验是,这与剪辑的大小无关,而是由于许多JavaSound类的加载开销,很多类在第一次尝试启动剪辑时都会被加载

如果将参数-verbose:class添加到java中,您可能也会看到这个问题


对我来说,有效的方法是使用一个没有任何音频的silent.wav文件。我在主声音开始前播放它,它会让一切都准备就绪。

为了让JavaSound的生活更轻松,我正在开发这个库。也许值得你去调查一下。示例和其他内容可以在这里找到:为了让JavaSound的生活更轻松,我正在开发这个库。也许值得你去调查一下。示例和其他内容可在此处找到: