Audioaufnahme

Status
Nicht offen für weitere Antworten.

Elrohir

Mitglied
Guten abend....
Ich bin derzeit damit beschäftigt, ein programm zu schreiben, was audio-signale abfangen und in eine datei speichern soll.... allerdings soll dieses programm sämtliche Töne, die durch die lautsprecher herauskommen abfangen...
gäbe es eine möglichkeit, dies zu realisieren? Habe mich schon durch diverse threads und andere dokumentationen gewühlt, konnte allerdings bissher noch nichts brauchbares herausfinden....
Insbesondere da ich bei den TargetDataLines immer nur ne IA-Exception bekomme...
 
S

Spacerat

Gast
Hab' die Erfahrung gemacht, das hier kaum einer auf Threads eingeht, die sich mit dem Sound-API befassen. Ich kämpf mich deshalb selber durch. Etwas Code wär' nicht schlecht. vllt. kann ich dann ja aushelfen. Das Sound-API ist aber auch wirklich alles andere als gut durch Dokumentiert.
 

Elrohir

Mitglied
Hab' die Erfahrung gemacht, das hier kaum einer auf Threads eingeht, die sich mit dem Sound-API befassen. Ich kämpf mich deshalb selber durch. Etwas Code wär' nicht schlecht. vllt. kann ich dann ja aushelfen. Das Sound-API ist aber auch wirklich alles andere als gut durch Dokumentiert.

Erstmal danke für die antwort.... aber code ist wohl leidernicht möglich, da der ansatz mit dem targetdataline, wie ich schon feststellte auch rein theoretisch gar nicht funktionieren könnte, und mir somit jeglicher ansatz fhelt, und ohne ansatz kein code....
 

Elrohir

Mitglied
So, habe es jetzt zumindest geschafft, die daten vom mikrofon auszulesen, doch immer wenn ich das mikrofon rausziehe sagter mir, dass keine line vorhanden, bzw. erreichbar wäre -> das vorig geschilderte illegal argument exception...

Code:
File outputFile = new File(filename);
		

		AudioFormat af = new AudioFormat((float)11025.0,16,2,true,false);
		DataLine.Info info = new DataLine.Info (TargetDataLine.class,af);

		
		try {
			ByteArrayOutputStream baOut = new ByteArrayOutputStream();
			TargetDataLine tl= (TargetDataLine) AudioSystem.getLine(info);
			tl.open(af);
			tl.start();
			int numBytesRead;
			byte[] ba;
			int durchlauf = 0;
			while(!isInterrupted() && durchlauf<1000){
				durchlauf++;
				numBytesRead = 0;
				ba = new byte[256];
				numBytesRead = tl.read(ba,0,ba.length);
				baOut.write(ba, 0, numBytesRead);
			}
			byte[] caB = baOut.toByteArray();
			ByteArrayInputStream baIn = new ByteArrayInputStream(caB);
			AudioInputStream stream = new AudioInputStream(baIn, af,caB.length / af.getFrameSize());
			AudioSystem.write(stream,
					AudioFileFormat.Type.WAVE,outputFile);
		} catch (LineUnavailableException e) {
			e.printStackTrace();} catch (IOException e) {
			e.printStackTrace();
		}

Nur wie kann man diesen input jetzt auf den system-output umlenken? :eek:
 
S

Spacerat

Gast
Die IllegalArgumentException kann ich nicht nachvollziehen. Fehler tritt bei mir nicht auf.
Ansonsten hab' ich deinen Code mal ein wenig abgeändert.
[highlight= java]File outputFile = new File(filename);


AudioFormat af = new AudioFormat(11025.0F,16,2,true,false); // Float-Konstanten mit Suffix (F) deklarieren
DataLine.Info info = new DataLine.Info (TargetDataLine.class,af);
DataLine.Info sinfo = new DataLine.Info (SourceDataLine.class,af);


try {
ByteArrayOutputStream baOut = new ByteArrayOutputStream();
TargetDataLine tl= (TargetDataLine) AudioSystem.getLine(info);
tl.open(af);
tl.start();
SourceDataLine sl= (SourceDataLine) AudioSystem.getLine(sinfo); // Neu: Line für Tonausgabe
sl.open(af); // öffnen
sl.start(); // starten
int numBytesRead;
int durchlauf = 0;
byte[] ba = new byte[256]; // definieren und gleich einmal initialisieren.
while(!isInterrupted() && durchlauf<1000){
durchlauf++;
numBytesRead = tl.read(ba,0,ba.length);
baOut.write(ba, 0, numBytesRead);
sl.write(ba, 0, numBytesRead); // in Tonausgabe schreiben
}
baOut.close(); // close() ist wichtig, könnten noch Daten gepuffert sein
tl.stop(); // eingabe stoppen
sl.stop(); // ausgabe stoppen
tl.close(); // eingabe schliessen
sl.close(); // ausgabe schliessen
ba = baOut.toByteArray(); // ba liegt brach ruhig wieder verwenden
ByteArrayInputStream baIn = new ByteArrayInputStream(ba);
AudioInputStream stream = new AudioInputStream(baIn, af,ba.length / af.getFrameSize());
AudioSystem.write(stream,
AudioFileFormat.Type.WAVE,outputFile);
} catch (LineUnavailableException e) {
e.printStackTrace();} catch (IOException e) {
e.printStackTrace();
}[/highlight]
 
Zuletzt bearbeitet von einem Moderator:

Elrohir

Mitglied
danke erstmal, aber das problem besteht immer noch...
wenn ich kein Mikrofon angeschlossen habe, wirft er mir sofort das illegal argument exception...
und wenn ich es anschliesse liester halt den input vom mikro, und gibt denn dann in die datei und in dne soundoutput oO
aber er soll ja gerade nicht vom mikrofon lesen, sondern nur alles abfangen, was schon auffem weg zum output ist o.o
 
S

Spacerat

Gast
Also was schon in der Ausgabe-Line ist, kann von dort nicht wieder zurück geholt werden. Wenn die Daten bereits über das Betriebssystem dort hin gelangen, hat man da, soweit ich weiss, von Java aus auch keinen Einfluss mehr drauf. Abfangen fällt dann wohl aus. Ich hab' mich allerdings noch nicht mit den Ports in Java beschäftigt. Vllt. gibts da 'ne Möglichkeit.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben