Sounddateien verketten

centrax

Mitglied
Hallo Forum,

ich habe ein Problem.
Ich habe einen Pool aus Sounddateien (.wav).
Davon möchte ich beliebig viele zusammensetzen zu einer großen "Sequenz" (einige auch mehrfach!).

Ich habe einige Literatur konsultiert, aber ua. im Javabuch und in der Javainsel nichts hierzu gefunden.

Ich habe also mehrere Files bzw. AudioInputStreams:

Java:
AudioInputStream[] meineSounds;

Jetzt möchte ich ein abspielbares Objekt erstellen, also einen Clip bzw. eine SourceDataLine, das eine beliebige Anzahl von AudioInputStreams miteinander verkettet.

Sprich möchte ich eine Methode haben:

Java:
public Clip verkette(AudioInputStream[] streams) {
    //?
}

Oder (wahrscheinlich besser) mit einer SourceDataLine anstatt Clip.



Ginge auch das direkte verketten zweier Clips?

Java:
public Clip verkette(Clip c1, Clip c2) {
    //?
}
Oder parallel dasselbe mit SourceDataLine's.

Freue mich über jede Hilfe.

Liebe Grüße,
centrax
 

s4ke

Bekanntes Mitglied
Einfach einen Listener auf den Clip registrieren und dann per Update abfragen, welches LineEvent geschmissen wird.

LineListener (Java 2 Platform SE v1.4.2)

Herausfinden, welches geworfen wird, kannst du hiermit (inkl hinzufügen des Listeners):

[Java]
clip.addLineListener(new LineListener()
{
public void update(LineEvent e)
{
if(e.getType()==LineEvent.Type.STOP)
{
//A type of event that is sent when a line ceases active input or output of audio data in response to a stop request, or because the end of media has been reached. (-> Java API Doku)
}
}
});[/Java]

LineEvent.Type (Java 2 Platform SE v1.4.2)

Bei den SourceDataLines habe ich das bei meinem Player so gemacht, dass ich das Abspielen in einen Extra-Thread gepackt habe und dann sobald das Ende der run-Methode erreicht wurde, einfach die next() (kA, wie die jetzt genau heißt :p) Methode der Playerverwaltung aufgerufen, die dann einen neuen Thread erstellt. Ich weiß nicht, ob das jetzt ein bischen dirty ist, aber es funktioniert. Sollte es dirty sein, bitte ich die Java-Profis hier um Verzeihung und sie möchten mir das bitte richtigstellen ;).
 
Zuletzt bearbeitet:

centrax

Mitglied
Das klingt ganz gut, ABER:

Meine SOunddateien sind Fetzen von 100 bis 1000 Millisekunden. Und davon verkette ich immer mehrere - ca. 10 bis 20.
Die müssen also ohne (irgendwie merkbare) zeitliche Verzögerung abgespielt werden.
Ist das so gegeben?

Oder wäre es sinnvoll, eine temporäre WAV Datei zu schreiben, in der die Information der beiden einzelnen Sounddateien zusammen drin ist?

Also sowas:
Java:
public void zusammenfuehren(File[] soundfiles) {
OutputStream os; //Korrekter OutputStream für die WAV-Daten auf ein externes, neues, noch leeres File
//Das müsste dann ein ByteArrayOutputStream sein, oder? Leider habe ich keine Ahnung, wie ich ihn korrekt für ein bestimmtes
//File mit bestimmtem Filenamen instanziieren kann...


[...] //In diesem Teil würde ich einfach ein File nach dem anderen auslesen und dessen Inhalt in das neue File kopieren
//So erhält das neue File nacheinander einfach alle Informationen aus dem Parameter-Filearray.
}

Probiere jetzt auch mal deine Methode mit dem Listener aus, würde mich aber auch freuen, wenn mir jemand sagen könnte, ob:

a) Dieses Prinzip funktionieren würde und
b) Wie ich den richtigen Input/OutputStream bekomme.


Liebe Grüße
 

s4ke

Bekanntes Mitglied
Achso. Du meinst, die Sounds allezusammen in eine Dateischreiben? Das sollte schon gehen, dafür müsstest du dann den AudioInputStream aber in einen OutputStream werfen.

Habe jetzt nicht so viel Zeit, aber das hier sollte vll weiterhelfen.

Encoding an audio file
/home/matthias/java/jsresources/examples/src/SimpleAudioRecorder.java

EDIT: Aber dass du das machen willst, war nicht von vornherein klar. Das nächste mal bitte etwas deutlicher :toll:

Ich werde nachher vll auch bessere Links zum Thema raussuchen!
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben