Webcam Motion JPEG Stream einbinden

Begonnen von ext23, 08 Februar 2014, 13:04:15

Vorheriges Thema - Nächstes Thema

ext23

Hallo,

ich hab eine Überwachungskamera mit einem MJPEG fähigen USB Grabber an meinem Server angeschlossen. Mit der Software Motion biete ich diesen Stream über einen Netzwerk Port an. (Aus Sicherheit um den direkten Zugriff auf Motion zu unterbinden habe ich einen PHP proxy zwischen, also ein PHP script was das einfach nur umsetzt. Beispiel:
    fwrite( $fp, "GET /?action=stream HTTP/1.0\r\n\r\n" );
    while( $str = trim( fgets( $fp, 4096 ) ) )header( $str );
    fpassthru( $fp );
    fclose( $fp );


Ich gehe mal davon aus, dass jede IPCam out of the box mittlerweile mjpeg streams sendet oder setzen die meisten da auf Java?!?

So jetzt würde ich das Bild allerdings auf in FHEM einbinden, was ich jetzt als IFrame gemacht habe. Das dumme ist nur, dass die meisten Android Browser kein MJpeg verstehen und anzeigen können. Was kann man denn da noch machen? Hat einer ein Idee? Das Cam Modul von FHEM zeigt nur snapshots an aber keinen Stream wenn ich das richtig verstanden habe. Und ein sekündlicher Bildaufbau sieht vermutlich nicht so toll aus, auch bezogen auf das "Flackern" beim Aufbau.

Gibt es da schon gescheite Lösungen? Zum Thema Webcam finde ich hier noch nicht all zu viel in dem Forum.

Gruß und Danke für Hilfreiche Tipps.
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

locutus

Zitat von: ext23 am 08 Februar 2014, 13:04:15
ich hab eine Überwachungskamera mit einem MJPEG fähigen USB Grabber an meinem Server angeschlossen. Mit der Software Motion biete ich diesen Stream über einen Netzwerk Port an.
Nach demselben Prinzip betreibe ich schon seit einer Weile eine analoge Kamera an einem Debian System. Allerdings verwende ich das Paket MJPG-Straemer. Die Software hat den Vorteil, dass man auch auf Java umstellen kann.

ZitatIch gehe mal davon aus, dass jede IPCam out of the box mittlerweile mjpeg streams sendet oder setzen die meisten da auf Java?!?
Einige Hersteller setzen MPEG4 oder H.264 zur hocheffizienten Videokompression ein.

ZitatDas dumme ist nur, dass die meisten Android Browser kein MJpeg verstehen und anzeigen können. Was kann man denn da noch machen?
Einen anderen Browser aus dem Play Store ziehen, das Device auf KitKat updaten oder wie in meinem Fall einfach das Gerät loswerden und ein neues leistungsfähigeres erwerben.

ext23

Den MJPG-Streamer hab ich auch laufen ja. Java mag ich nicht so, aber was heißt "umstellen", das bleibt trotzdem MJPEG, nur eben gezogen von einem Applet oder Javascript, das hat ja nichts mit der Software an sich zu tun.

Mit dem H264 stimmt, aber das machen mehr die HD-Cams und ich hab eben auch eine gute alte analoge ja ;-)

Und ein leistungsfähigeres Gerät? Das hat doch nichts mit dem tablet an sich zu tun, der Browser ist doch das Problem. Oder meinst du die Kamera? Würde das mit H264  denn eigentlich gehen? Können sowas die Browser mittlerweile direkt oder auch nur über Java Umwege?

Dann werd ich mal schauen ob das WebViewControl auch mit dem Dolphin HD Browser zu vereinen ist, der kann mjpeg eigentlich, naja oder der Firefox, aber der ist grottig langsam unter Android.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

locutus

Zitat von: ext23 am 09 Februar 2014, 10:25:16
Den MJPG-Streamer hab ich auch laufen ja. Java mag ich nicht so, aber was heißt "umstellen", das bleibt trotzdem MJPEG, nur eben gezogen von einem Applet oder Javascript, das hat ja nichts mit der Software an sich zu tun.
So meinte ich das auch.

ZitatUnd ein leistungsfähigeres Gerät? Das hat doch nichts mit dem tablet an sich zu tun, der Browser ist doch das Problem. Oder meinst du die Kamera? Würde das mit H264  denn eigentlich gehen? Können sowas die Browser mittlerweile direkt oder auch nur über Java Umwege?
Die Erkenntnisse fehlen noch, weil ich kein Gerät mit H.264 besitze.
Ich kann nur aus eigener Erfahrung berichten, dass die Androiden in der 100 Euro Preisklasse keinen MJPG-Stream im Browser darstellen konnten. Beide Geräte waren mit guter CPU aber schwacher GPU ausgestattet.
Dagegen bewerkstelligt der Webbrowser des Nexus 7 (2013) die Aufgabe mit Bravour.

