Video abspielen in JFrame

Hi,
ich habe ein größeres Programm, das später auf Win und Mac OS X laufen soll. Es ist so weit auch fertig, aber es gibt dort eine Tutorial-Sektion, in der Erklärungsvideos direkt im Programm abgespielt werden sollen. Ich verwende Java17 (kann aber bis Java11 runtergehen) und es ist eine Swing-Anwendung.

Ich breche mir leider ziemlich einen ab, eine technische Lösung zu finden. Ich bekomme JMF nicht zum Laufen. Scheinbar verträgt es sich nicht mit der Modularisierung. Ich habe es mit JavaFX versucht und die Libraries des OpenFX-SDK eingebunden, aber irgendwie will es mir einfach nicht gelingen. Bei JavaFX/OpenFX scheint sich ziemich viel verändert zu haben. Gluon möchte ich aufgrund der offenen Lizenzfragen nicht verwenden, sondern bei OpenJDK bleiben. Dann gibt es natürlich noch vlcj, was aber das ganze Programm wahnsinnig aufblähen würde und ich brauche dann verschiedene Fassungen je Betriebssystem.

Kann jemand mir einen Tipp geben, was die einfachste Möglichkeit ist zum Abspielen eines Videos in einem JFrame ist? Encoding etc. kann ich selbst bestimmen. Die Videos erstelle ich selbst und kann alles entsprechend festlegen. Toll wäre eine Library, die als ein (oder wenige) jar eingebunden werden kann und unter LGPL, BSD, Apache oder einer vergleichbaren Lizenz steht.

Merci!

Videos sind immer schwierig. Die ganzen Codecs die da installiert sein müssen usw. Ob da jemand aus dem Stegreif eine Lösung aus dem Hut zabern kann ist fraglich. Aber kurz:

  • Das JMF hatte ich mal ein bißchen verwendet. Ist aber schon lange her, und es ist wohl ziemlich alt. Damals hat ~„MOV immer einigermaßen funktioniert“, aber was man machen müßte, um da eine „moderne“ Videodatei abspielen zu können, weiß ich nicht genau. Wenn du sagst, dass du es nicht zum Laufen kriegst, wegen des Modulsystems: Kann man das nicht mit vertretbarem Aufwand anpassen? (Ich habe leider null Ahnung vom Modulsystem, aber Gerüchteweise soll man ja auch „legacy-JARs“ damit einbinden können - vielleicht irgendwo händisch eine module-info dazukleistern oder so?)
  • JavaFX habe ich praktisch noch nicht verwendet. Die Codesnippets sehen recht einfach aus, und es gehört zum Standard, darum wäre es ja schön, wenn es damit ginge. Was genau klappt dabei nicht?
  • vlcj … hab’ ich gerade mal ausprobiert, und konnte recht schnell in einem der Examples ein Video abspielen. Die technischen Details kenne ich da auch nicht, aber … sollte sich das nicht automatisch um die verschiedenen Betriebssysteme kümmern? D.h. was meinst du mit „verschiedene Fassungen“?

Muss es denn wirklich im Programm selbst sein? Vielleicht könnte man das Video auch im System-Browser öffnen.

Merci! Bei der Anwendung handelt es sich um einen kognitiven Test für Kinder im klinischen/medizinischen Bereich. Die Durchführung muss auf standardisierte Weise erfolgen und deshalb soll jeder Teil mit einem Video erklärt werden - deswegen die Einbettung in das Programm. Aktuell denke ich in Richtung Standbilder, die ineinander übergeblendet werden (+ Audio-Erklärung), sofern die Darstellung der Videos nicht doch noch klappt. Beste Grüße!

1 Like

Ah da ergibt das durchaus Sinn, dass es ins Programm gehört!

Schade, dass das nicht genauso einfach geht, wie ein Bild einzubinden. Aber ich würde mich freuen, wenn du uns auf dem Laufenden hältst, wie auch immer du es letztendlich löst.

Was ist denn das Problem mit JFX? Ich arbeite damit relativ viel, vielleicht kann man dir dabei helfen. Das scheint nach Google nur 3 Zeilen Code zu sein. Und was meinst du mit Gluon Lizenzen?


Ich denke selbst bei Standbildern hast du eventuell am Ende das Problem, dass die Bilder und der Ton sich verschieben über die Zeit. Im schlimmeren Fall hängt aus irgendeinem Grund der Bilderthread oder die Soundausgabe für längere Zeit und dann stimmt gar nichts mehr.

Bilder überzublenden ist nicht so schwierig. Man kann das einfach über den Alphakanal machen und dann Bilder ineinander faden. Wenn die Animation segmentiert ist, dann kann für jedes Segment ein Bild präsentiert und ein zugehöriges Audio gestartet werden. Wenn alles fertig ist, dann startet der nächste Abschnitt. Dadurch ist das in jedem Fall hinreichend synchron und man kann ja auch irgendwelche blinkenden Sachen einblenden, die Bildteile hervorheben. Ich habe das schon oft gemacht und das klappt auch prinzipiell. Kleinere Verschiebungen im Ablauf von 100 oder 200 ms sind da nicht so schlimm. Der Nachteil ist, dass man das alles entsprechend coden muss und natürlich sind bei Videos noch viel mehr Dinge möglich.

JFX: Ich habe mir das Gluon SDK geladen und die Jars eingebunden und zum module-info hinzugefügt. Es scheint sich im Vergleich zu früheren Fassungen aber viel geändert zu haben. Klassen aus den Tutorials existieren nicht mehr, z. B. SceneBuilder, oder die Konfiguration stimmt nicht. Keine Ahnung. Ich hat nicht geklappt.

Wenn ich es hinbekommen, dann poste ich die Lösung. Beste Grüße!

Ich hab hier mal kurz ein Video in mein JFX Formular mit eingebaut.

Code:

Media media = new Media(new File("Orchestra.mp4").toURI().toString());
MediaPlayer player = new MediaPlayer(media);
mediaViewer.setMediaPlayer(player);
player.play();

Das war eine Sache von Sekunden. Der größte Ärger war der Media Konstruktor, aber einen Tod muss man immer sterben. :smiley:


SceneBuilder ist auch ein eigenständiges Programm und keine Klasse.

Merci!