Synology Surveillance Station Videostream in MJPEG wandeln

Synology Surveillance Station Videostream in MJPEG wandeln

eingetragen in: Synology | 32

Gerade die günstigen Webcams bieten häufig keinen MJPEG Stream an. Da kann man sich glücklich schätzen, wenn man Besitzer eine Synology NAS ist. Als erstes sind die Pakete  „Surveillance Station“, „Web Station“ und „PHP 5.6 oder höher“ auf der NAS zu installieren. Anschließend ist die Webcam in der Surveillance Station einzubinden.

Bevor es aber los geht, hier kurz erklärt was MJPEG ist:

Bei Motion JPEG (MJPEG) handelt es sich um ein Videocodec, bei dem jedes Einzelbild des Videostreams separat als JPEG-Bild komprimiert im MJPEG gespeichert wird. Mann kann sich das als aneinander gereihte JPEGs in einer nicht endenden Datei vorstellen.

Sobald man die Webcam in der Surveillance Station konfiguriert hat, ist das PHP Skript auf der Webstation in dem Verzeichnis /volume1/web/ mit dem Namen webcam.php zu kopieren. Alternativ kann das PHP Script auch auf jedem anderen Webserver im Internet bzw. Intranet liegen, vorausgesetzt es besteht eine Internetverbindung zur NAS.

Nur die ersten Zeilen im Skript sind anzupassen, unter $ip ist die IP-Adresse oder der Hostname sowie unter $port der Port der NAS einzutragen. Diese Informationen werden aus Sicherheitsgründen nicht beim Aufruf des Skriptes mitgeben.

Das PHP Skript greift über die Surveillance Station WebAPI v2.0 auf den Webcam Stream der Surveillance Station zu und wandelt diesen in das MJPEG Format um und zeigt dann das MJPEG im Webbrowser. Das Bild erneuert sich alle paar Sekunden.

Das Skript folgendermaßen aufrufen:

http://webserver/webcam.php?usr=<benutzername>&pwd=<passwort>&cam=<1|2|...>&format=<mjpeg|jpeg>

 

 

Die Variablen sind wie folgt zu füllen:

Variable Wert
usr Benutzername
(am besten einen Benutzer in der Surveillance Station mit wenig Berechtigungen anlegen)
pwd Passwort (Passwort des Benutzers)
cam 1,2,3,4 oder … (die ersten konfigurierte Webam ist 1 die zweite 2 usw.)
format jpeg für eine einzelnes Bild oder mjpeg für einen jpeg Stream

 

Beispiel:

http://nas-stueben.goip.de/webcam.php?usr=thorsti&pwd=geheim&cam=2&format=mjpeg

Wer möchte kann aber auch den Variablen $user, $pass und $cameraID im Skript direkt Werte zuweisen. Dann ist das Passwort in der URL nicht sichtbar! Download

Jetzt kann man noch in dem Webstation Verzeichnis /volume1/web/ ein Unterverzeichnis webcam anlegen (/volume1/web/webcam) und dort die Datei .httaccess anlegen. Da das Passwort für den Webam Benutzer in der Datei hinterlegt ist, sollten die entsprechenden Berechtigungen für die Datei .httaccess gesetzt sein.

bis Apache 2.2:

ab Apache 2.4:

 

Jetzt könnt Ihr die Webcam wie folgt aufrufen:

32 Antworten

  1. Denis Fillweber
    | Antworten

    Hallo Thorsten!
    danke für das schöne howto!
    leider funktioniert das bei mir nicht! wenn ich php script auf dem webserver abgelegt habe, und diesen dann über deine Url ( http://192.168.10.100/webcam.php?usr=filliboy&pwd=meingeheimespassword&cam=<2&format= ) aufrufe bekommen ich immer nur das script selber im webbrowser angezeigt. Aber leider kein bild oder stream der camera.

    hast du evtl eine Idee woran das liegen mag

    Webstation und PHP sind installiert und laufen.

    gruß Denis

  2. Denis Fillweber
    | Antworten

    Hatte eben das format nicht mit kopiert! Das hatte ich natürlich auch mit angegeben!
    ( http://192.168.10.100/webcam.php?usr=filliboy&pwd=meingeheimespassword&cam=<2&format=mjpeg )

  3. Stübi
    | Antworten

    Erstelle mal ein PHP Script mit Namen phpinfo.php und folgendem Inhalt:

    < ?php phpinfo(); ?>

    Wird das Script richtig ausgeführt?

  4. Denis Fillweber
    | Antworten

    Danke für die schnelle Antwort!

    Folgendes bekomme ich ausgegeben wenn ich die phpinfo aufrufe:

    {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf820 {\fonttbl\f0\fnil\fcharset0 Monaco;} {\colortbl;\red255\green255\blue255;\red184\green14\blue61;\red247\green238\blue241;} {\*\expandedcolortbl;;\cssrgb\c78039\c14510\c30588;\cssrgb\c97647\c94902\c95686;} \paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0 \deftab720 \pard\pardeftab720\partightenfactor0 \f0\fs21\fsmilli10800 \cf2 \cb3 \expnd0\expndtw0\kerning0 }

    ist das richtig ausgeführt?

  5. Denis Fillweber
    | Antworten

    Hallo, nochmal ich!
    Habe das script jetzt noch mal in einem anderen scripteditor bearbeitet und gespeichert, jetzt läuft es zum teil.
    mit der mjpeg URL bekomme ich ein bild bei der jpeg URL leider nicht. Genau diese bräuchte ich aber um die camera in meine hausautomation mit einzubinden.
    wenn ich die jpeg URL im firefox öffne bekomme ich die fehlermeldung die grafik kann nicht angezeigt werden da sie fehler enthält.

    muss ich da im script noch was ändern?

    • thorsten
      | Antworten

      ich schaue morgen einmal

  6. Filli
    | Antworten

    Super! Danke dir!

    • thorsten
      | Antworten

      Hi Filli,
      funktioniert es jetzt mit dem JPEG Stream? Ich kann keinen Fehler im PHP Skript entdecken. Echt merkwürdig.
      Gruß
      Thorsten

      • filliboy
        | Antworten

        nein leider noch nicht, aber ich werde mich heute auch noch mal ran setzen, denn bei Olli funktioniert es ja auch.
        also muss der Fehler irgendwo bei mir liegen!

  7. Olli
    | Antworten

    Hi Thorsten,

    ich habs soweit laufen nur bekomme ich die .htaccess datei nicht zum laufen, bzw. die ReWrite Conditions.
    Das Format der Datei stimmt wohl, aber es kommt immer ein 404.

    Noch ne idee?

    • thorsten
      | Antworten

      Hi Olli,
      hast Du Apache als Webserver im Einsatz? Damit läuft es bei mir.
      VG

    • thorsten
      | Antworten

      Oli, ich habe eben festgestellt, dass die .httaccess unter Apache 2.4 etwas anders aussieht. Ich habe die Beschreibung entsprechend angepaßt!

  8. Denis Fillweber
    | Antworten

    Hi Olli,

    Funktioniert bei die auch die Jpeg Ausgabe? oder auch nur die Mjpeg streams? Bei mir ist es so das ich nur die Mjpeg streams abfragen kann, bei den jpeg abfragen bekomme ich leider kein Bild. Hast du das Problem auch und hast es evtl. schon gelöst?

    Gruß Denis

  9. Denis Fillweber
    | Antworten

    Noch eine Frage ist es evtl. auch möglich sich den mjpeg stream scaliert ausgeben zu lassen? Dann könnte ich auch diesen super in meine Hausautomation mit einbauen! Das hätte auch den vorteil das da Bild nicht so stocken würde wie wenn ich als sekündlich als jpeg abfragen würde!
    Ich habe auch schon getestet ob ich so in meiner hausautomation ein bild bekomme wenn ich den stream als websiteelement mit einbinde.
    Das funktioniert einwandfrei nur leider ist der Stream viel zu groß für meine automationsoberfläche. Deshalb auch die frage ob man den mjpeg stream auch scaliert ausgeben lassen kann?

  10. Olli
    | Antworten

    Ich check das später nochmal. Kam am WE nicht dazu. Aber ich meine auch das nur die mjpeg ausgabe funktioniert hat. Nur leider bekomme ich das nicht mit der htaccess Datei hin.

  11. Olli
    | Antworten

    Hi, also bei mir läuft auch die jpeg variante.

  12. Olli
    | Antworten

    So, hab Apache 2.2 installiert damit läuft alles. Danke !

  13. Alex01
    | Antworten

    Hallo zusammen,

    irgendwie will es bei mir nicht…

    Habe auf meiner DS frisch die Webstation und php 5.6 installiert. Benutze die Standart-Einstellungen.
    Wenn ich die phpinfo schreibe und aufrufe bekomme ich folgende Ausgabe: „“
    Wenn ich das Kamerascript ausführe, bekomme ich nur die Eieruhr und die CPU-Last der DS geht gewaltig hoch.

    Was habe ich übersehen?

    Danke für Eure Hilfe!!

  14. Alex01
    | Antworten

    Jetzt kam noch eine Fehlermeldung:

    Fatal error: Maximum execution time of 60 seconds exceeded in /volume1/web/webcam.php on line 68

  15. Boris
    | Antworten

    Hallo,

    vielen Dank für die tolle Anleitung. Funktioniert bei mir einwandfrei! 🙂

    Viele Grüße

  16. Filli
    | Antworten

    Hi Olli!
    Danke für die Info! Dann muss der Fehler doch irgendwo bei mir liegen! Ich werde mal weiter recherchieren! Verstehe einfach nicht warum das eine funktioniert und jpeg nicht!

  17. Alex01
    | Antworten

    Ich verzweifle…

    Ich habe eine neue DS216j gekauft, alles neu aufgesetzt und dennoch bekomme ich das Script nicht an’s laufen.

    Ich habe den Verdacht, das was mit meiner Webcam.php nicht stimmt… könnte jemand von Euch eine Funktionierende Datei hochladen?

    Vielleicht hilft das…

    Danke!

    • thorsten
      | Antworten

      Hi Alex,
      hier das webcam.php Script zum downloaden.
      http://www.stueben.de/wp-content/uploads/2017/03/webcam.zip
      Gruß
      Stübi

      • Alex01
        | Antworten

        Vielen Dank!

        Leider keine Änderung am Zustand… also bin ich nicht nur zu blöd für copy&paste.

        Ich bekomme immer einen Error 500…

      • Alex01
        | Antworten

        Was auch immer passiert ist… jetzt beim fünften Versuch geht es!

        Großartig, vielen Dank!

        • thorsten
          | Antworten

          perfekt! super!

  18. Björn
    | Antworten

    Ich kann mich nach ein paar tagen nicht mehr auf der Synology anmelden. Es kommt als Meldung der Speicher wäre voll und ich soll die Diskstation Neustarten.

    • thorsten
      | Antworten

      Und was passiert wenn du die NAS neu startest?

      • Björn
        | Antworten

        Das Nas braucht sehr lange zum Neustarten. Danach geht wieder alles bis es nach ein paar Tagen wieder zu der Meldung kommt.

  19. Steffen
    | Antworten

    Hallo erstmal und vielen Dank für diesen Blog.
    Das Originalskript läuft wunderbar (nach Anfangsschwierigkeiten 🙂
    Ich habe versucht das ausgegebene Bild zu skalieren, da das FritzFon (nur eine Auflösung von 240X320 Bildpunkten hat und mit dem FullHD Bild nicht klar kommt, Nachdazu soll eben aus gewisser Bildbereich ausgegeben werden. Hierzu habe ich folgenden Teil in das Skript kopiert:

    // Bild laden
    $thumb = imagecreatetruecolor(240,320);

    // Skalieren
    imagecopyresized($thumb, $image, 0, 0, 500, 250, 240, 320, 240, 320);

    // Ausgabe
    imagejpeg($thumb);

    print $thumb;

    Aber das hatte ich mir wohl zu leicht vorgestellt, denn dies funktionert leider nicht mehr. Für einen Tipp bin ich sehr dankbar.

    Gruß Steffen

  20. Sigi
    | Antworten

    Hi,

    ich habe ein Problem, vielleicht können Sie mir helfen…

    Habe eine DS 213+ und PHP 7.0 und Apache 2.4.

    ich bekomme das PHP Skript nicht ans Laufen…

    Kommt die Fehlermeldung ( 500 ) Bei der Verarbeitung dieser Anforderung ist ein Fehler aufgetreten.

    Vermutlich liegt es nur an einer winzigen Fehleinstellung. Was könnte ich noch prüfen ?

    Grüße

    Sigi

  21. Sigi
    | Antworten

    OK jetzt klappt es, habe noch ein wenig mit den Einstellungen auf der SYNO gespielt.. Keine Ahnung wo der Fehler lag, Hauptsache es klappt jetzt…., VIELEN DANK für den tollen Beitrag 🙂

Kommentar verfassen