2016-07-12 2 views
1

Я знаю, что это было задано несколько раз, но в некоторых сценариях это по-другому, поэтому я не могу понять это. Когда я запускаю свою игру в Eclipse, все идет гладко, и игра работает отлично, но после ее экспорта она рушится. Я могу открыть игру и передвигаться в меню, но звуки не воспроизводятся, и после того, как я нажму игру, игра просто зависает, и она дает мне эту ошибку с cmd (я могу вставить любой класс, но, надеюсь, нужен только класс Audio) :java.io.IOException: отметка/сброс не поддерживается

java.io.IOException: mark/reset not supported 
    at java.util.zip.InflaterInputStream.reset(Unknown Source) 
    at java.io.FilterInputStream.reset(Unknown Source) 
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source) 
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) 
    at com.neet.Audio.JukeBox.load(JukeBox.java:26) 
    at com.neet.GameState.IntroState.<init>(IntroState.java:28) 
    at com.neet.GameState.GameStateManager.loadState(GameStateManager.java:48) 
    at com.neet.GameState.GameStateManager.setState(GameStateManager.java:72) 
    at com.neet.GameState.GameStateManager.<init>(GameStateManager.java:31) 
    at com.neet.Main.GamePanel.init(GamePanel.java:70) 
    at com.neet.Main.GamePanel.run(GamePanel.java:75) 
    at java.lang.Thread.run(Unknown Source) 

А вот аудио класс: `

package com.neet.Audio; 

import java.util.HashMap; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 

public class JukeBox { 

    private static HashMap<String, Clip> clips; 
    private static int gap; 
    private static boolean mute = false; 

    public static void init() { 
     clips = new HashMap<String, Clip>(); 
     gap = 0; 
    } 

    public static void load(String s, String n) { 
     if(clips.get(n) != null) return; 
     Clip clip; 
     try {   
      AudioInputStream ais = 
       AudioSystem.getAudioInputStream(
        JukeBox.class.getResourceAsStream(s) 
       ); 
      AudioFormat baseFormat = ais.getFormat(); 
      AudioFormat decodeFormat = new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, 
       baseFormat.getSampleRate(), 
       16, 
       baseFormat.getChannels(), 
       baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), 
       false 
      ); 
      AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais); 
      clip = AudioSystem.getClip(); 
      clip.open(dais); 
      clips.put(n, clip); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void play(String s) { 
     play(s, gap); 
    } 

    public static void play(String s, int i) { 
     if(mute) return; 
     Clip c = clips.get(s); 
     if(c == null) return; 
     if(c.isRunning()) c.stop(); 
     c.setFramePosition(i); 
     while(!c.isRunning()) c.start(); 
    } 

    public static void stop(String s) { 
     if(clips.get(s) == null) return; 
     if(clips.get(s).isRunning()) clips.get(s).stop(); 
    } 

    public static void resume(String s) { 
     if(mute) return; 
     if(clips.get(s).isRunning()) return; 
     clips.get(s).start(); 
    } 

    public static void loop(String s) { 
     loop(s, gap, gap, clips.get(s).getFrameLength() - 1); 
    } 

    public static void loop(String s, int frame) { 
     loop(s, frame, gap, clips.get(s).getFrameLength() - 1); 
    } 

    public static void loop(String s, int start, int end) { 
     loop(s, gap, start, end); 
    } 

    public static void loop(String s, int frame, int start, int end) { 
     stop(s); 
     if(mute) return; 
     clips.get(s).setLoopPoints(start, end); 
     clips.get(s).setFramePosition(frame); 
     clips.get(s).loop(Clip.LOOP_CONTINUOUSLY); 
    } 

    public static void setPosition(String s, int frame) { 
     clips.get(s).setFramePosition(frame); 
    } 

    public static int getFrames(String s) { return clips.get(s).getFrameLength(); } 
    public static int getPosition(String s) { return clips.get(s).getFramePosition(); } 

    public static void close(String s) { 
     stop(s); 
     clips.get(s).close(); 
    } 

}` 
+0

У меня нет прямого знания о том, как работает аудиоподсистема, но из трассировки стека кажется, что 'AudioSystem.getAudioInputStream (...)' хочет что-то, что поддерживает mark/reset, но конкретный класс, возвращаемый 'getResourceAsStream 'не поддерживает его. Вы используете это из файла jar, где звук также находится в файле jar? Это может быть недопустимо, так как член jar (zip), вероятно, читается только вперед и вряд ли будет поддерживать поиск. –

+0

Звуки в пакете Ресурсы как файлы .wav и .mp3. Это влияет на это? – user1766089

+0

Ключ состоит в том, упакован ли все это (код и звуки) в файл jar, и вы запускаете его с помощью java -jar filename.jar. Если это правда, вам может потребоваться скопировать звуковые файлы во временные файлы на диске. –

ответ

1

с Javadoc (мой hilighting):

public static AudioInputStream getAudioInputStream(InputStream stream) 
             throws UnsupportedAudioFileException, 
               IOException 

O создает поток входного аудиосигнала из предоставленного входного потока. Поток должен указывать на достоверные данные аудиофайла. Для реализации этого метода может потребоваться несколько парсеров для проверки потока, чтобы определить, поддерживают ли они его. Эти анализаторы должны иметь возможность отмечать поток, читать достаточно данных, чтобы определить, поддерживают ли они поток, и, если нет, сбросить указатель чтения потока в его исходное положение. Если входной поток не поддерживает эту операцию, этот метод может завершиться с ошибкой IOException.

Вы собираетесь запустить из баночки файла, который содержит как код и звуковые файлы. InputStream, возвращенный с getResourceAsStream(), не будет работать, поскольку он будет поддерживаться (или реализован) ZipInputStream, который обрабатывает mark() как нет-op и выдает IOException для reset().

Для решения проблемы вам необходимо только обернуть входной поток в BufferedInputStream.

AudioInputStream ais = 
    AudioSystem.getAudioInputStream(
     new BufferedInputStream(
      JukeBox.class.getResourceAsStream(s) 
     ) 
    }; 
+0

Спасибо за ваш ответ, но я новичок в java, не могли бы вы продемонстрировать это немного дальше? – user1766089

+0

Я нашел лучшее решение, см. Мой обновленный ответ. –

+0

Спасибо! Я попробую это как можно скорее! :) – user1766089

0

Спасибо всем за вашу помощь, но я понял, что только файлы .mp3 работать, а не что-либо еще, поскольку он не обрабатывает и кодировать их должным образом. Я знал, что это было что-то вроде этого, и у меня еще нет возможности заставить его использовать любые звуковые файлы, поэтому я просто оставлю это здесь для людей, у которых есть одна и та же проблема, и не думал о самом легком ответе который заставил меня долго размышлять. Спасибо!

Смежные вопросы