Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. [HowTo] rtsp mit ffmpeg für vis konvertieren

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [HowTo] rtsp mit ffmpeg für vis konvertieren

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      eastcoast last edited by Jey Cee

      Hallo,

      da der Stream meiner IP-Kamera nicht direkt (ohne Browser Plugins etc.) dargestellt werden kann

      und mir eine Lösung via Interval-Snapshots nicht gefiel,

      und mir der Umweg mit iSpy oder Xeoma zu Resourcen-Hungrig war,

      habe ich mittels ffserver und ffmpeg eine anderen Weg gefunden.

      Folgend eine Kurzanleitung für Debian 8, für Ubuntu oder Raspberry sollte es ähnlich funktionieren.

      1. ffmpeg installieren:

      Downloadquelle für ffmpeg in /etc/apt/sources.list hinzufügen (ggf. Mirror anpassen):

      deb http://ftp.at.debian.org/debian jessie-backports main
      
      

      Anschließend installieren:

      apt-get update
      apt-get install ffmpeg
      
      
      1. ffserver konfigurieren:

      Die Originaldatei /etc/ffserver.conf bei Bedarf sichern

      und eine neue Datei /etc/ffserver.conf mit folgendem Inhalt anlegen:

      
      HTTPPort 8090
      HTTPBindAddress 0.0.0.0
      MaxHTTPConnections 200
      MaxClients 100
      MaxBandwidth 4096
      CustomLog -
      ########################################
      # IP camera feed...
      <feed ipcam1.ffm>
       File /tmp/ipcam1.ffm
       FileMaxSize 1M
       ACL allow 127.0.0.1
      </feed> 
      ########################################
      # Streams...
      <stream ipcam1.mjpg>
       Feed ipcam1.ffm
       Format mpjpeg
       VideoQMin 1
       VideoQMax 4
       VideoFrameRate 10
       VideoSize 480x390
       VideoBufferSize 1024
       VideoBitRate 1024
       NoAudio
       Strict -1</stream> 
      <stream ipcam1.jpg>
       Feed ipcam1.ffm
       Format jpeg
       Qscale 2
       VideoFrameRate 2
       VideoSize 704x576
       VideoIntraOnly
       NoAudio
       NoDefaults
       Strict -1</stream> 
      <stream status.html>
      # Server status URL
         Format status
         # Only allow local people to get the status
         ACL allow 192.168.1.0 192.168.1.255</stream> 
      <redirect index.html>
      # Just an URL redirect for index
         # Redirect index.html to the appropriate site
         URL http://www.ffmpeg.org/
      </redirect> 
      

      Damit wird ein mpjpeg-Stream (für Live Video) und ein einfacher jpg-Stream (für Snapshots) vorbereitet.

      Diese können bei laufendem ffserver mit folgenden URL's angezeigt werden:

      http://192.168.1.xxx:8090/ipcam1.mjpg

      http://192.168.1.xxx:8090/ipcam1.jpg

      Die IP Adresse ist Exemplarisch und muss natürlich angepasst werden!

      Hier können je nach Bedarf Anpassungen vorgenommen werden, weitere Infos auf der ffmpeg Homepage.

      Der ffserver status ist über folgende URL verfügbar:

      http://192.168.1.xxx:8090/status.html

      1. ioBroker Script zum Starten/Stoppen von ffmpeg:

      Ich verwende ein Javascript womit ich ffserver einmalig starte und

      ffmpeg nur bei Bedarf einfach über einen State starte und stoppe um keine unnötige CPU Last zu erzeugen.

      Außerdem wird ffmpeg automatisch neu gestartet wenn es unerwartet beendet wird (z.B. Stream Abbruch).

      Alternativ kann man natürlich auch ffserver und ffmpeg über das Betriebssystem automatisch starten lassen.

      Ich habe in meiner Kamera einen Sub-Stream als MJPEG mit einer Auflösung von 704x576 und FPS=10 konfiguriert.

      Prinzipiell sollte jeder Stream funktionieren, die Performance ist jedoch mit einer niedrigen Auflösung und FPS besser.

      Im folgenden Script muss nur die IP-Kamera Stream Adresse (rtsp://user:user@192.168.1.yyy:554/cam/realmonitor?channel=1&subtype=2) angepasst werden.

      // **********************************************************************
      // Settings
      var ffserverStartCmd = "/usr/bin/ffserver &";
      var ffserverStopCmd  = "killall ffserver";
      var ffmpegStartCmd   = "ffmpeg -i \"rtsp://user:user@192.168.1.yyy:554/cam/realmonitor?channel=1&subtype=2\" http://localhost:8090/ipcam1.ffm";
      var ffmpegStopCmd    = "killall ffmpeg";
      // **********************************************************************
      // States
      var path = "ffmpegCam.";
      var idRun = path + "run";
      createState(idRun, false, {
         name: "Control ffmpeg start/stop for IP camera",
         type: "boolean",
      });
      var idCntRestart  = path + "statistics.cntRestart";
      createState(idCntRestart, 0, {
         name: "Count of restarts",
         type: "number",
      });
      var idLastRestart = path + "statistics.lastRestart";
      createState(idLastRestart, 0, {
         name: "Last restart",
         type: "string",
         role: "value.datetime",
      });
      // **********************************************************************
      // Variables
      var idTimeout = null;
      // **********************************************************************
      // Functions
      function ffserverStop() {
         console.log("ffserver stop...");
         exec(ffserverStopCmd, function(err, stdout, stderr) {
             if (err) {
                 console.log("ffserver stop failed: " + stderr);
             } else {
                 console.log("ffserver stopped: " + stdout);
             }
         });
      }
      function ffserverStart() {
         console.log("ffserver start...");
         exec(ffserverStartCmd, function(err, stdout, stderr) {
             if (err) {
                 console.log("ffserver error: " + stderr);
             }
         });
      }
      function ffmpegStop() {
         if (idTimeout) {
             // clear existing timeout
             clearTimeout(idTimeout);      
             idTimeout = null;
         }
         console.log("ffmpeg stop...");
         exec(ffmpegStopCmd, function(err, stdout, stderr) {
             if (err) {
                 console.log("ffmpeg stop failed: " + stderr);
             } else {
                 console.log("ffmpeg stopped: " + stdout);
             }
         });
      }
      function ffmpegStart() {
         if (idTimeout) {
             // clear existing timeout
             clearTimeout(idTimeout);      
             idTimeout = null;
         }
         console.log("ffmpeg start...");
         exec(ffmpegStartCmd, function(err, stdout, stderr) {
             if (err) {
                 console.log("ffmpeg error: " + stderr);
             } else {
                 console.log("ffmpeg returned: " + stdout);
             }
             // Automatic restart if run state is set
             if (getState(idRun).val === true) {
                 console.log("ffmpeg has exited unexpected! Restart in 30s!");
                 idTimeout = setTimeout(ffmpegRestart, 30000);
             }
         });
      }
      function ffmpegRestart() {
         // current date and time
         var dateTime = new Date().toLocaleString();    
         setState(idLastRestart, dateTime);
         // update counter
         var count = getState(idCntRestart).val;
         count = count + 1;
         setState(idCntRestart, count);
         // ffmpeg
         ffmpegStop();
         ffmpegStart();
      }
      on({id: "javascript.0." + idRun}, function(obj) {
         console.log("Run state changed from " + obj.oldState.val + " to " + obj.state.val);
         if (obj.state.val === true) {
             if (obj.oldState.val ===false) {
                 console.log("Start ffmpeg...");
                 ffmpegStart();
             }
         }
         else {
             console.log("Stop ffmpeg...");
             ffmpegStop();
         }
      });
      // stop
      onStop(function() {
         console.log("Script stopped!");
         ffmpegStop();
         ffserverStop();
      }, 1000);
      // initial start
      setTimeout(start, 500);
      function start() {
         ffserverStart();
      }
      
      1. Darstellung in vis:

      Zum Anzeigen des neuen Streams einfach ein iFrame Widget einfügen,

      unter den Widget-Einstellungen Allgemein/Quelle die ffserver Stream Adresse eintragen (http://192.168.1.xxx:8090/ipcam1.mjpg)

      und unter CSS/Allgemein die Größe entsprechend der ffserver.conf eintragen (hier im Beispiel width=480px, height=390px).

      1. ffmpeg starten:

      Für Testzwecke kann ffmpeg mit dem neuen State ffmpegCam.run=true gestartet und mit ffmpgeCam.run=false gestoppt werden.

      Dies kann natürlich auch manuell über ioBroker.admin/Objekte/javascript.0/fffmpegCam/run erfolgen.

      Ich starte/stoppe ffmpeg nur bei Bedarf über ein anderes Script welches einfach prüft, ob mein Kamera-View aktiv ist und den State entsprechend setzt.

      Außerdem schalte ich beim Klingeln an der Tür automatisch auf den Kamera-View (dieser startet ffmpeg) und

      erstelle von dem ffserver jpg-Stream (http://192.168.1.xxx:8090/ipcam1.jpg) drei Snapshots welche ich per E-Mail versende.

      Viel Spaß damit 😉

      1 Reply Last reply Reply Quote 2
      • bahnuhr
        bahnuhr Forum Testing Most Active last edited by

        Hallo eastcost,

        funktioniert das auch auf einem win7 rechner ?

        mfg

        1 Reply Last reply Reply Quote 0
        • E
          eastcoast last edited by

          @bahnuhr:

          funktioniert das auch auf einem win7 rechner ? `
          Theoretisch könnte es funktionieren da es ffmpeg und ffserver auch für Windows gibt,

          im Skript müssten natürlich auch die entsprechenden Aufrufe angepasst werden…

          ...viel weiter kann ich Dir dazu aber leider auch nicht helfen.

          1 Reply Last reply Reply Quote 0
          • B
            balear59 last edited by

            Hallo eastcost,

            in welcher Zeile wird dem FFmserver eigentlich die ip-Adresse der Kamera mitgeteilt?

            in dieser Zeile "deb http://ftp.at.debian.org/debian jessie-backports main" bekomme ich immer einen Fehlet wegen eine public keys.

            Muss die Zeile Httpbind 0.0.0.0 geändert werden?

            viel Spass noch

            Jens

            1 Reply Last reply Reply Quote 0
            • E
              enricoh831 last edited by

              Ich hatte mich gestern zufällig mit Kameras und dem Pi auseinander gesetzt. Dabei bin ich auf das Programm Motion getroffen. Damit kann man zum Beispiel auch IP Kameras die keine Bewegungsmeldung können. Damit nachrüsten und diese auch weiter streamen

              Gesendet von meinem Pixel mit Tapatalk

              1 Reply Last reply Reply Quote 0
              • Lenny.CB
                Lenny.CB Most Active last edited by

                auf welcher Hardware hast du das laufen?

                Kann man damit auch die Streams/Snapshots speichern oder werden die "nur" bereit gestellt?

                1 Reply Last reply Reply Quote 0
                • E
                  enricoh831 last edited by

                  Hab es nicht laufen. Wollte für mein Büro eine versteckte Kamera basteln.

                  Und hab dann das hier gefunden

                  https://klenzel.de/3691

                  Gesendet von meinem Pixel mit Tapatalk

                  1 Reply Last reply Reply Quote 0
                  • E
                    eastcoast last edited by

                    @balear59:

                    in welcher Zeile wird dem FFmserver eigentlich die ip-Adresse der Kamera mitgeteilt? `
                    Die IP Adresse der Kamera wird im Javascript angegeben, siehe oben bei Punkt 3)

                    @balear59:

                    in dieser Zeile "deb http://ftp.at.debian.org/debian jessie-backports main" bekomme ich immer einen Fehlet wegen eine public keys. `
                    Je nach Linux System ist die Installation ggf. anders, hierzu einfach googlen wie die ffmpeg Installation für das jeweilige System zu erfolgen hat.

                    @balear59:

                    Muss die Zeile Httpbind 0.0.0.0 geändert werden? `
                    Nein, das hat damit nichts zu tun.

                    1 Reply Last reply Reply Quote 0
                    • B
                      balear59 last edited by

                      Hallo eastcoast,

                      vielen Dank für die Antwort.

                      mit "ffmpeg -i "rtsp://192.168.178.yyyy/11/ucast" http://localhost:8090/ipcam1.ffm"; im Script bekomme ich den Server zum laufen.

                      Dies ist jetzt die Anzeige mit http://192.168.178.yyyy:8090/status.html

                      ffserver Status

                      Available Streams

                      Path Served

                      Conns

                      bytes Format Bit rate

                      kbit/s Video

                      kbit/s

                      Codec Audio

                      kbit/s

                      Codec Feed

                      ipcam1.mjpg 0 0 mpjpeg 1024 1024 mjpeg 0 ipcam1.ffm

                      ipcam1.jpg 0 0 singlejpeg 200 200 mjpeg 0 ipcam1.ffm

                      status.html 2 1944 - - - -

                      index.html 0 0 - - - -

                      Feed ipcam1.ffm

                      Stream type kbit/s codec Parameters

                      0 video 1024 mjpeg 480x390, q=1-4, fps=10

                      1 video 200 mjpeg 704x576, q=2-31, fps=2

                      Connection Status

                      Number of connections: 1 / 100

                      Bandwidth in use: 0k / 4096k

                      File IP Proto State Target bit/s Actual bit/s Bytes transferred

                      1 status.html 192.168.178.29 HTTP/1.1 HTTP_WAIT_REQUEST 0 0 0

                      Generated at Mon Feb 27 17:36:51 2017

                      die 192.168.178.29 entspricht aber weder der Ip Adresse vom Server noch der IP-Cam?

                      mit Aufruf von http://192.168.178.yyyy:8090/ipcam1.mjpg lädt Safari und lädt und Lädt ….....

                      wo sollte ich jetzt anfangen zu suchen?

                      viel Spass noch

                      Jens

                      1 Reply Last reply Reply Quote 0
                      • E
                        eastcoast last edited by

                        @balear59:

                        …

                        die 192.168.178.29 entspricht aber weder der Ip Adresse vom Server noch der IP-Cam? `
                        Ich glaube die 192.168.178.29 ist die Adresse des Rechners womit du die Seite anzeigst.
                        @balear59:

                        mit Aufruf von http://192.168.178.yyyy:8090/ipcam1.mjpg lädt Safari und lädt und Lädt …..... `
                        Ich vermute mal ffmpeg läuft noch nicht (siehe Punkt 5),

                        also z.B. einfach mal im ioBroker.admin unter "Objekte" javascript.0-ffmpegCam-run von false auf true setzen.

                        1 Reply Last reply Reply Quote 0
                        • B
                          balear59 last edited by

                          Hallo,

                          Du hast recht. Die 29 ip ist der Mac. Der Server läuft auch nicht. Wenn ich über das Terminal auf den raspberry gehe und den Server mit /usr/bin/ffserver starte, bekomme ich keine Erfolgsmedung.

                          Bin jetzt leider ein paar Tage außer Haus.

                          Melde mich wieder

                          Viel Spaß noch

                          Jens

                          1 Reply Last reply Reply Quote 0
                          • E
                            eastcoast last edited by

                            @balear59:

                            Der Server läuft auch nicht. Wenn ich über das Terminal auf den raspberry gehe und den Server mit /usr/bin/ffserver starte, bekomme ich keine Erfolgsmedung. `
                            Ich denke schon dass der ffserver läuft, sonst würde die status.html nicht angezeigt.

                            Also wie schon zuletzt geschrieben, ffmpeg muss auch gestartet werden!

                            1 Reply Last reply Reply Quote 0
                            • M
                              Marcolotti last edited by

                              Hallo,

                              wie sieht das Script aus, wenn ich den FFMPEG Server auf einem anderen Host starte? Der Master(iobroker) läuft noch auf einem Pi2 und ich habe mir gedacht, der Pi3(Slave) hat mehr Bumms und ist nicht so ausgelastet.

                              Gruß Marco

                              1 Reply Last reply Reply Quote 0
                              • E
                                eastcoast last edited by

                                @Marcolotti:

                                wie sieht das Script aus, wenn ich den FFMPEG Server auf einem anderen Host starte? `
                                Wenn ffserver auf einem anderen Host läuft könntest Du hier

                                var ffmpegStartCmd   = "ffmpeg -i \"ip-der-cam-here" http://localhost:8090/ipcam1.ffm";
                                
                                

                                einfach die "localhost:8090" auf die Adresse des ffserver ändern.

                                Mehr Ressourcen benötigt jedoch ffmpeg, desshalb würde es eher Sinn machen auch ffmpeg auf dem anderen Host zu betreiben.

                                1 Reply Last reply Reply Quote 0
                                • B
                                  blinderengel last edited by

                                  Hi ich hätte da eine Frage, bin neu hier und habe iobroker erst am WE installiert und meine HM umgebung eingebunden.

                                  jetzt fehlt mir noch meine Cam ich habe eine HiKam Q7 sowie eine A7 könnt ihr mir hier helfen wie ich diese angezeigt bekomme.

                                  vielen Dank

                                  Jörg

                                  1 Reply Last reply Reply Quote 0
                                  • G
                                    Gonmyr last edited by

                                    Hallo,

                                    prima Anleitung. Danke fürs Teilen.

                                    Läut super mit der ersten Cam.

                                    Verstehe ich das richtig, dass ich dann für mehrere IPCams auch mehrere Scripte brauche oder kann ich die alle in ein Script schmeißen?

                                    Grüße

                                    1 Reply Last reply Reply Quote 0
                                    • M
                                      mikiline last edited by

                                      @Gonmyr:

                                      Hallo,

                                      prima Anleitung. Danke fürs Teilen.

                                      Läut super mit der ersten Cam.

                                      Verstehe ich das richtig, dass ich dann für mehrere IPCams auch mehrere Scripte brauche oder kann ich die alle in ein Script schmeißen?

                                      Grüße `

                                      ich schätze mal das du die Variable hier ändern kannst in z.B auch cam1 und den Pfad anpassen bzw. die ausgabeurl ändern

                                      var ffmpegStartCmd   = "ffmpeg -i \"rtsp://user:user@192.168.1.yyy:554/cam/realmonitor?channel=1&subtype=2\" http://localhost:8090/ipcam1.ffm";
                                      

                                      Kamera 2

                                      var ffmpegStartCmdCam2   = "ffmpeg -i \"rtsp://user:user@192.168.1.yyy:554/cam/realmonitor?channel=1&subtype=2\" http://localhost:8090/ipcam2.ffm";
                                      

                                      Danach dann noch im dem Startabschnitt die Variable mitstarten

                                       exec(ffserverStartCmd, function(err, stdout, stderr) {
                                              if (err) {
                                                  console.log("ffserver error: " + stderr);
                                              }
                                      

                                      darin noch einfügen (2. Kamera)

                                       exec(ffmpegStartCmdCam2, function(err, stdout, stderr) {
                                              if (err) {
                                                  console.log("ffserver error: " + stderr);
                                              }
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • G
                                        Gonmyr last edited by

                                        Du meinst in Deinem 2. Abschnitt ffmpegStartCmd anstatt ffserverStart oder?

                                        Sonst wäre ja der Eintrag doppelt… oder übersehe ich etwas?

                                        1 Reply Last reply Reply Quote 0
                                        • M
                                          mikiline last edited by

                                          ffserver läuft ja bereits….

                                          einfach die variable ersetzen die du oben genommen hast (url zur 2. cam)

                                          Und in der Config Datei (etc/ffserver.conf) noch die 2. cam als stream einfügen

                                          ! ````
                                          ########################################

                                          IP camera feed...

                                          <feed ipcam1.ffm="">File /tmp/ipcam1.ffm
                                          FileMaxSize 1M
                                          ACL allow 127.0.0.1</feed>

                                          ! ########################################

                                          Streams...

                                          <stream ipcam1.mjpg="">Feed ipcam1.ffm
                                          Format mpjpeg
                                          VideoQMin 1
                                          VideoQMax 4
                                          VideoFrameRate 10
                                          VideoSize 480x390
                                          VideoBufferSize 1024
                                          VideoBitRate 1024
                                          NoAudio
                                          Strict -1</stream>
                                          <stream ipcam1.jpg="">Feed ipcam1.ffm
                                          Format jpeg
                                          Qscale 2
                                          VideoFrameRate 2
                                          VideoSize 704x576
                                          VideoIntraOnly
                                          NoAudio
                                          NoDefaults
                                          Strict -1</stream>

                                          
                                          Alles ohne Gewähr…..ich habe das nicht getestet ;)
                                          1 Reply Last reply Reply Quote 0
                                          • G
                                            Gonmyr last edited by

                                            Es läuft! :lol:

                                            Aber ich musste die ffserver.conf auch noch anpassen.

                                            Wenn dort auch alle Streams drin stehen, klappt es prima.

                                            Dankeschön für die Unterstützung!

                                            Gruß

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            598
                                            Online

                                            31.7k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            template vis
                                            24
                                            59
                                            25047
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo