Avconv per Taster beenden

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hi,
    ich bräuchte wieder mal eure Hilfe :D.

    Im Rahmen meines Dashcam Projektes möchte ich ein Video per AVCONV aufnehmen.
    Das funktioniert schon mal ganz gut. Verwendet wird eine USB Kamera. Das ganze
    System soll im Auto verbaut und nur per Taster gesteuert werden (Starten/Shutdown
    vom Pi mit Pi Supply Switch). Ich möchte keine Tastatur benutzen.

    Für den Pi Supply Switch gibt es ein Python Skript welches de Pi per Taster runterfährt.
    Soweit so gut, jetzt die Frage:

    Gibt es einen Befehl mit dem ich ein Programm in Python (in meinem Fall Avconv) anstatt mit STRG+C
    mit Taster (GPIO) beenden kann?

    Wenn kill verwendet wird, wird das aufgenommene Video nicht abgeschlossen. Laut google kann
    Avconv nur ordnungsgemäß mit STRG+C beendet werden, das bringt mir erstmal nichts, da ich keine
    Tastatur verwenden möchte :s.

    Danke

  • Strg-C ist ein Shell-Feature um ein SIGINT an einen Prozess zu schicken. Das kann man auch mit kill machen. Mit Python zB mit os.kill & dem Modul signal. Oder mit "kill -SIGINT <prozessid>". Oder mit subprocess.Popen.kill, wenn du avconv damit gestartet hast.


    Gesendet von iPhone mit Tapatalk

  • Danke, hat doch mit os.system("sudo killall avconv") funktioniert. Ich hatte gleich in der nächsten Zeile den shutdown Befehl angewiesen, das war avconv wohl zu schnell und es konnte nicht zu Ende encodieren (mp4 war "defekt"). Mit time.sleep einfügen hat es dann geklappt!

  • Per Taster beenden funktioniert, jetzt soll das aufgenommene Video noch per shutil verschoben werden (alles wenn Taster gedrückt wurde). Das Video wird gestartet, wenn der Taster betätigt wird, wird Avconv beendet. So weit so gut, leider findet ein Verschieben nicht statt. Abgearbeitet wird scheinbar nur bis os.system("sudo killall avconv") :s ??

    Hier der Code:
    [font="Menlo"]import RPi.GPIO as gpio[/font]
    [font="Menlo"]import os[/font]
    [font="Menlo"]import time[/font]
    [font="Menlo"]import shutil[/font]

    [font="Menlo"]video='/home/pi/1.mp4'[/font]
    [font="Menlo"]usb='/media/usb/'[/font]

    [font="Menlo"]# wenn taster betätigt[/font]
    [font="Menlo"]def end(pin):[/font]
    [font="Menlo"] os.system("sudo killall avconv")[/font]
    [font="Menlo"] time.sleep(3)[/font]
    [font="Menlo"] shutil.move(video,usb)[/font]

    [font="Menlo"]gpio.setmode(gpio.BOARD)[/font]
    [font="Menlo"]gpio.setup(7, gpio.IN) # pin 7 input[/font]
    [font="Menlo"]gpio.add_event_detect(7, gpio.RISING, callback=end, bouncetime=200)[/font]

    [font="Menlo"]os.system("avconv -f video4linux2 -r 15 -s 640x480 -i /dev/video0 -vcodec mpeg4 /home/pi/1.mp4")[/font]

  • Na, so wie das aussieht

    - startest du avconv in einem blockierenden call
    - killst es grob in einem Eventcallback
    - womit der blockierende call zurueckkehrt, und dein Skript sich beendet, waehrend der callback wartet.

    Besser ist, das subprocess modul zu verwenden. Ich hab' das mal mit anderen Befehlen (weil nicht am PI) simuliert, wie man das macht:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!