ext23

Ähh wie? Ich hab auch ein Nexus 7 (aber das 2012er) aber da ist standardmäßig Chrome drauf und der kann das nicht. Da ich das Teil allerdings auch beruflich nutze habe ich das nicht gerooted, also da ist das originale rom drauf was derzeit aktuell ist (4.4.2).

Der Firefox macht das, aber der macht das auch auf meinem 60 Euro 10" Tab anstandslos (3 Streams dann kotzt der).

Mhh egal, wie dem auch sei, ich wollt ja nur wissen ob es noch andere alternativen zum Streamen gibt, aber dem ist dann wohl nicht so. Dann werd ich eventuell doch ein Java Applet im iFrame benutzen, naja oder vielleicht reich auch Java Script aus.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

locutus

Faszinierend! - hätte Mr. Spock jetzt wohl gesagt.

Mein abschließender Kommentar dazu: typisch Android!
Das System weist nur eine Konstante auf: Chaos.

ext23

*lol* Naja das stimmt schon ja, aber Apple kommt mir trotzdem nicht ins Haus ;-)
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Kuzl

mich würde auch interessieren wenn wer eine lösung findet.
die einzige Lösung, die ich bis jetzt gefunden habe, war dass ich mit der cam jpg machen lasse und diese über das Modul weblink in FHEM einbinde.
über Javascript wird dieses Bild alle 5 Sekunden aktualisiert aber das ist natürlich kein flüssiger stream :(

Thargor


@Kuzl: Könntest Du bitte mal dein Javascript-Code posten?
Vielen Dank!

Kuzl

hab mitlerweile sogar noch ne viel einfachere lösung gefunden :)

Zitatdefine webcam weblink htmlCode <html>
<img name="dyn_bild" src="http://192.168.178.62:8081" width="320" height="240">
<br>
<a href="http://192.168.178.62:8083/fhem?detail=webcam">webcam</a>   
</body></html>

das wandelt den Stream der Webcam in ein dynamisches Bild um das sich in Echtzeit aktualisiert.

ext23

Naja das ist schon richtig, geht aber auch wieder nur mit Browsern die mjpeg direkt abspielen können.

Noch ein kleiner Tip, ich sehe du benutzt da Größenangaben, das solltest du in deiner cam einstellen falls möglich. Übertragen wird der Stream nämlich trotzdem als 640er Auflösung oder was auch immer... Das macht sich dann bemerktbar wenn du mit dem Handy unterwegs bist.

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Kuzl

Das ist nicht ganz richtig, geht auch mit google chrome, der sonst keinen mjpeg stream unterstützt. IE hab ich jetzt zwar nicht getestet aber den benutzt hoffentlich keiner von euch :D

Ja das mit der Auflösung ist richtig und gewollt, da so mit Abstand das sauberste Ergebnis zu sehen war... und so oft sehe ich mir die cam auch nicht unterwegs an :)

ext23

Also Chrome kann mjpeg, meiner auf dem Tablet zumindest.

Und das musste mir jetzt mal erklären wieso es mit den 2 Zeilen gehen soll du bindest doch den mjpeg Stream direkt ein... Wie hast du es denn sonst gemacht wo es nicht ging?

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Thargor

#13
Ich verstehe den Code auch nicht  ???

Inzwischen hab ich selbt den Code eine Javascriptlösung gefunden:


<img src="http://192.168.0.140/image/jpeg.cgi" width="600" height="450" name=webcam_image>

<script language="JavaScript">
var imageUrl = document.webcam_image.src;
var random = new Date().getTime();
var delay = 1; // update vertraging in seconden
var counter = 0;
var buffer = new Image;

function DisplayImage()
{
document.webcam_image.src = buffer.src;
LoadNextImage();
}

function LoadBuffer ()
{
var trickname = imageUrl;
++counter;
trickname += "?counter=" + (random + counter);
buffer.src = trickname;
buffer.onload = DisplayImage;
}

function LoadNextImage()
{
setTimeout("LoadBuffer()", 1000*delay);
}

LoadNextImage();

</script>

Kuzl

ich hab keine Ahnung warum es geht, wurde aber in einem Forum als Workaround so angeboten, da der Chrome (zuminderst Desktop-Version) offiziell die Unterstützung für MJPEG-Streams eingestellt hat. Ich habs getestet wenn ich die URL des Streams eingegeben habe, ging es nicht und so geht es, warum genau, keine Ahnung. => Never touch a running system :D

Das Javascript, das ich davor hatte, war dem von Thargor sehr ähnlich.