java sound aufnehmen
lima-city → Forum → Programmiersprachen → Java
anhaltspunkt
bekommen
betriebssystem
byte
code
dank
durchlauf
file
hardware
info
input
lesen
output
port
problem
signal
system
verbindung
vorwurf
zugriff
-
Guten abend,
mich beschäftigt derzeit ein kleines Problem, was das aufnehmen eines sound-signals per java betrifft...
undzwar kennen sicher die meisten von euch die methode, eine targetdataline zu erzeugen, auszulesen, und zu speichern....
Das "problem" dabei ist jedoch, dass das nur das Signal von dem angeschlossenen Mikrofon ist....
Mein Ziel jedoch ist es, sämtliche audiosignale, die ausgegeben werden, also über die lautsprecher kommen, mitzuschneiden...
Somit müsste ich die sourcedataline, die man bekommen hat, in eine targetdataline verwandeln, bzw. von der sourcedataline lesen...
was zumindest mir jedoch bissher leider nicht gelang... und mir inzwischen jeglicher anhaltspunkt fehlt, wie man das problem angehen kann...
Ich hoffe, da hat jemand ahnung von, danke :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ehrlich gesagt finde ich mich auf der sun seite absolut nicht zurecht und meide die für gewöhnlich *rotwerd*
Aber gut, dann werde ich das mal in angriff nehmen, danke für den tipp! :)
auch wenn es fürchterlich nett wäre, hättest du nen direkt-link zu dem tut oder so, auf jedenfall irgetnwas, von wo aus ich allein dahinfinde oO -
Moin,
Ich weiß gar nicht was Du willst ...
Was meinst Du, wozu es diesen Thread gibt:
http://www.lima-city.de/thread/links-zu-java
Sicherlich nicht, um überlesen zu werden
Gruß,
Pawnee -
uhm, ok, ich muss zugeben, ich hatte unter diesem thread lediglich eine sammlung von grundlagentutorials zu awt, swing und sonstigem erwartet + eclipse etc etc, jedoch nicht zu einem allgemein sun index^^
um genau zu sein wusste ich bis jetzt nicht einmal, dass ein so schön übersichtlicher index existiert^^
Kann mich in zusammenhang mit sun nur an eine seite erinnern, bei der man absolut NICHTS findet, und somit hätte mir ein link dahin auch nicht weitergeholfen^^
lG
shadow :)
EDIT: nja, ok, so schön sich das jetzt alles anhörte/las..
Da steht zwar wie ich an den Port von dem speaker komme... aber die port-klasse bietet keine möglichkeit zum auslesen oder so an, und ich habe immer noch keine möglichkeit gefunden, darüber nen inputstream zu bekommen oder ne targetdataline :-@
Beitrag zuletzt geändert: 8.4.2009 23:44:17 von schattenmagier -
Okay ... sinnlos ...
Da Du des Lesens nicht fähig zu sein scheinst, bemühe ich mich nicht weiter drum.
Es ist alles gegeben, was Du brauchst, ein wenig Eigeninitiative ist schon gefragt.
Wenn Du das Sound-Kapitel komplett durchgelesen hast - und nicht nur auf die Beispiele geblickt - dann sollte Dir klar sein, was wie funktioniert.
In diesem Sinne: Frohes Gelingen!
Pawnee -
o....keee, tut mir ja schrecklich leid, wenn ich deinen geistigen ansprüchen anscheinend nicht genüge, aber ich habe das in der tat weiter gelesen, als was du mir vorwirfst, und ja, ich habe selber auch immer das gefühl,der lösung nur nen schritt entfernt zu sein, und diesen einfach nicht zu sehen...
Aber das problem ist, selbst wenn ich mir den port hole, dann dessen info wiederum benutze um mir ne targetDataLine zu holen, dann kommt wiederum nur der fehler, es sei nicht möglich von den gegebenen informationen ne targetdataline zu extrahieren...
Was ja nunmal daran liegt, dass die targetdataline nunmal für input da ist aus nem input-port, wie diese schöne grafik im overview ja wunderbar darstellte....
Doch selbst wennich es andersrum angehe und mir den outputstream, also die sourcedataline hole, so habe ich dann wiederum das problem, dass es keine möglichkeit gibt, von dieser eingaben auszulesen.... was ja auch irgentwo unsinnig wäre...
An eine möglichkeit, den Port einfach umzulenken in ne datei habe ich auch bereits gedacht, doch auch da sehe ich bissher nunmla keine möglichkeit.... und auch bei den controls habe ich bissher nunmal keinen anhaltspunkt gefunden, der mir irgentwie weiterhilft...
Und ich verstehe wirklich nicht, wo ich dieses brett vorm kopf habe, wo nunmal immer so ganz klar auch da geschrieben wird, dass speaker nur für output mikro für input etc sind...
Und was deinen "nicht genau lesen" vorwurf angeht... ich beschäftige mich mit dem scheiss immerhin schon über ne woche und hab mich nunmal an das lima-city forum gewandt, weil meine birne inzwischen absolut nichts mehr findet, und kann wohl sein, dassich eben wegen der großen grübelei irgentwas eig. triviales übersehe, aber der vorwurf, ich würd mich ja gar nit mit beschäftigen, finde ich einfach nur lächerlich....
Beitrag zuletzt geändert: 9.4.2009 0:43:52 von schattenmagier -
Moin,
Erstmal vorneweg habe ich nie etwas davon geschrieben, dass Du Dich nicht damit beschäftigst, sondern des Lesens unfähig zu sein scheinst.
Was sich hiermit bestätigt, da Du dies ja aus meinem letzten Beitrag herausgelesen haben musst.
Aber kommen wir von meiner persönlichen Einstellung mal auf die Fakten zu sprechen:
a)
Wie wäre es damit, etwas Code vorzuzeigen?
Denn dann kann man sicherlich auch einfacher erblicken, woran das Ganze scheitert.
b)
Ohne das ich Code gesehen habe:
Funktioniert das Ganze auch dann nicht, wenn die Soundkarte ungenutzt bleibt?
Man könnte ja davon ausgehen, dass geblockt wird, sobald diese in Betrieb ist.
Gruß,
Pawnee
PS: Und ja, ich teile gern aus.
Beitrag zuletzt geändert: 9.4.2009 2:26:35 von pawnee -
Nabend,
ok, aus dem ich sei des lesens unfähig schloss ich nunmal, du meinest damit, ich würd mich damit nich beschäftigen, und wär deshalb zu blöd, das zu kapieren...
Aber gut, hier mal die unterschiedlichen ansätze(habe einen "hauptcode" geschrieben, und dann halt immer kleinigkeiten versucht zu ändern:
Hauptansatz:
File outputFile = new File(filename); AudioFormat af = new AudioFormat(11025.0F,16,2,true,false); DataLine.Info info = new DataLine.Info (TargetDataLine.class,af); try { TargetDataLine tl = (TargetDataLine(AudioSystem.getLine(info)); ByteArrayOutputStream baOut = new ByteArrayOutputStream(); tl.open(af); tl.start(); 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); } baOut.close(); tl.stop(); sl.stop(); tl.close(); sl.close(); 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(); }
der zweite versuch änderte dann den aufruf der targetdataline:
Mixer mix = AudioSystem.getMixer(AudioSystem.getMixerInfo()[0]); TargetDataLine tl= (TargetDataLine) AudioSystem.getLine(mix.getTargetLineInfo(Port.Info.SPEAKER)[0]);
dann habe ich noch einmal hierüber den port geholt, und dann wieder über den port die Line-Info geholt, in der hoffnung, dann könnte ich darüber wiederum die targetdataline holen
try { Port p = (Port) AudioSystem.getLine(Port.Info.SPEAKER); p.open(); TargetDataLine tl = (TargetDataLine)AudioSystem.getLine(p.getLineInfo()); } catch (LineUnavailableException e) { e.printStackTrace(); }
Aber auch dies schlug natürlich fehl...
@B: nein, auch wenn ich keinen sound irgentwie abspiele, funktioniert es nicht.... wäre aber doch auch komisch, wo ja auch normalerweise mehrere programme soudn drauf ausgeben können, oder? ;) -
Moin,
das mit dem Mixer war schonmal gar nicht so schlecht.
Schau Dir mal das an:
http://pastebin.com/m29740267
Einfach starten, die Mixer-Liste anzeigen lassen, und zuletzt die markierte Zeile anpassen.
Normal ist es immer der Stereomixer, den Du ansprichst, nicht der Lautsprecher - wie in Deinem Beispiel.
Hoffe, dass Dir das hilft.
Gruß,
Pawnee -
Nabend und frohe Ostern :)^^
njaa, leider entspricht dieses Beispiel genau dem, was ich auch selber schon längst hatte... nämlich einer mikrofon aufnahme...
Bei der mixerliste kam das raus:
Available mixers: Primärer Soundtreiber Lautsprecher (Realtek High Definition Audio) Java Sound Audio Engine Port Lautsprecher (Realtek High Defi
Nur egal welchen davon ich auswählte, es war nie eine TargetDataLine verfügbar... weil über diese methode eben anshcienend auch in der tat nur das mikro angesprochen werden kann...
lG -
Moin,
dann scheint es in der Tat so zu sein, dass Du keinen Stereomixer hast.
Was ich natürlich recht komisch finde.
Da fällt mir eigentlich nur der Spruch ein:
"Kauf Dir mal nen Mixer"
Wenn Du wie Du selber sagst bereits alle Mixer angesprochen hast und keiner funktioniert,
dann liegt es wohl eindeutig an Deine Hardware, da kannst nicht viel machen.
In sofern frohe Ostern,
Pawnee -
pawnee schrieb:
Moin,
dann scheint es in der Tat so zu sein, dass Du keinen Stereomixer hast.
Was ich natürlich recht komisch finde.
Da fällt mir eigentlich nur der Spruch ein:
"Kauf Dir mal nen Mixer"
Wenn Du wie Du selber sagst bereits alle Mixer angesprochen hast und keiner funktioniert,
dann liegt es wohl eindeutig an Deine Hardware, da kannst nicht viel machen.
In sofern frohe Ostern,
Pawnee
Nabend
hm, ok, dass erklärt natürlich, warum sämtliche versuche meinerseits gescheitert sind...
Aber vielen dank an die aufklärung mit dem Stereo mixer^^ sonst hättich hier wohl noch ewig drangesessen udn mich gewundert, warum es nicht funktioniert^^
well, frohe Ostern! :) -
ich kann dazu *obwohl das problem gelöst zusein scheint* nur das alt bewährte TeamSpeak-Tut geben :
da es dir bereits vom MIC was zu recorden nehme ich mal SEHR STARK an das in deiner SOUND-eintellung *jetzt mal von Win32 gesprochen .. wie das unter UNiX hinhaut hab ich keinen blassen .. aber denke ma mit KMixer genau so oder so ähnlich* bei AUFNAHME die einstellung MiC gewählt ist ... was ja auch sehr gut so ist ... nur wenn du jetzt halt ALLES recorden willst ganz einfach :
sound-steuerung > aufnahme-steuerung > und dort einfach den haken bei STEROMiX rein setzen ... fertig ...
wie gesagt ... is jetzt ma eben chillich für WinXP gegriffen und haut nur wenn du halt über den Win-iNPUT gehst ... wenn du dierekt das mic anzapfst *was in java selbst mit JNi nicht möglich sein dürfte da selbst JNi keinen dierekten zugriff auf die hardware ermöglicht / erlaubt* musst du natürlich den entsprechenden port wählen ...
so viel von mir aus dazu ...
SPiKEe -
Kann ich unter vista leider nicht auffinden...
ausserdem soll das programm ja ohne externe, manuelle veränderungen lauffähig sein ;) -
ok .. thread ist alt und hab ich selbst net mehr gesehn .. aber mal so gesagt :
wie ich bereits gesagt hab ist es selbst mit JNi unmöglich DiREKT auf die hardware zukommen *da ja jni selbst auch nur eine verbindung zum betriebssystem aufbaut und dieses dazu veranlasst das gewollte zu erledigen* ...
ich kenne mich selber nicht mit der sound-api von java aus .. und auch vom jni hab ich nur wenig ahnung .. soweit ich aber weis kann die java-sound-api in verbindung mit dem jni nur auf den vom betriebssystem gewählt iNPUT-port zugreifen ... ansonsten würde man das system überlasten wenn man zum bleistift in win STEROMiX wählt und mit mehereren instanzen dieser app auf verschieden audio-ports zugreift und damit windows zu ballert ... *denk ich ma das das zu nem bluescreen führen dürfte da auch iwann die software der soundhardware mit aufspaltung , mischung und reassemblierung überfordert ist ...*
sollte es mit jni dennoch meines wissens entgegen möglich sein für die sound-api ein dierekten hardware zugriff für einzelene in- und outputs zuerlangen einfach mal posten ... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage