# Bild einer Webcam auffangen



## aedu.waelchli (26. Feb 2011)

Hallo liebes Java-Forum, ich bin neu hier.

Ich kenne Java eigentlich schon gut, bin aber trotzdem nicht der Profi. In der letzten Zeit habe ich mich für die Multimediaprogrammierung interessiert und will nun das Bild meiner Webcam auffangen.
Dies soll dann vorerst mal ganz einfach in einem JFrame angezeigt werden.

Weiss jemand wie ich meine Webcam ansprechen kann oder wo ich das nachlesen kann?
Hab im Internet (und auch in disem Forum) schon danach gesucht und bin auf das JMF gestossen, bin daraus aber nicht schlau geworden.

Grüsse
Adrian


----------



## Noctarius (26. Feb 2011)

Such mal im Forum, gibt schon einige Einträge dazu.


----------



## aedu.waelchli (26. Feb 2011)

Vielen Dank für die so schnelle Antwort!

Naja, wenn ich das Forum so durchsuche dann finde ich nichts, was ich verstehen oder mir weiterhelfen würde 

Danke trotzdem...


----------



## Kr0e (27. Feb 2011)

Dein Vorhaben ist schwer und wenn es dann mal klappt, nutzt du vermutlcih JMF/FMJ was wiederum veraltet ist und nicht mehr entwickelt wird. Die kurze Antwort wrid dir nicht gefallen: Alles was mit Video/Webcam/Audio zu tun hat, ist bei Java nur über Umwege möglich. Aus meiner Sicht ist die Rangfolge der Schwierigkeitslevel so:

Am einfachsten: Audio

Immernoch relativ einfach bis mittelschwer: Video

Schwer: Webcam


Es gibt endlose Probleme, die von Leuten stammen, die ein und das selbe Programm auf unterschiedlichen Plattformen laufen lassen.
Mal klappt es.. mal klappt es nicht.

Multimediaprogrammierung ist ein sehr schweres Thema in Java. Du musst nich nur sehr gutes Javawissen vorweisen sondern auch viele Frameworks kennen, damit du entstehenende Probleme über andere Wege lösen kannst.

Ein Beispiel dazu: Du kannst mit Xuggler recht viel im Bereich multimedia machen. Ausnahme: MP3. -> klappt einfach nicht.
Außerdem gibt es sowohl Xuggler als auch Gstreamer-java(eine andere gute Medienlib) nur für 32 bit systeme...

Mit JMF ist Webcam relativ gut zu realisieren. Allerdings klappen manche Webcams nicht... Mit JMF Videos abspielen ist wiederum zum ******. Alles in allem sehr kompliziert.

Als nächstens würde sich die Frage stellen, ob dann überhaupt JAVA wirklich die erste Wahl ist. Immerhin gibt es keine perfekte Sprache. Angenommen du willst nur auf Windowsplattformen arbeiten ("nur" is gut, 80-90% benutzen windows), wäre es Unsinn Java zu nehmen.

C# ist fast wie Java aber dort kannst du DirectShow nehmen. Damit ist alles im Bereich Multimedia nur ein 10 Zeiler... maximal.

Du musst halt einfahc überlegen was du machen willst und dann die beste Sprache anwenden. Java ist eigentlich nicht gemacht für Multimedia und du solltest viel Motivation mitbringen, da das teilweise ziemlich deprimierend sein kann. Irgendwas klappt nicht und du und alle anderem im Forum haben keine Ahnung woran es liegt, dabei hast du dann nur ein 64bit system und nutzt vlt 32bit Libraries... Oder ähnliche Probleme... Damit wollte ich jetzt in keinster Weise dieses Forum schlecht machen, es geht darum, dass man oft nicht beschreiben kann, was genau kaputt ist, sondern schlicht und eifnach von JNA eine "Klappt nicht Exception" ins Gesicht bekommen kann und keiner hat genug Wissen über dein System/Konfiguration um es zu lösen. Außerdem musst du daran denken, wie das dann mal bei einem kommerziellen Projekt werden soll, wenn deine Software bei 50% der Leute abschmiert.

Und wenn du aus der suchfunktion nicht schlau wirst, dann wirst du mit Medienprogrammierung auch ncih weitkommen. Du musst dort ständig in alten Foren blättern (weil eben viele Frameworks veraltet sind und nicht mehr aktiv entwicklet werden .. ergo kein support).

Das alles soll dich nicht entmutigen, aber dir zeigen, dass es recht schwer ist. JMF/FMJ, GStreamer-Java, Jffmpeg, JMC, Xuggler, Vorbis/Theora (JTheora) sind stichworte, die dir helfen könnten. 

Gruß,
chris


----------



## Simon_Flagg (27. Feb 2011)

passt jetzt vlt. nicht dazu: wie würde mans in c++ machen?

lg


----------



## Kr0e (27. Feb 2011)

In C++ mit ffmpeg oder gstreamer. Kinderspiel. Gstreamer-java ist ein guter Wrapper aber noch stark in der Entwicklung mit null Doku.
Vlt wird das aber iwann mal besser. Allerdings gilt das gleiche wie für java. Kein 64 bit. MAcht aber bei C++ Programmen nichts aus...
Bei Java scon: Wenn jemand enie 64 bit JVM drauf hat , müste er extra eine neue 32 bit jvm installieren, nur damit es läuft...

In C++ kannst du dann auch direkt DirectShow nehmen für Windows.


----------



## aedu.waelchli (27. Feb 2011)

Vielen Dank für die Antworten

Ich wusste schon dass es schwierig werden wird, da ich mich ja in diesem Bereich überhaupt nicht auskenne.
Eigentlich soll das ganze ja nicht mit Videoaufzeichnung oder Wiedergabe sein, sondern "nur" ein Bild aufnehmen und speichern, damit ich dann das Bild "analysieren" kann (Farberkennung).

Und das grosse Problem mit der Plattformabhängigkeit war mir schon im voraus bekannt. Das muss ich dann halt so hinnehmen.

PS: Das Forum hier ist das Beste!


----------



## Kr0e (28. Feb 2011)

Nun, wenn es dir lediglich um das Bild geht und nicht um Plattformunabhängigkeit beim ERstellen des Bildes, kannst du doch einfach DirectSchow nehmen unter Windows. (Sofern du Windowsuser bist)

DirectShow Java Wrapper: humatic - dsj

Das ist der DirectShow wrapper, klappt gut udn kann sehr viel... Schaus dir mal an, wenn du willst 

Gruß,

Chris


----------



## aedu.waelchli (28. Feb 2011)

Vielen Dank für den Java Wrapper!!

Ich konnte ihn erfolgreich installieren. Jetzt habe ich noch ne frage zu der Webcam:
Kann ich da eigentlich jede Webcam nutzen?
Wenn nicht, welche gehen nicht? Auf was muss ich achten?


----------



## Kr0e (1. Mrz 2011)

Mit dem Wrapper für Windows gehen alle die unter Windows unterstützt sind  Ergo: Klappt eine Webcam unter Windows so klappt sie auch mit DirectShow und Java  Aber halt nicht für Mac/Linux... 

Gruß,

Chris


----------



## Gast2 (1. Mrz 2011)

Nimm einfach eine IP Webcam die einen MJPEG Stream über HTTP zur Verfügung stellt, z.B. D-Link DCS-900. Dann ist das ganze Thema in 20 Zeilen Code ohne irgendwelche Multimedia Frameworks, JNI, DirectShow usw gegessen.

1) HTTP Connection öffnen
2) Vom Stream lesen und immer schön Frame für Frame wegspeichern, im MJPEG Format sind Trenner (Header Informationen für das jeweils folgende Bild) drin
3) HTTP Connection schließen
Fertig.


----------



## aedu.waelchli (1. Mrz 2011)

Hallo,
Ich hab da mal was zusammengebastelt und bis jezt funktioniert das auch. Die Konsole gibt mir den Namen meiner Webcam an, also hat er sie erkannt! *freu*


```
package videocapturing;

import de.humatic.dsj.*;
import de.humatic.dsj.DSCapture.CaptureDevice;
import de.humatic.dsj.DSFilter.DSPin;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

class SwingCapture {

    public static void main(String[] args) {
        DSCapture cap = new DSCapture(1, new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
            }
        });

        CaptureDevice device = cap.getActiveVideoDevice();
        System.out.println(device.getName());
        
    }
}
```

Mir fehlt jezt aber leider der Ansatz. Ich glaube ich muss einen Stream erstellen, der dann direkt auf ein JPanel abgebildet wird. Ich finde aber in der doc vom dsj keine Methode/Klasse für das streamen. Sollte meiner Meinung nach irgendwo beim "CaptureDevice" sein.


----------



## Kr0e (1. Mrz 2011)

Hi,

schau mal hier: DirectShow Java Wrapper: humatic - dsj

Da ist oben ein Link "SimpleCapture"...

Dort wird alles mit Code zusammen erläutert....

@Fassy: Das mit HTTP Webcam hab ich noch nie gehört und ich finde es von der Idee her ziemlich gut !
Ist eine "IP Webcam" der REgelfall ? Ich meine, keiner will sich extra ne neue Webcam kaufen nur damit das JAVA programm klappt welches nur mit IP Webcams umgehen kann... Wenn das der Regelfall ist bei WEbcams, fänd ich das in der Tat ziemlcih cool!

Gruß,

Chris

PS: Die Webcam, die von dir genannt wrude, kostet ja ein Vermögen und wäre nicht tragbar für normale Anwender, nur damit ein Java Programm läuft


----------



## Andi_CH (2. Mrz 2011)

Kr0e hat gesagt.:


> @Fassy: Das mit HTTP Webcam hab ich noch nie gehört und ich finde es von der Idee her ziemlich gut !



Hm einfach so eine Idee - ist es kompliziert eine http-Webcam mit einer USB Cam und einem Webserver zu simulieren? Könnte ja auch auf 127.0.0.1 laufen


----------



## tuxedo (2. Mrz 2011)

Netzwerkkameras sind doch mittlerweile günstig zu haben?!

https://www.jacob-computer.de/Netzw...chstrom_5_V_%28TL-SC3130%29_artnr_258316.html

Oder sogar mit WLAN zum ähnlichen Preis:

IC-1510Wg - Netzwerkkamera - Farb: Amazon.de: Computer & Zubehör

Und die sprechen dann allemöglichen Protokolle:

FTP, HTTP, NTP, SMTP, TCP/IP, UDP/IP, ARP, ICMP, RTSP, RTP, HTTPS, UPnP, Bonjour, PPPoE, ...

Da sollte man mit jeder beliebigen Programmiersprache ein passendes "Interface" finden....

- Alex


----------



## Kr0e (2. Mrz 2011)

Finde 66 Euro nicht grad billig für eine Webcam... Außerdem viele haben eine normale Webcam schon integriert in ihrem Laptop, die wollen sich garantiert keinte 2te kaufen... Wie ich sehe, ist das offenbar bei preisgünstigeren Webcams (15-20€) nicht der Fall mit HTTP Unterstützung. VOn daher empfehle ich dir die Softwarelösung...


----------



## tuxedo (2. Mrz 2011)

Nein, billig ist es nicht. Aber wenn man schaut was eine anständige USB Webcam kostet und was die von Haus aus kann, dann sind rund 60EUR für ne netzwerktaugliche Cam nicht wirklich teuer. 

Klar, für nen Schüler sind 60EUR wohl immer noch viel (wobei.. wenn man schaut was die heute si an Taschengeld bekommen...). Für alle anderen, die für ihre Programmiererei jeden Monat Geld aufs Konto bekommen sind 60EUR nicht wirklich der Rede wert. 

Aber man muss auch noch berücksichtigen für welchen Zweck man die Cam will.

Will man Videotelefonie mit Skype und Co. machen ist so eine Netzwerkcam nicht unbedingt geeignet.
Will man hingegen die Bilder im Netzwerk verteilen oder auf nen Webserver laden (traditioneller Webcam-Ansatz), dann lohnt sich so ein Teil auf jeden Fall: Man braucht keinen Rechner und auf der Stromrechnung fällt der Betrieb der Cam auch nicht wirklich auf (im gegensatz zu einer USB Webcam die einen Rechner benötigt).

Wie immer gilt also: "It depends ..."

- Alex


----------



## aedu.waelchli (2. Mrz 2011)

Wow, vielen Dank!


@Kr0e: Auf dieser Seite mit dem Beispielcode war ich schon, hatte nur nicht die Links oben gesehen. Ich hab dank dir jetzt herausgefunden, wie ich das Bild auf das JFrame bekomme und es hat auch geklappt! Man muss halt wissen wo und wie, aber sonst wars einfach. Ich versuche jetzt noch herauszufinden, wie ich einen Screenshot speichern kann. Danke schon mal für alles!!

Gruss
Adrian


----------



## Kr0e (2. Mrz 2011)

Einen Screenshot vom kompletten Monitor ? Das geht mit "Robot.createScreenCapture(Rectangle screenRect) " Als Ergebnis bekommste ein BufferedImage. Das schreibst du mit ImageIO.write(image, "PNG", pathToFile); auf die Festplatte...

Gruß,

Chris


----------



## aedu.waelchli (2. Mrz 2011)

Kr0e hat gesagt.:


> Einen Screenshot vom kompletten Monitor ? Das geht mit "Robot.createScreenCapture(Rectangle screenRect) "
> Chris



Nein, ich meine ein Screenshot von der Webcam. Ich hab die Methode dafür in der Klasse "DSCapture" aber noch nicht gefunden.


----------



## Madman (4. Apr 2011)

Versuche doch mal von dem ein Graphics-Objekt zu bekommen.

Meist irgendwie mit 

```
Graphics g = cap.getGraphics();
```
Und dieses Objekt kannst du auf ein BufferedImage schreiben und das dann speichern...



Grüße
Madman
Irrenhaus AG: Startseite


----------

