# Java Media Framework



## Bgag (9. August 2010)

Guten Morgen!

Wie der Titel dieses Threads bereits vermuten lässt, beschäftige ich mich seit kurzer Zeit mit JMF, dem Java Media Framework. Der Grund, ich soll im Rahmen eines Betriebspraktikums eine kleine Software in Java schreiben, die es mir erlaubt eine USB-Kamera bzw. Webcam anzusteuern. Zu Anfang reicht ein einfaches Bild.

Jedoch machen mir schon die ersten Anforderungen bedenken. Die Kameras sollen, falls möglich. automatisch erkannt und aufgelistet werden. Falls keine Kamera gefunden wird, soll diese manuell gesucht werden können.

Dazu erst einmal ein paar Fragen. Ist es überhaupt möglich die Kameras automatisch zu erkennen? Und wenn ja, wie? Falls eine solche Erkennung fehl schlägt oder überhaupt nicht möglich ist, wie könnte eine manuelle Suche implementiert werden?

Nehmen wir nun mal an, ich habe ein Bild, dass ich einfach auf dem Bildschirm ausgeben lasse. Wie ist es mir möglich daraus die einzelnen Bildinformationen zu extrahieren und so abzuspeichern, dass ich einfache Bild-Transformationen in Form von Matrix-Matrix, Vektor-Matrix und Vektor-Vektor Multiplikationen durchführen kann. Dabei ist mir nur wichtig, wie ich die Daten bekomme und abbilden sollte.

Danke für eure Hilfe.

Liebe Grüße,

Andreas

 PS: Die neue Seite sieht super aus und die letzte Buchverschenkaktion war auch genial.


----------



## Mikrowelle (9. August 2010)

Ich würde sagen mit der Cam ist es wie mit dem Drucker. Es müssen Treiber installiert sein, dann kann man die Geräte anzeigen lassen.  Das Programm zeigt quasi nur die Cams an, von denen der Treiber bereits vorhanden ist. Unter grossen Unix artigen ist es kein Problem, bei Windows ist was anderes, da der Benutzer vorher meistens selbstäng einen Treiber installieren muss.
----
Ist ein Drucker nicht installiert, so kann man ihn auch durch Java Programme nicht ansprechen, ich vermute stark das es bei der Cam genau so ist. Ich lasse mich aber gerne eines besseren belehren.

Ansonsten schau dir mal JNA und JNI  sowie JavaFX an.


----------



## Bgag (10. August 2010)

Guten Morgen!

Zuerst einmal danke für deine Antwort.

Selbstverständlich hast du Recht. Es können natürlich nur Kameras gefunden werden, die auch installiert sind. Jedoch wird diese Kamera zwar von Programmen wie Skype und Cheese erkannt, nicht jedoch von meinem kleinen Testprogram. Da ich mit JMF noch nie gearbeitet habe, kann es natürlich sein, dass ich da Blödsinn prgrammiert habe, denke aber es sollte so stimmen.


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fancycam;

import java.io.*;
import javax.media.*;
import javax.media.format.*;
import javax.media.protocol.*;
import javax.swing.*;
import java.awt.*;
//import java.net.*;
import java.awt.event.*;
//import javax.swing.event.*;

/**
 *
 * @author awilhelm
 */
public class JMFTest extends JFrame {

    Player _player;

    JMFTest() {
        // Make a start output, ...
        System.out.println("=> searching webcams");

        // ... define the video format ...
        VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);

        // ... and capture the number of connected devices.
        int count = CaptureDeviceManager.getDeviceList(vidformat).size();

