August 9th, 2009 @ 5:23pm | njames | Categories Coding | No Comments »
Pour un projet d'annotation de document vidéo (annotation sémantique manuelle), j'investigue du côté des différentes API existantes pour intégrer un player vidéo dans une application Java.

JMF, Java Media Framework
Bien sûr, il y a JMF, Java Media Framework, mais cette API commence à vieillir, et de plus elle cafouille un peu avec Java1.5, il est recommander d'utiliser JMF avec Java1.4 (voir ici ou ), ce qui est potentiellement embêtant.

Screenshot-JMStudio

Quelques liens sur JMF:
Les alternatives
  • des bindings avec ffmpeg, via JNI ou JNA, comme FMJ, Freedom for Media in Java, qui se veut un clone de JMF en quelque sorte. Pour le binding avec ffmpeg, JNA est utilisé.
    Cette API n'embarque pas de version de ffmpeg, et s'appuie sur la version de ffmpeg disponible sur la machine locale.

    Screenshot-FMJ Studio Screenshot-Registry Editor-1

  • jffmpeg: un plugin pour JMF, de nombreux codecs présent dans ffmpeg sont recodés en Java, voir cette page.
    Pour ajouter le plugin jffmpeg au JMFRegistry voir cette page (contrairement, à FOBS, il n'y a pas de détection des codecs, il faut enregistrer les Mime Types, Plugins et Codecs à la main dans le JMFRegistry).
  • FOBS, qui est un wrapper objet au dessus de ffmpeg, et apporte des API C++, Java et python au dessus de ce wrapper. Côté Java, c'est via un plugin JMF, FOBS4JMF, qu'opère l'API Java de FOBS, (vu les performances décevantes au décodage d'un XVID, il faut utiliser une JVM1.4 pour JMF, c'est plus fluide mais pas encore assez cependant, ce n'est pas très beau, ffplay fait beaucoup mieux).
    FOBS embarque sa propre version de ffmpeg et de jmf.
    Pour le tester, après son installation, aller dans ~FOBS/dist/jmf, et utiliser le JMStudio de JMF java -cp fobs4jmf.jar:jmf.jar JMStudio.
  • JVLC.
  • gstreamer-java: un binding-java pour gstreamer, fonctionne vraiment très bien! Le binding est basé sur JNA.
    Cependant le projet est encore assez jeune, et il y a de nombreuses fonctionnalités que j'aimerais y trouver qui ne sont pas disponibles: choisir le flux dans le container (vidéo et/ou audio), pause puis passer à la frame suivante, lecture accélérée -1 ou +1 etc..

    Screenshot-VideoPlayer-1

  • Xuggle-Xuggler: binding sur ffmpeg.
  • Quelques liens à propos de la nouvelle API de sun, la Java Media Components API:
July 30th, 2008 @ 12:04pm | njames | Categories GNU/Linux, Java | No Comments »
J'ai expérimenté le problème intéressant des modes headless/headful en Java en codant une application de crawling de GoogleImage. Mon application crawl les pages de résultats de GoogleImage, télécharge les images proposées dans les résultats pour les stocker en local, et renvoie une page contenant des miniatures des images retrouvées. Au moment de stocker les images, j'utilise le programme convert du projet ImageMagick pour les retailler, et JIU, Java Imaging Utilities, pour obtenir leur résolution. Le projet est une servlet sur une machine distante où X est installé, mais est tomcat est lancé dans une session non X. JIU semble avoir besoin de la variable DISPLAY, car l'exception suivante est levée:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)
java.awt.Window.(Unknown Source)
java.awt.Frame.(Unknown Source)
java.awt.Frame.(Unknown Source)
net.sourceforge.jiu.gui.awt.ToolkitLoader.load(ToolkitLoader.java:88)
net.sourceforge.jiu.gui.awt.ToolkitLoader.loadAsRgb24Image(ToolkitLoader.java:114)
net.trevize.Bouquinoscope.processQuery(Bouquinoscope.java:651)
net.trevize.Bouquinoscope.doPost(Bouquinoscope.java:298)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
D'après ce forum, c'est un problème rencontré aussi avec JMF, la solution est de préciser la propriété système demandant à Java d'utiliser le mode headless:
java.awt.headless=true
ou seulement pour le Toolkit AWT:
awt.toolkit=sun.awt.HeadlessToolkit
mais cela ne peut fonctionner dans mon projet car j'utilise dans mon code la classe ToolkitLoader de JIU qui, apparement, nécessite un mode headful. Du coup, pour obtenir la résolution j'utilise un java.awt.Image obtenu par ImageIO en mode headless. Pour plus d'info sur les mode headless et headful de Java, voir ce tutoriel.


 Valid XHTML 1.0 Transitional Valid CSS! WordPress