Unterbrechungsfreier Streamer für PiCamera

  • Hi,


    ich habe folgendes vor: Später auf einem 2WD-Car soll vorne ein Pan-Tilt-Kit mit einer picamera montiert sein. Die Steuerung der Kits und der Livestream soll am PC über ein PHP-Script "servocam.php" erfolgen. Das Python-Programm "servo.py" steuert die Servos an.
    In der Vorstufes dazu teste ich erst einmal die Steuerung des Kits und die Livestream-Übertragung.


    [code=php]<table width="300" border="0" align="center">
    <tr>
    <td><iframe src="http://192.168.178.27:9000/stream_simple.html"
    width="320" height="240" align="center" ></iframe>
    </td>
    </tr>
    </table>
    <div align="center">


    <?php
    // Auswertung der get-Parameter
    if(isset($_GET['horizontal'])) {
    $command1 = $_GET['horizontal'];
    $val = shell_exec("python servo.py 3 $command1");
    }
    elseif(isset($_GET['vertikal'])) {
    $command2 = $_GET['vertikal'];
    $val = shell_exec("python servo.py 4 $command2");
    }
    ?>


    <div align ="center">
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?vertikal=-100"
    class="knopf_off" style="width: 100px"> Hoch</a>
    <br>
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?vertikal=home"
    class="knopf_on" style="width: 100px"> Vertikal Mitte</a>
    <br>
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?vertikal=100"
    class="knopf_on" style="width: 100px"> Runter</a>
    <br>
    ---------------
    <br>
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?horizontal=100"
    class="knopf_on" style="width: 100px"> Links</a>
    <br>
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?horizontal=home"
    class="knopf_on" style="width: 100px"> Horizontal Mitte</a>
    <br>
    <a href="<?php print($_SERVER['PHP_SELF']); ?>?horizontal=-100"
    class="knopf_off" style="width: 100px"> Rechts</a>
    </div>[/php]


    Aktuell hatte ich die Übertragung des Livestreams mit mjpg-streamer realisiert. Ich starte mjpg-streamer am Raspi und starte im firefox über http://RPi-IP:9000/servocam.php das Script. Darüber kann ich die Servos steuern und sehe den Livestream. Der läuft aber nicht unterbrechungsfrei.
    Gibt es für die picamera eine streaming-Software, die unterbrechungsfrei einen Stream erzeugt und den ich dann in diesen <iframe> einbetten kann?
    Da ich noch blutiger Anfänger bin, benötige ich eine einfache Beschreibung zum Verstehen (Tutorial).

    Edited once, last by 4711engel ().

  • Wie ich bereits erwähnt habe, halte ich von mjpg_streamer nichts :fies: Siehe dazu lieber Verzögerungs freies Streamen (lowest streaming latency)



    Davon abgesehen rate ich dir ebenfalls dazu Abstand von der von dir gewählten PHP Lösung zu nehmen... Nicht nur dieses unschönen "$val = shell_exec("python servo.py 4 $command2");" Konstrukt, sondern auch Hinsichtlich des damit verbundenen Problems: Bei jedem Klick auf einen Link wird die komplette Seite neu geladen - was somit auch den Stream stört.


    Da du vermutlich nur GPIO's steuerst solltest du dir lieber das angucken: FAQ --> Nützliche Links / Linksammlung --> [PHP] Anleitung zum schalten von GPIO


    Und das absolut beste wäre das ganze direkt in Python zu regeln, also ohne Webserver wie apache/nginx und ohne PHP, sondern alles direkt pure in Python, zum Beispiel mithilfe von bottle oder tornado.


    Oder mithilfe von jQuery und Websocket zu regeln - also ein Websocket-Server in Python, jQuery für Buttons für reload-freies klicken und eine Websocket Verbindung von Javascript zum Python Script zum ansetzen der Befehle.

  • Wie gesagt bin ich blutiger Anfänger und versuche durch Lösungen, die bei anderen funktionieren zu lernen.
    So habe ich die Steuerung des Pan-Tilt-Kits über dieses PHP-Script und ein Python-Program servo.py aus dem Forum. Die Steuerung funktioniert eigentlich sehr gut.
    Sicherlich gibt es bessere Lösungen, da hast du bestimmt recht. Mit mehr Erfahrungen werde ich mein Projekt dann sicherlich optimieren.


    Was ich eben suche ist eine für die PiCamera funktionierende einfache Streaming-Lösung, die ich mit meinen Grundkenntnissen zum Laufen bekomme.
    Motion funktioniert bei mir nicht und mjpg-streamer, wie du ja auch erklärt hast, ist auch nicht die optimale Lösung.
    Es soll einfach der Livestream der PiCamera unterbrechungsfrei im Bildfenster im Browser sichtbar sein. Klar, bei der Servo-Bewegung gibt es eine Unterbrechung. Aber nur sehr kurz und fällt auch nicht auf. Wie gesagt wenn ich zugelernt habe gibt es eine Optimierung.


    Wo finde ich denn mehr zum pistreamer , von dem du geschrieben hast? Ich hatte schon gegoogled, aber nichts gefunden, wie ich auch den Livestream dann ins PHP-Script einbinden muss.



    Vor diesem Projektchen hatte ich eine Wetterstation erstellt und da habe ich bottle verwendet um die Messdaten an mein Smartphone (Browser) zu senden. Funktioniert.

    Edited once, last by 4711engel ().

  • Wo finde ich denn mehr zum pistreamer , von dem du geschrieben hast? Ich hatte schon gegoogled, aber nichts gefunden


    In dem 1.Link ist alles weitere verlinkt (der rote Text sind eigentlich Links)


    wie ich auch den Livestream dann ins PHP-Script einbinden muss.


    In PHP eigentlich sowieso nicht egal was du da Probierst ;) PHP läuft nur Serverseitig, der Stream wird aber dem Client gezeigt also kann es nur Javascript oder HTML(5) sein.


    pistreaming basiert auf Python dh es wird kein Webserver wie apache2 benötigt sondern ist alles direkt in Python umgesetzt - wird in dem 1.Link aber eigentlich auch so beschrieben..


    In dem Thread werden aber auch andere Möglichkeiten beschrieben wie zum Beispiel in Beitrag #8


    Vor diesem Projektchen hatte ich eine Wetterstation erstellt und da habe ich bottle verwendet um die Messdaten an mein Smartphone (Browser) zu senden. Funktioniert.


    Angesichts dessen würde ich dir dann auch hier raten wieder bottle zu verwenden - kann dich da gerne bei unterstützen da ich das für mein RoPi Projekt ebenfalls so mache: bottle, jQuery, pistreaming
    Eigentlich ist das auch nicht sonderlich schwer wenn man es erst mal verstanden hat - so mit templates usw. Auf was du dann halt nur verzichten musst ist PHP, diesen Part übernimmt dann Python.

  • Das hört sich gut an. Aber ich muss kleine Schritte gehen und auch erst mit kleinen Prtojekten starten.
    Bottle habe ich ja aktuell nur für eine kleine Ausgabe der Messdaten beim WetterServer verwendet.


    Hier der Code dazu




    Also noch sehr einfach.
    Ich werde mir den Link ansehen und die darin beschriebenen Tips zu pistreamer. Und dann werde ich versuchen, ob ich mein Pan-Tilt-Kit mit bottle und dem darin enthaltenen HTML in Bewegung bekomme. Sind für mich erst einmal "Meilensteine". Mal schauen was raus kommt.

  • Naja der Grundaufbau sieht eigentlich immer gleich aus - über @route legt man quasi die URL's fest die man aufrufen kann. Da drunter steht die Funktion die dann aufgerufen wird und dann halt Sachen verarbeitet werden. Was Du gemacht hast ist den HTML Code direkt in die Funktion einzufügen, ich würde lieber den Weg gehen die Datei separat in zum Beispiel index.html abzulegen und dann mithilfe der template Funktion von bottle das ganze zu rendern.


    Also ein Grundgerüst auch für pistreaming all in one:


    => http://codepad.org/GPWIHxe1


    Was du dann halt noch brauchst ist eine index.html im Verzeichnis "templates" und jsmpg.js im Verzeichnis "static", dort wo das Python Script liegt. In der index.html kannst du an der Stelle wo Variablen eingefügt werden soll so vorgehen:

    Code
    1. {{ streamADDRESS }}


    Das wird dann automatisch von bottle ersetzt...Was ich auch mit 3 Variablen bereits so mache.



    Zusätzlich musst du dann aber natürlich noch die Pakete installieren:

    Code
    1. apt-get install libav-tools python3-picamera python3-bottle python3-ws4py


    Wie gesagt, erstell dir am Besten ein Verzeichnis für deine Dateien. In dieses Verzeichnis legst du dann sowohl das Python Script als auch alles andere - wie zum Beispiel /home/pi/robot/

    In dem Verzeichnis /home/pi/robot/ erstellst du dann 2 weitere Verzeichnisse und legst die index.html ins 'templates' sowie die jsmpeg.js ins 'static'



    Befehle kannst du über die URL /cmd/ absetzen wie zum Beispiel durch Aufruf von /cmd/stop


    Im späteren Betrieb sollte man aber bottle.debug(True) auskommentieren



    //EDIT: Getestet, gefixt und funktioniert nun ;)


    //EDIT2: Siehe dazu auch [Python] Webserver, Websocket und ein bisschen AJAX

  • Danke für dein Angebot und danke für deine Zeit.
    Aber das sind für mich alles noch bömische Dörfer und ich verstehe nur Bahnhof.
    Ich muss da step by step rangehen. Aktuell habe ich in den kleinen Tutorials auch nur mit Python2.xxx gearbeitet und dieses denke ich auch erst einmal beizubehalten. Alles, was ich bis jetzt gelesen habe bezieht sich auf Version 2.


    Ich werde erst einmal den ersten Schritt angehen: Steuerung des Pan-Tilt-Kits.
    Später kommt dann der Stream zu.
    Ich habe gerade noch einmal versucht motion zu installieren. Klappt aber leider nicht. Ich bekomme ständig wieder die Fehlermeldung bzgl. einer library.
    Wie ich gelesen habe, liegt dieses wohl an der PiCamera, die ich verwende. Mit einer USB-Cam solls ja wohl funktionieren.


    Für die Steuerung des Pan-Tilt-Kit mit HTML muss ich erst mal im Internet schauen, wie ich das machen könnte. Aktuell habe ich noch keine Idee, wie ich es mache.

  • Was verstehst du denn nicht?


    Die Unterschiede zwischen Python2 und Python3 sind in diesem Fall hier nur minimal. Für dein Vorhaben brauchst du eigentlich nur auf print("blah") anstatt print "bla" achten, alles weitere wird für Dich glaub ich nicht von Belang sein.


    Du kannst das aber auch problemlos auf Python2 umstellen - das einzige was du dann machen müsstest wäre die Module für Python2 zu installieren sowie ganz oben direkt unter dem Shebang folgende Zeilen einfügen:
    (wichtig ist das diese Zeilen wirklich als aller erstes importiert werden)

    Code
    1. from __future__ import (
    2. unicode_literals,
    3. absolute_import,
    4. print_function,
    5. division,
    6. )

    Es bedarf dann eigentlich keine weiteren Änderungen
    Python2 Module:

    Code
    1. apt-get install python-picamera python-bottle python-ws4py
  • Hallo in die Runde,


    sorry erst mal das ich so einen alten Beitrag wieder nach oben hole aber es ist genau das was ich brauche. Ich habe mich genau an die Anleitung wie unter Beitrag 6 gehalten aber leider bekomme ich beim starten eine Fehlermeldung:


    Initializing bottle thread

    Initializing camera

    Initializing websockets server on port 8084

    Initializing broadcast thread

    Spawning background conversion process

    robot.py:88: ResourceWarning: unclosed file <_io.BufferedWriter name='/dev/null'>

    shell=False, close_fds=True)

    Starting recording

    Starting bottle thread

    Starting websockets thread

    Starting broadcast thread


    Im Browser wird nur angezeigt "Loading" und nichts passiert.


    Hat hier einer einen Tipp was eventuell falsch sein könnte? Ich als Anfänger finde leider keinen Fehler :-(


    Lieben Dank und Gruß

    Torsten

  • Und da kann ich mich anschließen. Ich bin ebenfalls gestern über diesen Thread gestolpert und habe das erst mal nachgebaut, da es ein gutes Grundgerüst für mein Vorhaben zu sein scheint.


    Ich habe eine fast gleiche Fehlermeldung wie toto1975:


    Code
    1. robot.py:78: ResourceWarning: unclosed file <_io.BufferedWriter name='/dev/null'>
    2. stdin=PIPE, stdout=PIPE, stderr=io.open(os.devnull, 'wb'), shell=False, close_fds=True)


    Dere Webserver gibt sowohl mit Edge als auch Firefox folgende Fehlermeldung aus:


    Code
    1. A server error occurred. Please contact the administrator.


    Zeilennummerierung ist identisch wie in der Vorlage bon meigraf: http://codepad.org/GPWIHxe1


    Falls jemand weiter weiß, ich würde mich freuen.


    Schottische Grüße vom SchottenSchotte