Hallo,
ich habe folgendes vor:
ich betreibe eine Surveillancestation mit 8 Kameras. 4 von dieser Kameras (foscam) haben einen eigenen webserver auf dem man Mjpeg streams und Jpeg snapshots abfragen kann.
Die anderen kameras sind einfache ONVIV kams die nur einen RTSP stream zur verfügung stellen.
Deshalb wollte ich gerne über die Surveillancestation einen Mjpeg stream und Jpeg snapshots von diesen kameras abfragen um diese dann mir in meine hausautomationssoftware zu integrieren.
Ich bin jetzt schon soweit das ich einen sauberen Mjpeg stream von der SS bekomme und diesen im Webbrowser sauber angezeigt bekomme. Leider kann das Camera tool meiner Haussautomationssoftware (mediola NEO AIO) diese Bildausgabe nicht verarbeiten.
Deshalb wollte ich es jetzt mal über die jpeg ausgabe von einem snapshot versuchen, leider gibt mir das script aber kein jpeg bild aus, irgendwo muss noch ein fehler sein den ich aber leider nicht finden kann.
hier mal das script welches ich verwende der Aufruf erfolgt einfach über folgende URL:
http://<IP der SS>/webcam.php?usr=<CAMuser>&pwd=<MeinGeheimesPawword>&cam=3&format=jpeg für die jpeg ausgabe und
http://<IP der SS>/webcam.php?usr=<CAMuser>&pwd=<MeinGeheimesPawword>&cam=3&format=mjpeg für mjpeg ausgabe
da die jpeg Ausgabe mit diesem script nicht funktionierte habe ich es noch mit einem ganz einfachen script probiert dieser sieht folgendermassen aus:
damit bekomme ich ein jpeg bild ausgegeben. Dieses konnte ich auch problemlos in meine Hausautomation einbinden, nur leider mit dem kleinen ünerwünschten nebeneffect: dadurch das das camerabild jetzt alle 0,5 sekunden von Neo AIO software abgefragt wird und die SS dies vermutlich nicht so schnell ausgeben kann habe ich immer bildabbrüche.
Bei den Foscam cameras funktioniert das so allerdings sehr gut. Geschieht die abfrage allerdings auch über eine sessionID ähnlich wie in meinem ersten script oben wo ich allerdings keine jpeg ausgabe bekomme.
soviel erst einmal um das alles zu verstehen ich hoffe ich konnte es einigermassen nachvollziehbar erklären.
ich habe folgendes vor:
ich betreibe eine Surveillancestation mit 8 Kameras. 4 von dieser Kameras (foscam) haben einen eigenen webserver auf dem man Mjpeg streams und Jpeg snapshots abfragen kann.
Die anderen kameras sind einfache ONVIV kams die nur einen RTSP stream zur verfügung stellen.
Deshalb wollte ich gerne über die Surveillancestation einen Mjpeg stream und Jpeg snapshots von diesen kameras abfragen um diese dann mir in meine hausautomationssoftware zu integrieren.
Ich bin jetzt schon soweit das ich einen sauberen Mjpeg stream von der SS bekomme und diesen im Webbrowser sauber angezeigt bekomme. Leider kann das Camera tool meiner Haussautomationssoftware (mediola NEO AIO) diese Bildausgabe nicht verarbeiten.
Deshalb wollte ich es jetzt mal über die jpeg ausgabe von einem snapshot versuchen, leider gibt mir das script aber kein jpeg bild aus, irgendwo muss noch ein fehler sein den ich aber leider nicht finden kann.
hier mal das script welches ich verwende der Aufruf erfolgt einfach über folgende URL:
http://<IP der SS>/webcam.php?usr=<CAMuser>&pwd=<MeinGeheimesPawword>&cam=3&format=jpeg für die jpeg ausgabe und
http://<IP der SS>/webcam.php?usr=<CAMuser>&pwd=<MeinGeheimesPawword>&cam=3&format=mjpeg für mjpeg ausgabe
PHP:
<?php
$ip = "192.168.10.100"; // IP-Adresse eures Synology-NAS
$port = "5000"; // default Port der Surveillance Station
// **********************************************************************************
// Anmelden an der Surveillance Station und sid zurückgeben
// **********************************************************************************
function getSid($user, $pass, $ip, $port) {
$link_login = 'http://' . $ip . ':' . $port . '/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account=' . $user . '&passwd=' . $pass . '&session=SurveillanceStation&format=sid';
// Eventuell müsst ihr die URLs von HTTP auf HTTPS anpassen, sofern ihr HTTPS aktiviert habt!
// Authentifizierung an Synology Surveillance Station WebAPI und auslesen der SID
$json = file_get_contents ( $link_login );
$obj = json_decode ( $json, true );
@$sid = $obj ["data"] ["sid"];
return $sid;
}
// **********************************************************************************
// Link für MJPEG von Surveillance Station lesen
// **********************************************************************************
function getStreamLink($user, $pass, $ip, $port, $cameraID) {
$sid = getSid ( $user, $pass, $ip, $port );
$link_stream = 'http://' . $ip . ':' . $port . '/webapi/SurveillanceStation/videoStreaming.cgi?api=SYNO.SurveillanceStation.VideoStream&version=1&method=Stream&cameraId=' . $cameraID . '&format=mjpeg&_sid=' . $sid;
return $link_stream;
}
// **********************************************************************************
// Link für JPEG von Surveillance Station lesen
// **********************************************************************************
function getImageLink($user, $pass, $ip, $port, $cameraID) {
$sid = getSid ( $user, $pass, $ip, $port );
$link_image = 'http://' . $ip . ':' . $port . '/webapi/entry.cgi?camStm=1&version=8&cameraId=' . $cameraID . '&api="SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot&_sid=' . $sid;
return $link_image;
}
// **********************************************************************************
// MJPEG Stream von Surveillance Station ausgeben
// **********************************************************************************
function printStream($user, $pass, $ip, $port, $cameraID) {
$link_stream = getStreamLink ( $user, $pass, $ip, $port, $cameraID );
set_time_limit ( 60 );
$r = "";
$i = 0;
$boundary = "\n--myboundary";
$new_boundary = "newboundary";
$f = fopen ( $link_stream, "r" );
if (! $f) {
// **** cannot open
print "error";
} else {
// **** URL OK
header ( "Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0" );
header ( "Cache-Control: private" );
header ( "Pragma: no-cache" );
header ( "Expires: -1" );
header ( "Content-type: multipart/x-mixed-replace;boundary={$new_boundary}" );
while ( true ) {
while ( substr_count ( $r, "Content-Length:" ) != 2 ) {
$r .= fread ( $f, 32 );
}
$pattern = "/Content-Length\:\s([0-9]+)\s\n(.+)/i";
preg_match ( $pattern, $r, $matches, PREG_OFFSET_CAPTURE );
$start = $matches [2] [1];
$len = $matches [1] [0];
$end = strpos ( $r, $boundary, $start ) - 1;
$frame = substr ( "$r", $start + 2, $len );
print "--{$new_boundary}\n";
print "Content-type: image/jpeg\n";
print "Content-Length: ${len}\n\n";
print $frame;
usleep ( 40 * 1000 );
$r = substr ( "$r", $start + 2 + $len );
}
}
fclose ( $f );
}
// **********************************************************************************
// JPEG Image von Surveillance Station ausgeben
// **********************************************************************************
function printImage($user, $pass, $ip, $port, $cameraID) {
$link_image = getImageLink ( $user, $pass, $ip, $port, $cameraID );
$image = file_get_contents ( $link_image );
// header ( "Cache-Control: no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0" );
// header ( "Cache-Control: private" );
// header ( "Pragma: no-cache" );
// header ( "Expires: -1" );
// header ( "Content-type: image/jpeg" );
// header ( "Content-Length: " . ( string ) (filesize ( $image )) );
print $image;
}
// **********************************************************************************
// Stream als MJPEG ausgeben
// http://nas-stueben.goip.de/webcam.php?usr=<benutzername>&pwd=<passwort>&cam=<1|2|...>&format=<mjpeg|jpeg>
// **********************************************************************************
$user = $_GET ["usr"]; // Synology Benutzer mit Berechtigung die Kamera anzuzeigen
$pass = $_GET ["pwd"]; // Passwort zu eben eingegebenem Benutzer
$cameraID = $_GET ["cam"]; // ID der Kamera, welche angezeigt werden soll
$format = $_GET ["format"]; // format = jpeg für Image oder mjpeg für Stream
if (strtolower ( $format ) == "jpeg") {
printImage ( $user, $pass, $ip, $port, $cameraID );
} else {
printStream ( $user, $pass, $ip, $port, $cameraID );
}
?><?php
/**
* Created by PhpStorm.
* User: filliboy
* Date: 01.03.17
* Time: 20:44
*/
da die jpeg Ausgabe mit diesem script nicht funktionierte habe ich es noch mit einem ganz einfachen script probiert dieser sieht folgendermassen aus:
PHP:
<?php
// Configuration
$user = "camuser"; // Synology username with rights to Surveillance station
$pass = "MeinGeheimesPassword"; // Password of the user entered above
$ip = "192.168.10.100"; // IP-Adress of your Synology-NAS
$port = "5000"; // default port of Surveillance Station
$http = "http"; // Change to https if you use a secure connection
$cameraID = "3"; // ID of the camera for taking snapshots
$cameraStream = $_GET["stream"];
// You can change the stream by adding ?stream=0/1/2 to the url. For example: www.yourdomain.com/snapshot.php?stream=2
// 0: Live stream | 1: Recording stream | 2: Mobile stream
// Default value is stream 0
if ($cameraStream == NULL) {
$cameraStream = "0";
}
// Authenticate with Synology Surveillance Station WebAPI and get our SID
$json = file_get_contents($http.'://'.$ip.':'.$port.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=3&account='.$user.'&passwd='.$pass.'&session=SurveillanceStation&format=sid');
$obj = json_decode($json, true);
@$sid = $obj["data"]["sid"];
// Setting the correct header so the PHP file will be recognised as a JPEG file
header('Content-Type: image/jpeg');
// Read the contents of the snapshot and output it directly without putting it in memory first
readfile($http.'://'.$ip.':'.$port.'/webapi/entry.cgi?camStm='.$cameraStream.'&version=3&cameraId='.$cameraID.'&api=SYNO.SurveillanceStation.Camera&preview=true&method=GetSnapshot&_sid='.$sid);
// Log out from Surveillance Station
file_get_contents($http.'://'.$ip.':'.$port.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Logout&version=3&session=SurveillanceStation&_sid='.$sid);
?>
/**
* Created by PhpStorm.
* User: filliboy
* Date: 02.03.17
* Time: 23:12
*/
damit bekomme ich ein jpeg bild ausgegeben. Dieses konnte ich auch problemlos in meine Hausautomation einbinden, nur leider mit dem kleinen ünerwünschten nebeneffect: dadurch das das camerabild jetzt alle 0,5 sekunden von Neo AIO software abgefragt wird und die SS dies vermutlich nicht so schnell ausgeben kann habe ich immer bildabbrüche.
Bei den Foscam cameras funktioniert das so allerdings sehr gut. Geschieht die abfrage allerdings auch über eine sessionID ähnlich wie in meinem ersten script oben wo ich allerdings keine jpeg ausgabe bekomme.
soviel erst einmal um das alles zu verstehen ich hoffe ich konnte es einigermassen nachvollziehbar erklären.