Problem beim Einlesen von Streams

badB

Grünschnabel
Hallo,

irgendwie bin ich mit meinem Problem ziemlich ratlos. Vielleicht weiß ja hier jemand Rat :).

Ich möchte gerne ein Wave abspielen. Dazu nutze ich die beiden folgenden Funktionen:
Code:
	public void read(URL url){
		try{
        AudioInputStream audioInputStream =    AudioSystem.getAudioInputStream(url.openStream());
        AudioFormat af     = audioInputStream.getFormat();
        int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
        byte[] audio       = new byte[size];
        DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
        audioInputStream.read(audio, 0, size);
        clipStore.put(url.getFile(), new AudioData(af, audio, size, info));        
		} catch (Exception e){
			
		}
	}

	public void read(File file){
	try{
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
        AudioFormat af     = audioInputStream.getFormat();
        int size      = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
        byte[] audio       = new byte[size];
        DataLine.Info info      = new DataLine.Info(Clip.class, af, size);
        audioInputStream.read(audio, 0, size);       
        clipStore.put(file.getName(), new AudioData(af, audio, size, info));
		} catch (Exception e){
			
		}
	}

	public class AudioData{

		public AudioFormat af;
		public byte[] audio;
		public int size;
		public DataLine.Info info;
		
		public AudioData(AudioFormat af, byte[] audio, int size, DataLine.Info info){
			this.af = af;
			this.audio = audio;
			this.size = size;
			this.info = info;
		}
	}

Das eigentliche Abspielen wird dann von einer extra Funktion realisiert. Das funktioniert auch, insofern ich das mit lokalen Dateien mache (also mit der zweiten Funktion). Jedoch das Einlesen per URL will einfach nicht funktionieren, wobei die url richtig ist. Ich bekomme zwar was zurück, allerdings entspricht dies nicht dem korrekten Inhalt. Bin echt ratlos :( Danke
 
hi,

liest du die ganze datei auf einmal ein?

im normal fall würde man einen stream etwa so einlesen

Code:
InputStream in = url.openStream();
int readedBytes=0;
byte[] b = new byte[ 128]
while( 0!=( readedBytes=in.read( b)))
{
 ... do irgendwas ...
}
 
Hi! Ja, tue ich. Spricht denn irgendwas dagegen? Ich möchte die vollständigen Daten nachher in einem byte[] vorliegen haben. Macht es einen Unterschied ob ich die teilweise oder komplett einlese?
 
In jedem Fall solltest du mal in dem catch-Block ein e.printStackTrace() einfügen. Kann durchaus sein dass du da eine Exception bekommst die du nicht ausgibst.

Weiterhin solltest du nicht in zwei Methoden quasi das selbe tun. Das kann man auch schöner umsetzen und ist dann weniger Fehleranfällig als so.

Nutze beim nächsten Mal bitte die zur Verfügung stehenden Code tags damit der Code formatiert dargestellt wird und so besser lesbar ist.

Zu deiner anderen Frage: Es kann sein dass es einen Unterschied macht ob du alles sofort einliest oder Stück für Stück, denn wenn du die Datei von einem Server holst wird der diese je nach größe nicht komplett in den Stream schreiben. Mit available() lässt sich zum Beispiel abfragen wieviel bytes gerade zur Verfügung stehen.
 
Zurück