2016-05-28 5 views
1

Ich versuche hier OGG-Dateien unter Verwendung einer Antwort auf eine andere Frage zu spielen: Playing ogg files in eclipsejavax.sound.sampled.UnsupportedAudioFileException spielen OGG-Dateien mit javazoom

die javazoom library Verwendung, die ich erfolgreich für mein Projekt heruntergeladen und konfiguriert ist, ich versuche, die xav ‚s Antwort-Code zu verwenden:

import java.io.File; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.SourceDataLine; 
import javazoom.spi.PropertiesContainer; 

public class OGGPlayer { 
public final String fileName; 

public boolean mustStop = false; 


public OGGPlayer(String pFileName) { 
    fileName = pFileName; 
} 

public void play() throws Exception { 
    mustStop = false; 
    File file = new File(fileName); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file); 
    if (audioInputStream == null) { 
     throw new Exception("Unable to get audio input stream"); 
    } 
    AudioFormat baseFormat = audioInputStream.getFormat(); 
    AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
     baseFormat.getSampleRate(), 16, baseFormat.getChannels(), 
     baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); 
    AudioInputStream decodedAudioInputStream = AudioSystem.getAudioInputStream(decodedFormat, 
     audioInputStream); 
    if (!(decodedAudioInputStream instanceof PropertiesContainer)) { 
     throw new Exception("Wrong PropertiesContainer instance"); 
    } 

    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, decodedFormat); 
    SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); 
    sourceDataLine.open(decodedFormat); 

    byte[] tempBuffer = new byte[4096]; 

    // Start 
    sourceDataLine.start(); 
    int nbReadBytes = 0; 
    while (nbReadBytes != -1) { 
     if (mustStop) { 
      break; 
     } 
     nbReadBytes = decodedAudioInputStream.read(tempBuffer, 0, tempBuffer.length); 
     if (nbReadBytes != -1) 
      sourceDataLine.write(tempBuffer, 0, nbReadBytes); 
    } 

    // Stop 
    sourceDataLine.drain(); 
    sourceDataLine.stop(); 
    sourceDataLine.close(); 
    decodedAudioInputStream.close(); 
    audioInputStream.close(); 
} 

public void setMustStop(boolean pMustStop) { 
    mustStop = pMustStop; 
} 

public void stop() { 
    mustStop = true; 
} 

} 

der Code macht Sinn für mich, aber ich habe Probleme einfach es zu benutzen. Ich kann die Klasse anscheinend nicht dazu bringen, meine OGG-Datei zu lesen, und ich habe sie auf verschiedene Arten modifiziert, um diese Funktion auszuführen. Ich habe gelesen, WAV-Dateien im selben Projekt, um die Dateien zu lesen vollständig erfolgreich mit

AudioInputStream audioIn = AudioSystem.getAudioInputStream(Thread.currentThread().getContextClassLoader().getResource("res/audio/" + fileName + ".wav")); 

habe ich Variationen dieser versucht, die Datei-Klasse, als Ressourcen zu lesen, und ich kann meine OGG-Datei in die erfolgreich lokalisieren Projekt, aber es hält die Ausnahme

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input URL 

wirft Dies ist mein vierte oder fünfte Versuch, in immer Audio-nicht-WAV-Audio in diesem Projekt zu spielen. Ich habe versucht, MP3s mit MediaPlayer und ein paar andere Möglichkeiten zu spielen, und dies ist meine zweite Methode, um OGG-Dateien abzuspielen. Ich versuche, große, lange Musikstücke als Hintergrund zu spielen, und ich kann sie nicht ausführen, da ich meine anderen WAV-Soundeffekte aufgrund der Dateigröße mache.

Jede Hilfe beim Spielen dieser OGG-Dateien würde sehr geschätzt werden. Ich fühle mich mit diesem Versuch meinem Ziel so nah, es scheint einfach und solide, aber es weigert sich einfach, meine Dateien richtig zu lesen. Vielen Dank im Voraus für jegliche Hilfe.

+0

Der mp3spi-Code auf der JavaZoom-Site liest MP3. Sie benötigen den Vorbisspi von der JavaZoom-Site und den zugehörigen JOrbis-Code. –

+0

Danke. Ich bin sehr enttäuscht von mir selbst. Dies ist ein sehr klarer Fall von Arbeiten viel zu spät und sehr albern und schwachsinnig. Danke für Ihre Hilfe. –

Antwort

1

Hier ist eine Methode, die MP3-und Ogg-Dateien lesen wird - es wird Dateien mit dem Vorbis-Format aber nicht flac abspielen; so müssen Sie dort einen Scheck setzen - nicht alle Dateien mit Ogg-Endung werden unterstützt:

import javazoom.spi.vorbis.sampled.file.VorbisAudioFileReader; 
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader; 
import org.tritonus.share.sampled.file.TAudioFileReader; 
import org.tritonus.sampled.file.AuAudioFileReader; 

    AudioInputStream createOggMp3(File fileIn) throws IOException, Exception { 
    AudioInputStream audioInputStream=null; 
    AudioFormat targetFormat=null; 
    try { 
     AudioInputStream in=null; 
     if(fileIn.getName().endsWith(".ogg")) { 
     VorbisAudioFileReader vb=new VorbisAudioFileReader(); 
     in=vb.getAudioInputStream(fileIn); 
     } 
     else if(fileIn.getName().endsWith(".mp3")) { 
     MpegAudioFileReader mp=new MpegAudioFileReader(); 
     in=mp.getAudioInputStream(fileIn); 
     } 
     AudioFormat baseFormat=in.getFormat(); 
     targetFormat=new AudioFormat(
       AudioFormat.Encoding.PCM_SIGNED, 
       baseFormat.getSampleRate(), 
       16, 
       baseFormat.getChannels(), 
       baseFormat.getChannels() * 2, 
       baseFormat.getSampleRate(), 
       false); 
     audioInputStream=AudioSystem.getAudioInputStream(targetFormat, in); 
    } 
    catch(UnsupportedAudioFileException ue) { System.out.println("\nUnsupported Audio"); } 
    return audioInputStream; 
    } 

Sie gibt Ihnen einen Audio-Input-Stream, die Sie verwenden können, wie folgt:

if(fileIn.getName().endsWith(".ogg") || fileIn.getName().endsWith(".mp3")) { 
    audioInputStream=createOggMp3(fileIn); 
} 
else { // wav 
    audioInputStream=AudioSystem.getAudioInputStream(fileIn); 
    } 

Ihre decodiert Audioformat ist

decodedFormat=audioInputStream.getFormat(); 

und dann können Sie mit Ihrem SourceDataline fortfahren.