Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Python - VLC - Webcam

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS - √ - Python - VLC - Webcam

    Liebe Pythonversteher,

    folgendes Script verwende ich auf einem Linux Desktop um mir von meinem Homeserver das Türkamerabild anzeigen zu lassen. Dies ist per Bewegungsmelder getriggert.

    Leider passiert nun Folgendes: Der VLC wir brav geöffnet, sobald der HS auf Port 7010 das richtige Secret sendet. Sendet der HS jedoch während des laufenden Streams nochmals, z.b weil der Bewegungsmelder erneut ausgelöst hat, so lässt sich der VLC kaum noch beenden, da dieser sofort neu gestartet wird.
    Unter Umständen muss ich so der VLC 5 mal schließen, bis er zu bleibt.

    Irgendwie puffert der "data = conn.recv(1024)" die Dinger bis der VLC beendet wird...

    Konnte man das Problem verstehen?? Und ggf. sogar lösen?

    Grüße
    Hansa


    ---- schnipp ----
    #!/usr/bin/env python

    import os
    import socket
    import sys
    import time

    HOST = ''
    PORT = 7010

    SECRET = 'geheim'

    def log(msg):
    sys.stderr.write('[%s] %s\n' % (time.ctime(), msg))

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)

    while True:
    conn, addr = s.accept()
    data = conn.recv(1024)
    conn.close()

    if not data:
    continue
    if data.strip() != SECRET:
    log('received invalid secret from %s' % repr(addr))
    continue

    log('starting vlc...')
    os.system("vlc --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'")

    --- schnapp ---

    #2
    Versuchs mal statt mit os.system mit
    17.1. subprocess ? Subprocess management — Python v2.7.2 documentation

    der wartet dann.
    Nils

    aktuelle Bausteine:
    BusAufsicht - ServiceCheck - Pushover - HS-Insight

    Kommentar


      #3
      p = subprocess.Popen("/usr/bin/vlc" + " --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'", shell=True)

      Macht leider keinen Unterschied. Das Problem besteht ja nicht darin, dass er den VLC mehrmals öffnet, sondern, dass er den VLC sofort neu startet, wenn man ihn schließt.

      Ein
      data = " "
      hilft leider auch nicht...

      Kommentar


        #4
        Mach doch mal den conn.close() hinter den vlc dann kann der Listen(1) ja nicht mehr Clients annehmen.
        Nils

        aktuelle Bausteine:
        BusAufsicht - ServiceCheck - Pushover - HS-Insight

        Kommentar


          #5
          geht leider auch nicht.

          log('starting vlc...')
          #os.system("vlc --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'")
          p = subprocess.Popen("/usr/bin/vlc" + " --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'", shell=True)
          conn.close()
          data = ""
          log(data)


          Macht nun pro Aufruf einmal den vlc auf. Damit habe ich bei 3 Aufrufen 3 mal den vlc laufen.

          Kommentar


            #6
            Und wie wäre es wenn du den Serversocket, bei erfolg einfach schließt und erst nach dem subprocess wieder auf machst.

            also

            while True:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.bind((HOST, PORT))
            s.listen(1)

            while True:
            conn, addr = s.accept()
            data = conn.recv(1024)
            if not data:
            continue

            if data.strip() != SECRET:
            log('received invalid secret from %s' % repr(addr))
            continue
            conn.close()
            s.close()
            s=None
            log('starting vlc...')

            subprocess.Popen("/usr/bin/vlc" + " --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'", shell=True)
            ## wichtig hier darfs erst weiter gehen, wenn der vlc beendet ist.
            Nils

            aktuelle Bausteine:
            BusAufsicht - ServiceCheck - Pushover - HS-Insight

            Kommentar


              #7
              yes!
              so geht es!

              hab noch eine schleife weggelassen.

              #!/usr/bin/env python

              import os
              import socket
              import sys
              import time
              import subprocess

              HOST = ''
              PORT = 7017

              SECRET = 'geheim'

              def log(msg):
              sys.stderr.write('[%s] %s\n' % (time.ctime(), msg))

              while True:
              s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
              s.bind((HOST, PORT))
              s.listen(1)
              conn, addr = s.accept()
              data = conn.recv(1024)
              if not data: continue

              if data.strip() != SECRET:
              log('received invalid secret from %s' % repr(addr))
              continue
              conn.close()
              s.close()
              s=None
              log('starting vlc...')
              subprocess.call("/usr/bin/vlc" + " --qt-minimal-view 'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'", shell=True)

              Leider killt Forensoft die Tabs/Spaces, was für einen Python Anfänger die Hölle ist.

              Hab das Script attached.

              Vielen Dank Nils!
              Angehängte Dateien

              Kommentar


                #8
                Zitat von thehansa Beitrag anzeigen
                Leider killt Forensoft die Tabs/Spaces, was für einen Python Anfänger die Hölle ist.
                Natürlich nur in normalem Text
                => Verwedne doch einfach die CODE Tags, dann geht es auch. Sieht dann so aus:

                Code:
                 #!/usr/bin/env [URL="http://redaktion.knx-user-forum.de/lexikon/python/"]python[/URL]
                 
                 [URL="http://redaktion.knx-user-forum.de/lexikon/import/"]import[/URL] os
                 [URL="http://redaktion.knx-user-forum.de/lexikon/import/"]import[/URL] socket
                 [URL="http://redaktion.knx-user-forum.de/lexikon/import/"]import[/URL] sys
                 [URL="http://redaktion.knx-user-forum.de/lexikon/import/"]import[/URL] time
                 [URL="http://redaktion.knx-user-forum.de/lexikon/import/"]import[/URL] subprocess
                 
                HOST = ''
                PORT = 7017
                 
                SECRET = 'geheim'
                 
                def log(msg):
                    sys.stderr.write('[%s] %s\n' % (time.ctime(), msg))
                 
                while True:
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    s.bind((HOST, PORT))
                    s.listen(1)
                    conn, addr = s.accept()
                    data = conn.recv(1024)
                    if not data: continue
                 
                    if data.strip() != SECRET:
                        log('received invalid secret from %s' % repr(addr))
                        continue
                    conn.close()
                    s.close()
                    s=None
                    log('starting vlc...')
                    subprocess.call("/usr/bin/vlc" + " --qt-minimal-view  'rtsp://root:xyz@192.168.0.80:554/axis-media/media.amp?videocodec=h264&streamprofile=Quality'",  shell=True)
                Besser?

                Gruß,
                Markus

                Kommentar


                  #9
                  Hier kannst Du echt was lernen!

                  Gruß
                  Hansa

                  Kommentar

                  Lädt...
                  X