Surveillance Station Mjpeg stream und jpeg Snapshot über web API abfragen

filliboy

Benutzer
Mitglied seit
04. Mrz 2017
Beiträge
2
Punkte für Reaktionen
0
Punkte
0
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

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.
 

filliboy

Benutzer
Mitglied seit
04. Mrz 2017
Beiträge
2
Punkte für Reaktionen
0
Punkte
0
Jetzt meinen Fragen:

warum bekommen ich mit meinem unterem ein jpeg bild geliefert in dem oberen script mit sessionID allerdings nicht?

Und kann es sein das die bildaussetzter in dem 2. script damit zu tun haben das ich mir hier nicht mit einer sessionID anmelde und sich das Script dadurch für jedes einzeln angeforderte bild wieder neu an SS anmelden muss?

was mir noch einfällt.
ich konnte den mjpeg stream auch in NEO AIO einfügen, alleredings nur als website element, dann hatte ich auch ein bild! aber leider so groß das ich immer nur ein bildauschnitt zu sehen bekam. Hier ist das Problem das man in NEO AIO Camera elemente auf die gewüschte grösse skaliert werden website elemete allerdings nicht. Grrrr....
 

Placebo

Benutzer
Mitglied seit
30. Jan 2011
Beiträge
112
Punkte für Reaktionen
0
Punkte
16
Ich klinke mich hier mal ein da ich keinen aktuelleren Thread finde und nicht extra einen neuen eröffnen will.

Mein "Problem" wäre, dass meine Kamera (Hikvision S6) von sich aus nur über rtsp und onvif ansprechbar ist - und nur einen h264 Stream ausgibt. Soweit so gut, meine Alarmanlage mag aber nur mjpeg Streams.
Mein Gedanke war nun dass ich einen solchen ja eventuell von der SS abgreifen könnte. Dazu müsste diese aber natürlich den Eingangsstream in einen mjpeg Stream konvertieren.
Mit obigem Skript bekomme ich kein Bild. Das Skript macht was es soll, aber wo kein jpeg, nun, da kein jpeg. Oder verstehe ich hier etwas gänzlich falsch?

Grüße
 

t_heinrich

Benutzer
Mitglied seit
12. Sep 2014
Beiträge
117
Punkte für Reaktionen
1
Punkte
18
Genau so etwas suche ich auch.
Meine Heimautomatisierungssoftware erwartet eine MJPG Stream.

Im Idealfall gibt es eine Art Addon, die aus der SS heraus einen MPJEG Stream zur Verfügung stellt.
 

Matis

Benutzer
Mitglied seit
28. Mai 2015
Beiträge
735
Punkte für Reaktionen
9
Punkte
44
Die Hikvsions haben doch drei streams. Ich nutze den ersten H264 volle Auflösung, Substream mjpeg geringe Auflösung, dritter stream H264 geringe Auflösung. So habe ich zwei H264 streams für geringe und hochauflösende Anzeige und einen mjpeg stream für die Hausautomation. Dann funtzt auch das obige Script um ein Bild auf eine Webseite zu bekommen.
 

t_heinrich

Benutzer
Mitglied seit
12. Sep 2014
Beiträge
117
Punkte für Reaktionen
1
Punkte
18
In meinem Fall habe ich u.a. eine Doorbird und die liefert zeitgleich nur einen Stream.
 

laley

Benutzer
Mitglied seit
08. Jan 2013
Beiträge
80
Punkte für Reaktionen
3
Punkte
8
Wie sieht denn dann die URL aus wenn ich Stream 2 (MJPEG) verwenden möchte?

Ich habe "?stream=2" in die URL an verschiedenen Stellen eingefügt, erhalte aber die Browser Ausgabe:
{"error":{"code":101},"success":false}
 

Pezi1978

Benutzer
Mitglied seit
05. Dez 2020
Beiträge
2
Punkte für Reaktionen
0
Punkte
1
Mjpeg Stream der Synology für Kamera ID 6:
rot ist entsp anzupassen!

IP:5000/webapi/entry.cgi?api=SYNO.SurveillanceStation.Stream.VideoStreaming&version=1&method=Stream&format=mjpeg&cameraId=6&StmKey=%22DeinKey%22
 

t_heinrich

Benutzer
Mitglied seit
12. Sep 2014
Beiträge
117
Punkte für Reaktionen
1
Punkte
18
Hallo,
vielen Dank für die Links, irgendwie will es aber nicht klappen.
Dummerweise schmeißt der VLC (damit teste ich es) keine detaillierte Fehlermeldung, was die Fehlersuche ziemlich schwierig macht.

Gruß Thomas
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat