AudioInputStream

Status
Nicht offen für weitere Antworten.

Cola_Colin

Top Contributor
Ich möchte einen AudioInputStream einmal von der Festplatte laden und danach beliebig viele Male abspielen, auch parallel. Dazu brauch ich die Daten des Streams irgendwie als Variable, auf einen Stream parallel aus mehreren Threads zuzugreifen klingt eher schlecht ;)
Nur wie krieg ich eine Kopie, der Daten aus dem AudioInputStream ?

ich dachte an sowas:
Java:
package soundSys;

import java.io.IOException;

import javax.sound.sampled.*;

public class SoundData {
	private byte[] data;
	private int position = 0;

	public SoundData(int length, AudioInputStream in) {
		data = new byte[2304];  
		try {
			System.out.println("Bytes read:" + in.read(data));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		
	}

	public int read(byte[] b, int off, int len) {
		int result = 0;
		int tmpP = position + off;
		if (len + tmpP <= data.length) {
			result = len;
		} else {
			result = data.length - tmpP;
		}

		b = new byte[result];
		System.arraycopy(data, tmpP, b, 0, result);

		position += result;

		return result;
	}
	
	public void reset() {
		position = 0;
	}
}

Nur die Länge bestimmen klappt nicht, weil AudioInputStream.getFramelength() -1 zurückliefert...
Und wenn ich diese Klasse verwende, um AudioInputStream.read zu ersetzen, dann spielt keine Musik mehr :S
 

Marco13

Top Contributor
Hab' zwar mit dem AudioInputStream selbst noch nicht gearbeitet, aber mein Ansatz wäre jetzt ähnlich wie deiner, sowas wie
Java:
AudioInputStream input = ... 

// Komplett einlesen
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
while (true)
{
    int read = input.read(buffer);
    if (read == -1)
    {
        break;
    }
    baos.write(buffer,0,read);
}
baos.flush();

// Kopie: 
InputStream bais0 = new ByteArrayInputStream(baos.toByteArray());
AudioInputStream copy0 = new AudioInputStream(bais0, input.getFormat(), input.getFrameLength());

// Kopie: 
InputStream bais1 = new ByteArrayInputStream(baos.toByteArray());
AudioInputStream copy1 = new AudioInputStream(bais1, input.getFormat(), input.getFrameLength());

...

Aber ob's funktioniert, weiß ich halt nicht...
 

Cola_Colin

Top Contributor
Es spielt schonmal ab, ein zwei Sachen sind noch merkwürdig:
getFramelength gibt immer -1 zurück ?! Wie kann das logisch irgendwie richtig sein ?
Das größere Problem: wenn ich eine 3,5 mbyte mp3 dekomprimiere hat die so ca. 20 mbyte.
Solche Megablöcke führen schnell zu nem OutOfMemory, weil sich java scheinbar nicht die vollen 4 GByte Ram gönnt, sicher wäre es auch bescheutert, wieviel Ram ich damit verschlingen würde xD
Nunja ich werde dann wohl irgendwie die kompirmierten Daten zwischenspeichern, oder so in der Art.

Aber der ByteArrayOutputStream scheint mein Problem lösen zu können, danke.
 

Marco13

Top Contributor
Das -1 ist eben irgendein Sonderwert, der meistens für sowas steht wie "Ist nicht bekannt"/"Kann nicht berechnet werden".

Die OutOfMemory-Sache: Starte dein Java-Programm mit
java -Xmx1000m DasProgramm
(für 1000MB Speicher)
 

Cola_Colin

Top Contributor
Dann wird das aber nur bei mir mit genug Platz aufgerufen und bei anderen stürzt es ab ?
Naja sowieso will ich jetzt nicht nur wegen dem abspielen von ein paar Sounds gleich nen Gigabyte Ram brauchen ;)
 

Marco13

Top Contributor
Standardmäßig werden nur 64mb erlaubt, was auch recht wenig ist. Wenn du das als JAR oder so vertreibst, kannst du das glaub' ich mit in die JAR schreiben, so dass es dann bei jedem funktioniert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben