# 3 JMF Fragen



## Daniel Jackson (12. Mrz 2010)

hi

ich bin beauftragt worden ein steuerungsprogramm für ein präsentationssystems zu entwickeln
da das ganze in einer sprache geschrieben werden soll, die halbwegs plattformunabhängig sein soll, bin ich auf java gekommen und hab da auch das JMF gefunden. erste tests sind vielversprechend.
bei internetrecherchen habe ich http://www.medien.ifi.lmu.de/lehre/ss03/mt/VortragJMF.pdf gefunden was mir einen ersten einblick gegeben hat. 

das geplante system hat 2-3 kameras und 2 mikrofone

jetzt hab ichn paar allgemeine fragen, ob das überhaupt möglich ist und wenn ja, wie (grundlegendes):

1.) Angenommen ich habe 2 (merged Data source) datenströme (cam1+mic1 sowie cam2+mic2). ist es möglich wenn ich jetzt strom 1 aufzeichne, dass ich die aufzeichnung auf strom 2 umschalten kann (und wieder zurück)? also quasi zwischen den cams "zappen" und das dann aufzeichnen

2.) Angenommen ich habe 2 (merged Data source) datenströme (cam1+mic1 sowie cam2+mic2). Kann ich die beiden ströme dann zusammen-mergen, sodass ich links das bild von cam1 habe und rechts das von cam2 (und audiospuren zusammenmischen)?

3.) Bild-in-Bild-Funktion. Kann ich während der aufzeichnung (wenn cam3 eingeschaltet wird) irgendwie dessen bild zur laufenden aufnahme hinzuschalten (z.b. rechts oben in der ecke)?

edit:
gibt noch ne 4.) Wie clone ich eine DataSource, damit ich sie gleichzeitig abspielen und aufzeichnen kann? das hat bisher noch nicht funktioniert...

Vielen Dank schonmal im Vorraus


----------



## Marco13 (12. Mrz 2010)

Leider nicht so "spezifisch" wie du es dir wünschen würdest: Das JMF ist sehr allgemein und sehr mächtig, d.h. man kann davon ausgehen, dass das geht. Allerdings hatte ich bei meinen bisherigen Experimenten das Gefühl, dass die Einarbeitung ins JMF schon sehr aufwändig sein kann. Für das (wenige) was ich bisher gemacht hatte, fand ich es am einfachsten, ein Beispiel von JMF 2.1.1 Solutions zu nehmen, und das so weit anzupassen, dass es das gewünschte macht. Wenn man vieeel Zeit hat, kann man aber auch die Spezifikation und sämtliche Tutorials lesen, so dass man auswendig weiß, welches Format die PullBufferStreams der PullBufferDataSource haben müssen, die man von seinem ProcessorModel zurückgibt :rtfm:  Ein Einstiegspunkt KÖNNTE sowas sein wie Merging Tracks from Multiple Inputs . Wenn man das nachvollziehen kann, kann man vielleicht auch das angesprochene "Umschalten" zwischen den verschiedenen Quellen hinkriegen. Allerdings habe ich bisher keine Möglichkeit gefunden, an den Quellcode des JMF ranzukommen: Was so eine magische Zeile wie [c]Manager.createMergingDataSource(dataOutputs)[/c] nun intern genau macht, wäre für dein Vorhaben sicher interessant....


----------



## Daniel Jackson (17. Mrz 2010)

danke

und wie sieht das mit bluetooth aus? wenn ich ein mikrofon über bluetooth betreibe, ist das JMF dazu in der lage das ding zu erkennen? ich kanns hier leider nicht testen, da ich selbst keine bluetooth geräte habe


und dann nochmal was generelles: gibts brauchbare alternativen zu JMF (falls sich das alles nicht realisieren lässt)? auch andere sprachen wären denkbar
eine alternative müsste folgende punkte erfüllen:
- unterstützung von bluetooth
- die realisierung der o.g. fragen (wenn auch nicht mit nem einzeiler, aber theoretisch möglich)
- möglichst plattformunabhängig
- stabil
- verarbeitung mehrerer ströme parallel (input: 4, output 1-2)


----------



## Marco13 (17. Mrz 2010)

Wie gesagt sind meine "Kenntnisse" (und Erfahrungen) mit JMF eher begrenzt  Und wenn du nach "Alternativen" fragst, meinst du wahrscheinlich auch nicht Home - FMJ  Die Anforderung der Plattformunabhängigkeit schränkt die Möglichkeiten ja auch schon ziemlich ein... 
Zu Bluetooth kann ich nur sagen, dass es natürlich grundsätzlich möglich ist, Bluetooth-Geräte mit Java anzuzapfen, und es demnach auch möglich ist, diese als Datenquellen zu verwenden. Eine kurze Suche liefert z.B. Java Media Framework - create Datasource from bytearray for JMF player wo auch nochmal darauf hingewiesen wird, dass man bei JMF entweder "vieles" selbst schreiben muss und dazu auf den Beispielen aufbauen kann - und eines dieser Beispiele, das anscheinend für Bluetooth "umgebaut" werden könnte, ist auch dort verlinkt. Die Grundmessage ist eben: Wenn man irgendwelche Daten hat, muss man die "nur" geeignet in DataSources einwickeln, mit PullBufferStreams anbieten und durch Processors jagen, dann kann man sie auch mit JMF nutzen. Aber das kann eben einiges an Arbeit bedeuten - besonders bei so speziellen und diffizilen Anwendungsfällen, wie du sie beschrieben hast, und die eben viel mehr sind als 'mal kurz ein Video abspielen oder generieren'.  
Eigentlich liegt es nahe, eine Bibliothek auf dem JMF aufzusetzen, die einem das ganze etwas einfacher macht, aber ob/was es in der Richtung schon gibt, müsste ich auch erst erwebsuchen :rtfm:


----------



## Sunny J (2. Apr 2010)

Hey,

ich kann in Sachen JMF immer wieder nur das Buch ... Medienverarbeitung in Java ... Audio und Video mit Java Media Framework & Mobile Media API ... von Horst Eidenberger empfehlen. Ich empfehle die eBook- Variante aus meinem Link unten, ist billiger und man kann den Quelltext aus dem Bucher besser ins eclipse oder netbeans kopieren.

Hat mir schon in so mancher Situation weitergeholfen. Und ein bisschen Selbststudium bei einem so komplexen Thema kann auch nicht schaden.

Schauts euch einfach mal an:
intermediport - günstige eBooks

Gruß


----------



## Daniel Jackson (2. Apr 2010)

hi

ja, mittlerweile hab ich das buch auch gefunden und mir in der bibliothek ausgeliehen. war zwar bisher noch nciht sehr hilfreich, aber muss mich mal genauer mit befassen

das bluetooth-problem hab ich auch mittlerweile gelöst:
es war gar nicht nötig das bluetooth-gerät anzuzapfen, weil es nach dem pairen als "mikrofon" in windows registriert ist und dessen daten dann über directsound laufen, was ja im jmf als datasource zur verfügung steht. mehr noch: ich habe es geschafft die ausführlichere javasound-api als jmf-datasource zu wrappen - jetzt kann ich von mehreren mikrofonen gleichzeitig aufnehmen und nicht nur vom directsound-standardgerät

das mit dem datenströmen zusammenlegen funktioniert irgendwie mit einem multiplexer, nur ich hab noch nicht rausgefunden wie genau. das problem im genannten jmf-buch ist: dort wird zwar ausführlich beschrieben wie man einen multiplexer (und ein audioformat) selbst kreieren kann, aber ich hab noch keine beschreibung gefunden wie man so einen multiplexer dann benutzen muss :lol:


----------



## Sunny J (9. Apr 2010)

Ich bin mir nicht sicher, ob du hier deine fragen beantwortet bekommst, aber hier gibt es einige nützliche Community-Informationen:

www.jmfapi.org

habe jetzt aber nicht direkt nach deinem Problem gesucht

Gruß


----------



## Daniel Jackson (12. Apr 2010)

also ich find auf der seite jetzt keine nützlichen informationen... wo denn genau?

aktueller stand: 
die hardware ist gekürzt auf 1 kamera und 1 (bis 2) mikrofone
passt ganz gut, weil das jmf nur mit einer kamera arbeiten kann und es nicht unnütz kompliziert sein muss. bild-in-bild-funktion ist auch verworfen

im endeffekt muss ich nur ein videostrom und 1-2 audioströme so zusammenmischen, das am ende eine videodatei rauskommt. aber selbst das scheint nicht trivial. das jmf macht igendwie nur probleme oder ich bin zu doof es richtig einzusetzen. im buch von horst eidenberger stehen zwar die grundlagen der medienverarbeitung und das grundsätzliche konzept des JMF (was ganz interessant ist zu wissen ^^), aber die praxis sieht mal wieder anders aus :toll:
Ich scheitere irgendwie selbst an den leichtesten aufgaben.

habe jetzt mal folgendes programmiert (aufnahme von kamera und mikro):

```
DataSource sound = Manager.createDataSource(new MediaLocator("dsound://"));
DataSource video = Manager.createDataSource(new MediaLocator("vfw://0"));
sound.connect();
video.connect();
sound.start();
video.start();
			
DataSource merged = Manager.createMergingDataSource(new DataSource[]{sound,video});
Processor proc = Manager.createProcessor(merged); 
proc.configure();
Thread.sleep(5000); //bad solution, but just for testing
proc.setContentDescriptor(new FileTypeDescriptor(FileTypeDescriptor.QUICKTIME));
proc.realize();
Thread.sleep(3000);
			
DataSink s = Manager.createDataSink(proc.getDataOutput(), new MediaLocator("file://E:/out/test.mov"));
s.open();
s.start();
merged.start();
proc.start();
			
Thread.sleep(15000); //record 15 seconds 
proc.stop();
proc.close();
s.stop();
s.close();
```

aber es funktioniert nicht. keine exceptions, aber er schreibt die daten nicht in die datei, sondern nur den header. meine vermutung ist, das irgendwas am format nicht stimmt.
weiß jemand was ich falsch mache?


----------



## BBD (6. Jul 2010)

Auch eine kleine frage wie kann ich die länge eines Tiels bekommen mit JMF?


----------