        // Check if any device was connected.
        if (count > 0) {
            // Get the device info, ...
            CaptureDeviceInfo cdinfo = (CaptureDeviceInfo) CaptureDeviceManager.getDeviceList(vidformat).get(0);

            // ... prompt the name of the used device ...
            System.out.println("=> using " + cdinfo.getName());

            // ... and get a locator by the info data.
            MediaLocator locator = cdinfo.getLocator();

            try {
                // Try to load a source.
                DataSource source = Manager.createDataSource(locator);
                // If a NoDataSourceException was catched, ...
            } catch (NoDataSourceException e) {
                // ... output the error-stack ...
                e.printStackTrace();
                // ... and if an IOException was caught, ...
            } catch (IOException e) {
                // ... output the error-stack.
                e.printStackTrace();
            }
        // Dump an error message on failture.
        } else {
            System.out.println("=> no webcam found. exiting");
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        JMFTest jmf = new JMFTest();
        jmf.pack();
    }
}
```

Falls es von Interesse ist, meine Entwicklungsumgebung ist Netbeans.

Liebe Grüße,

Andreas


----------



## Bgag (11. August 2010)

Guten Abend!

Ich habe mich noch etwas mit dem Thema beschäftigt, habe aber weiterhin kein Bild. 

Das *Java Media Framework* scheint korrekt installiert zu sein, da *Netbeans* die Bibliotheken sofort erkennt. Überprüfen kann ich dies jedoch nicht, da das dafür vorgesehene *Applet von Oracle* nicht funktioniert und auch nicht heruntergeladen werden kann, da der Link nicht mehr funktioniert.

Ich habe einen neuen Test gestartet. Ich habe mir nun mit dem *jmstudio* die angeschlossenen Devices ausgeben lassen und es wird auch die USB-Webcam erkannt. Jedoch habe ich keine Möglichkeit gefunden, mir das Bild von dieser mit Hilfe des jmstudios ausgeben zu lassen. 

Die Kamera habe ich zudem mit verschiedenen Programmen, wie zum Beispiel *Cheese* oder *Skype*, getestet und sie wurde immer auf Anhieb erkannt.

Der verwendete Treiber ist laut der Ausgabe von jmstudio der *video4linux* (_v4l_) Treiber. Eine direkte Ansprache der Kamera mit Hilfe des folgenden Codes war leider nicht von Erfolg gekrönt.


```
// Get the device info, ...
CaptureDeviceInfo cdinfo = CaptureDeviceManager.getDevice("v4l:UVC Camera (046d:080f):0");
```

Hat jemand vielleicht noch eine Idee, wo der Fehler liegen könnte?

Außerdem würde mich noch interessieren, ob es mit dem JMF überhaupt möglich ist, unabhängig von der unterliegenden Plattform die Treiber anzusprechen, bzw. zu verwenden.

Sollte dies nicht möglich sein, würde mich interessieren, ob Java das verwendete System erkennen kann, sodass eine vom System abhängige Implementation vorgenommen werden könnte. Unter Unix ist es ja zum Beispiel möglich einfach _\dev\video0_ auszulesen und die dort abgelegten Daten als einzelne Bilder zu interpretieren. Frage ist dann natürlich, ob soetwas auch unter Windoof und Mac möglich wäre.

Würde mich über ein paar erhellende Worte und weiterführende Anregungen freuen.

Liebe Grüße,

Andreas

PS: Wie sieht es eigentlich mit dem Support von JMF aus? Habe gehört, dass dieser eingestellt wurde, habe dazu bei Oracle aber nichts gefunden.

PSS: Entschuldigt das doppelte Posting, aber es hat sich ja einiges bei mir getan.


----------



## mccae (11. August 2010)

Zum Thema verfügbare Kamerageräte hab ich mir folgendes überlegt:

"CaptureDeviceManager.getDeviceList" liefert doch alle verfügbaren Videogeräte die das übergebene Format unterstützen.

Laut docs kann man auch einfach kein "Format" übergeben, und somit eine Liste aller Geräte erhalten.
Denn vielleicht unterstützt deine Webcam kein "Raw RGB"...


----------



## Bgag (12. August 2010)

Hallo!

Danke für deine Antwort.

Ich hatte es auch bereits mit *YUV* versucht, jedoch war dieser Versuch nicht von Erfolg gekrönt. Ich habe nun, wie du es mir geraten hast kein Format vorgegeben.


```
// Make a start output, ...
System.out.println("=> searching webcams");

// ... and capture the number of connected devices without searching for a specific ouput format..
int count = CaptureDeviceManager.getDeviceList(null).size();

// Finally print out the number of found devices.
System.out.println(count + " devices found.");

// If there are devices dump the first one.
if (count > 0) {
     // Get the device info, ...
     CaptureDeviceInfo cdinfo = (CaptureDeviceInfo) CaptureDeviceManager.getDeviceList(null).get(0);

     // ... prompt the name of the used device ...
     System.out.println("=> using " + cdinfo.getName());
}
```

Ich habe nun auch ein Ergebnis erhalten, wenn auch nicht das gewünschte. Es wurde das *JavaSound audio capture* gefunden.

Da stelle ich mir nun die Frage, ob ich noch etwas zusätzlich installieren muss. Es gibt ja neben dem Linux Performance Pack auch noch das Cross-platform Java Pack. Ich habe allerdings nur das erste Pack installiert.

Oder kann es sein, dass ich, wenn ich die *Logitech c120* verwende noch zusätzliche Bibliotheken oder Treiber installieren muss? Reicht es denn, wenn der *v4l*-Treiber installiert ist?

Liebe Grüße,

Andreas


----------



## cle4live (19. August 2010)

Hallo,

schau mal hier, hab ich grad gefunden******

http://code.google.com/p/v4l4j/


----------



## cle4live (19. August 2010)

Hallo,

schau mal hier, hab ich grad gefunden******

http://code.google.com/p/v4l4j/


yeahh man******!

es funktioniert******!

einfach v4l4j.jar einbinden und das testprogramm laufen lassen und schon kannst du deine cam in java verwenden!! 

hier die anleitung zum installieren

http://code.google.com/p/v4l4j/wiki/DebianInstall

dann einfach einen verweis auf die v4l4j.jar datei erstellen, diese befindet sich im verzeichnis /usr/share/java/

und dann starten code findest du hier:

http://code.google.com/p/v4l4j/wiki/Examples



have fun

lg cle


----------



## miffi (20. August 2010)

Howdie.

Letztes Jahr hatte ich auch ein Java-Projekt, das auf eine beliebige USB-Webcam zugreifen musste. Hab wie du viel über JMF recherchiert. Es wird soweit ich weiß echt nicht mehr supportet, und Webcams zu listen hab ich damit auch net hinbekommen.

Bin dann auf den Direct Show Wrapper gestoßen - hierbei handelt es sich allerdings um ein *kommerzielles Produkt*. Man kann es aber kostenfrei verwenden, solang es nur privat eingesetzt wird. Ich kann diesen Wrapper nur empfehlen. Es liegt ein Sample bei (inkl. Sourcen), das zeigt, wie die Cam gestartet wird, Farbwerte und Auflösungen konfiguriert werden können usw.

Falls du das testest und Probleme hast, kann ich dir per PN gern ein Stück von meinem Startup-Code schicken.

Gruß
miffi


----------

