2016-07-12 17 views
1

Ich weiß, das wurde oft gefragt, aber es ist in einigen Szenarien anders, so dass ich es nicht herausfinden kann. Wenn ich mein Spiel in Eclipse starte, läuft alles reibungslos und das Spiel läuft einwandfrei, aber nachdem ich es exportiert habe, bricht es zusammen. Ich kann das Spiel öffnen und im Menü herumlaufen, aber keine Sounds spielen und nachdem ich Play gedrückt habe, friert das Spiel einfach ein und es gibt mir diesen Fehler mit cmd (Ich kann jede Klasse einfügen, aber hoffentlich nur die Audio-Klasse ist notwendig) :java.io.IOException: mark/reset nicht unterstützt

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) 

Und hier die Audio-Klasse ist: `

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

Ich habe keine direkte Kenntnis davon, wie das Audio-Subsystem funktioniert, aber von der Stack-Trace würde es scheinen, dass 'AudioSystem.getAudioInputStream (...)' etwas will, das mark/reset unterstützt, aber die konkrete Klasse von 'getResourceAsStream 'unterstützt es nicht. Führen Sie das aus einer JAR-Datei aus, in der sich der Sound auch in der JAR-Datei befindet? Das ist möglicherweise nicht erlaubt, da ein jar (zip) -Mitglied wahrscheinlich nur vorwärts gelesen wird und höchst unwahrscheinlich ist, Suchvorgänge zu unterstützen. –

+0

Die Sounds befinden sich im Ressourcenpaket als .wav- und .mp3-Dateien. Beeinflusst das das? – user1766089

+0

Der Schlüssel ist, ob das Ganze (Code und Sounds) in eine JAR-Datei gepackt wird und Sie es mit 'java -jar filename.jar' ausführen. Wenn das stimmt, müssen Sie möglicherweise die Audiodateien in temporäre Dateien auf der Festplatte kopieren. –

Antwort

1

Vom Javadoc (mein hilighting):

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

O Enthält einen Audio-Eingangsstrom aus dem bereitgestellten Eingangsstrom. Der Stream muss auf gültige Audiodateidaten zeigen. Die Implementierung dieser Methode erfordert möglicherweise mehrere Parser, um den Stream zu untersuchen, um festzustellen, ob sie ihn unterstützen. Diese Parser müssen in der Lage sein, den Stream zu markieren, genügend Daten zu lesen, um festzustellen, ob sie den Stream unterstützen, und, falls nicht, den Lesezeiger des Streams an seine ursprüngliche Position zurückzusetzen. Wenn der Eingabestream diese Operation nicht unterstützt, kann diese Methode mit einer IOException fehlschlagen.

Sie scheinen aus einer JAR-Datei ausgeführt werden, die sowohl den Code und die Sound-Dateien enthält. Das InputStream, das von getResourceAsStream() zurückgegeben wird, wird nicht funktionieren, da es von einem ZipInputStream, der mark() als ein No-op behandelt und IOException für reset() löst, gesichert (oder implementiert) wird.

Um das Problem zu lösen, müssen Sie nur den Eingangsstrom in eine BufferedInputStream umbrechen.

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

Vielen Dank für Ihre Antwort, aber ich bin ein Anfänger bei Java, können Sie bitte dies ein bisschen weiter demonstrieren? – user1766089

+0

Ich habe eine bessere Lösung gefunden, siehe meine aktualisierte Antwort. –

+0

Vielen Dank! Ich werde das so schnell wie möglich versuchen! :) – user1766089

0

Vielen Dank an alle für Ihre Hilfe, aber ich habe herausgefunden, dass nur MP3-Dateien arbeiten und nichts anderes, da es nicht und sie richtig nicht verarbeitet kodieren. Ich wusste, dass es so einfach war und ich habe noch nicht die Fähigkeit, irgendwelche Sounddateien aufzunehmen, also lasse ich das hier für Leute, die das gleiche Problem haben und nicht an die einfachste Antwort gedacht haben Das hat lange gedauert, um es herauszufinden. Vielen Dank!