微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你如何在和来自JAR背景音乐中播放长音频剪辑?

如何解决你如何在和来自JAR背景音乐中播放长音频剪辑?

我正在做一个宠物项目(一种游戏)。我遇到了一个问题:当使用以下命令从控制台调用应用程序时:

C:\java -jar MyGame.jar

会播放短音,但不会播放长音。 所有声音都在“/assets”文件夹中的 JAR 中。

音频路径如下所示:

C:\MyGame.jar\assets\background_music.wav

比如投篮或者跳投。对于长音频数据,仅播放前 0.5 秒。

例如:如果您加载长度为 0.834 秒的声音,则它会循环播放(背景音乐),声音会循环播放! (WAV 文件,0.843 秒,48 KB)。 但是如果加载一个WAV文件2秒,大小115KB,只播放0.5-1秒。 如果您加载 15 秒(或 7 秒)且大小为 110 - 2000 KB 或更大的 WAV 背景音乐文件,则将播放相同的 0.5 秒。每 15(或 7)秒(如果您说“循环播放”)。

也就是说,文件被加载,它的长度被加载,标记被放置在开头和结尾,但我只听到音频的前 0.5 秒(每“x”-sec,其中“x”是剪辑的长度)。

音频上传方式:

public static InputStream uploadAudio (String path){
    InputStream sourceSound = null;
    try{

        final File jarFile = new File(ResourceLoader.class.getProtectionDomain().getCodeSource().getLocation().getPath());
        if(jarFile.isFile()) {  // Run with JAR file

            final JarFile jar = new JarFile(jarFile);


            InputStream fileInputStreamReader =(jar.getInputStream(jar.getEntry(path)));
            byte[] byteArray = new byte[fileInputStreamReader.available()];
            fileInputStreamReader.read(byteArray);

            InputStream newInputStreamFromArray =  new BufferedInputStream(new ByteArrayInputStream(byteArray));

            sourceSound = newInputStreamFromArray;
            jar.close();

        } else { // Run with IDE

            URL url = ResourceLoader.class.getResource( "../" + path);
            InputStream fileInputStreamReader = new BufferedInputStream(new FileInputStream(url.getPath()));
            sourceSound = fileInputStreamReader;
        }

    }catch (IOException e){
        e.printstacktrace();
    }
    return sourceSound;
}

部分音频播放类:

public class Sound implements AutoCloseable {
private boolean released = false;
private AudioInputStream stream = null;
private Clip clip = null;
private FloatControl volumeControl = null;
private boolean playing = false;

public Sound(InputStream inputStream) {
    try {
        stream = AudioSystem.getAudioInputStream(inputStream);
        clip = AudioSystem.getClip();
        clip.open(stream);
        clip.addLineListener(new Listener());
        volumeControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
        released = true;
    } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) {
        exc.printstacktrace();
        released = false;

        close();
    }
}


public void playLoop(boolean breakOld){
    if (released) {
        if (breakOld) {
            clip.stop();
            clip.loop(Clip.LOOP_CONTINUOUSLY);
            playing = true;
        } else if (!isPlaying()) {
            clip.loop(Clip.LOOP_CONTINUOUSLY);
            playing = true;
        }
    }

}
public void playLoop(){
    playLoop(true);
}

没有错误。该程序有效。背景声音循环播放,但只有 0.5 秒的剪辑。 播放短声(射击或跳跃声)。一切都在 IDE 中运行:简短的声音和完整的背景音乐。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。