Wie kann ich omxplayer (Python / Himbeer-Pi) öffnen und schließen?

Mit einem Himbeer-Pi und einigen Drucktasten möchte ich die Videowiedergabe steuern. Wenn jemand eine Taste drückt, spielt das entsprechende Video ab. Die Tasten funktionieren super. Wenn Sie eine Taste drücken, wird das Video abgespielt, aber wenn Sie eine andere Taste oder dieselbe Taste drücken, öffnet sich das Video, ohne das gerade abgespielte Video zu schließen. Ich habe schon eine Weile gesucht, um das zu beheben. Ich bin ziemlich neu bei Python so bitte halte es so einfach wie möglich. In dem Code unten versuche ich, es mit Multithreading zu erreichen. Ich war nicht in der Lage, den Thread zu schließen, wenn ein weiterer Thread beginnt. Ich bin in der Lage, das Video zu schließen, nachdem es für 10 Sekunden gespielt hat, aber ich kann den Quit-Befehl nicht irgendwo anders verschieben, um andere Videos zu schließen: playSippycup.stdin.write ('q')

Hier sind die Fehler, die ich gerade empfange:

Unhandled exception in thread started by <function shoppingcart at 0xb6c566f0>Playing Sippycup Unhandled exception in thread started by <function dodgeballs at 0xb6c56670> Traceback (most recent call last): File "./labmural2.py", line 53, in dodgeballs playDodgeballs.stdin.write('q') NameError: global name 'playDodgeballs' is not defined Traceback (most recent call last): File "./labmural2.py", line 71, in shoppingcart playShoppingcart.stdin.write('q') NameError: global name 'playShoppingcart' is not defined 

Vielen Dank für jede Hilfe, die ihr Jungs anbieten kann!

 #!/usr/bin/env python import RPi.GPIO as GPIO import subprocess import time import thread GPIO.setmode (GPIO.BCM) GPIO.setwarnings (False) GPIO.setup(9, GPIO.IN) GPIO.setup(10, GPIO.IN) GPIO.setup(11, GPIO.IN) GPIO.setup(17, GPIO.OUT) GPIO.setup(22, GPIO.OUT) GPIO.setup(27, GPIO.OUT) def sippycup( name ): global playSippycup while True: if GPIO.input(11) == True: print name time.sleep(1) playSippycup=subprocess.Popen(['omxplayer','Desktop/videos/sippycup.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) playSippycup.stdin.write('q') if GPIO.input(9) == True: playSippycup.stdin.write('q') if GPIO.input(10) == True: playSippycup.stdin.write('q') def dodgeballs( name ): global playDodgeballs while True: if GPIO.input(9) == True: print name time.sleep(1) playDodgeballs=subprocess.Popen(['omxplayer','Desktop/videos/dodgeballs.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) playDodgeballs.stdin.write('q') if GPIO.input(10) == True: playDodgeballs.stdin.write('q') if GPIO.input(11) == True: playDodgeballs.stdin.write('q') def dodgeballs( name ): global playDodgeballs while True: if GPIO.input(9) == True: print name time.sleep(1) playDodgeballs=subprocess.Popen(['omxplayer','Desktop/videos/dodgeballs.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) playDodgeballs.stdin.write('q') if GPIO.input(10) == True: playDodgeballs.stdin.write('q') if GPIO.input(11) == True: playDodgeballs.stdin.write('q') def shoppingcart( name ): global playShoppingcart while True: if GPIO.input(10) == True: print name time.sleep(1) playShoppingcart=subprocess.Popen(['omxplayer','Desktop/videos/shoppingcart.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) playShoppingcart.stdin.write('q') if GPIO.input(9) == True: playShoppingcart.stdin.write('q') if GPIO.input(11) == True: playShoppingcart.stdin.write('q') thread.start_new_thread( sippycup, ("Playing Sippycup",) ) thread.start_new_thread( dodgeballs, ("Playing Dodgeballs",) ) thread.start_new_thread( shoppingcart, ("Playing Shoppingcart",) ) while True: pass GPIO.cleanup() 

NEUE BEARBEITUNG:

 #!/usr/bin/python from time import sleep import RPi.GPIO as GPIO import subprocess import time import thread GPIO.setmode (GPIO.BCM) GPIO.setwarnings (False) GPIO.setup(9, GPIO.IN) GPIO.setup(10, GPIO.IN) GPIO.setup(11, GPIO.IN) GPIO.setup(17, GPIO.OUT) GPIO.setup(22, GPIO.OUT) GPIO.setup(27, GPIO.OUT) def welcome_loop(): while True: global playProcess x = 1 print "LOOPING" time.sleep(.5) playProcess=subprocess.Popen(['omxplayer','-b','Desktop/videos/loop/loop.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) playProcess.stdin.write('q') x += 1 def videos(): while True: if GPIO.input(9): print "STOP LOOP" time.sleep(.5) playProcess.stdin.write('q') time.sleep(.5) print "Play Sippycup" sippycup_video=subprocess.Popen(['omxplayer','-b','Desktop/videos/sippycup.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) sippycup_video.stdin.write('q') time.sleep(.5) welcome_loop() if GPIO.input(10): print "STOP LOOP" time.sleep(.5) playProcess.stdin.write('q') time.sleep(.5) print "Play Dodgeballs" dodgeballs_video=subprocess.Popen(['omxplayer','-b','Desktop/videos/dodgeballs.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) dodgeballs_video.stdin.write('q') time.sleep(.5) welcome_loop() if GPIO.input(11): print "STOP LOOP" time.sleep(.5) playProcess.stdin.write('q') time.sleep(.5) print "Play Shoppingcart" shoppingcart_video=subprocess.Popen(['omxplayer','-b','Desktop/videos/shoppingcart.mp4'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, close_fds=True) time.sleep(10) shoppingcart_video.stdin.write('q') time.sleep(.5) welcome_loop() thread.start_new_thread( videos, () ) thread.start_new_thread( welcome_loop, () ) while True: pass GPIO.cleanup() 

FEHLER:

Unbehandelte Ausnahme im Thread von Traceback gestartet (letzter Anruf zuletzt): Datei "./labmural2.py", Zeile 28, in welcome_loop playProcess.stdin.write ('q') IOError: [Errno 32] Broken pipe

One Solution collect form web for “Wie kann ich omxplayer (Python / Himbeer-Pi) öffnen und schließen?”

NameError: global name 'playDodgeballs' is not defined bedeutet, dass du versuchst, playDodgeballs zu verwenden, bevor es playDodgeballs = .. definiert ist.

Ich würde Ihren Code vereinfachen, indem ich alle Globals und Threads lösche. subprocess.Popen läuft einen separaten Prozess; Es blockiert nicht dein Hauptfaden:

 names = 'sippycup', 'dodgeballs', 'shoppingcart' movies = ['Desktop/videos/{name}.mp4'.format(name=name) for name in names] players = [Player(movie=movie) for movie in movies] player = players[0] setup_io() # GPIO setup while True: for key in get_key_events(): # get GPIO input if key == '0': player = players[0] elif key == 'space': player.toggle() # pause/unpause elif key == 'enter': player.start() ... 

Wo Player ist ein einfacher Wrapper um omxplayer Teilprozess:

 import logging from subprocess import Popen, PIPE, DEVNULL logger = logging.getLogger(__name__) class Player: def __init__(self, movie): self.movie = movie self.process = None def start(self): self.stop() self.process = Popen(['omxplayer', self.movie], stdin=PIPE, stdout=DEVNULL, close_fds=True, bufsize=0) self.process.stdin.write(start_command) # start playing def stop(self): p = self.process if p is not None: try: p.stdin.write(quit_command) # send quit command p.terminate() p.wait() # -> move into background thread if necessary except EnvironmentError as e: logger.error("can't stop %s: %s", self.movie, e) else: self.process = None def toggle(self): p = self.process if p is not None: try: p.stdin.write(toggle_command) # pause/unpause except EnvironmentError as e: logger.warning("can't toggle %s: %s", self.movie, e) 

start_command quit_command entsprechenden start_command , quit_command , toggle_command . Sie können verschiedene Methoden definieren, je nachdem, welche Befehle omxplayer versteht und welche Befehle Sie benötigen.

  • Drucken von Stdout in Echtzeit aus einem Unterprozess, der stdin erfordert
  • Python open + append funktioniert nicht wie erwartet
  • Wird ein Python-Unterprozeß Popen 'erben' root privs, wenn das aufrufende Skript mit sudo ausgeführt wird?
  • Drücken Sie Enter als Befehlseingang
  • Wie pfeife ich einen Teilprozeßaufruf zu einer Textdatei?
  • Zugriff auf die Bash-Umgebungsvariable in Python unter Verwendung des Unterprozesses
  • Wie man einen neuen Befehl an einen Teilprozess sendet
  • Filtern Sie den Befehl aus, der ein Terminal im Python-Unterprozessmodul benötigt
  • Popen kommunizieren vs Popen stdin.write ()
  • Wie löst man abgelösten Hintergrundprozess auf Linux entweder in bash oder python
  • Führen Sie untergeordnete Prozesse als unterschiedlicher Benutzer aus einem langen laufenden Prozess aus
  • Python ist die beste Programmiersprache der Welt.