尝试使用 Omxplayer 同步 LED 和视频 - 出现 omxplayer.bin 错误和其他问题
Posted
技术标签:
【中文标题】尝试使用 Omxplayer 同步 LED 和视频 - 出现 omxplayer.bin 错误和其他问题【英文标题】:Trying to sync LEDs and Videos using Omxplayer - getting omxplayer.bin errors & other issues 【发布时间】:2019-06-08 01:30:43 【问题描述】:我是 Python 3 的新手,我一直在编写代码,当按下五个分配的按钮之一时,将播放 4 个不同的视频,其中 3 个视频使用 time.sleep() 定时闪烁 LED。我的所有时间都运行良好;但是我不能让一个视频播放/闪烁 LED,然后在另一个按钮上做同样的事情,即使它中断了之前的视频/闪烁。一旦按下按钮并且 LED 闪烁,如果视频结束并再次按下按钮,它们将不再闪烁。第 5 个按钮设置为终止程序(作为紧急情况),但有时我必须从 LXterminal 手动执行“sudo killall omxplayer”。另外,在操作系统升级后,我收到 omxplayer.bin 'terminating on line 67' 的新错误。我需要一些帮助来编写此代码以及我可能缺少或需要删除的内容:
import RPi.GPIO as GPIO
import time,signal,sys,os
from omxplayer.player import OMXPlayer
def playerExit(code):
global command1
print('exit',code)
os.system(command1)
global videoPlaying
videoPlaying=False
def playVideo(video):
global player,videoPlaying
if player==None:
player = OMXPlayer(video, args=['--no-osd', '--no-keys',])
player.exitEvent += lambda _, exit_code: playerExit(exit_code)
if buttonVideo[1] == "/home/pi/Videos/noman.mp4":
time.sleep(164)
nomanh16()
nomanr16()
if buttonVideo[1] == "/home/pi/Videos/cobro.mp4":
time.sleep(45)
cobro1()
cobro2()
cobror1()
else:
player.load(video)
videoPlaying = True
def signalHandler(sig,frame):
print('Ctrl+C pressed')
os.system(command1)
sys.exit(0)
def quitPlayerLED():
global ledGPIO
for index in ledGPIO:
GPIO.output(index,GPIO.LOW)
if player != None:
player.exit()
def nomanh16():
for f in range(0,62):
GPIO.output(13,GPIO.HIGH) #<<< Turn ON LED
time.sleep(0.7) #<<< wait 1/8 of a second
GPIO.output(13,GPIO.LOW) #<<< Turn OFF LED
time.sleep(0.7) #<<< wait 1/8 of a second
def nomanr16():
for f in range(0,34):
GPIO.output(13,GPIO.HIGH)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
time.sleep(0.7)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.7)
def cobro1():
for f in range(0,28):
GPIO.output(13,GPIO.HIGH) #<<< Turn ON LED
time.sleep(0.6) #<<< wait 1/8 of a second
GPIO.output(13,GPIO.LOW) #<<< Turn OFF LED
time.sleep(0.6) #<<< wait 1/8 of a second
def cobro2():
for f in range(0,107):
if f >= 86:
time.sleep(0.4)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
GPIO.output(13,GPIO.HIGH)
time.sleep(0.4)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.4)
def cobror1():
for j in range(0,104):
if j >= 42:
GPIO.output(13,GPIO.HIGH)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
time.sleep(0.7)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.7)
# gpio,video/quit,blink T/F
buttonVideos = [[16,"/home/pi/Videos/noman.mp4",False],
[20,"/home/pi/Videos/cobro.mp4",False],
[26,"quit",False]]
ledGPIO = [13,17,18,23] #<==== LEDS
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
for index in ledGPIO:
GPIO.setup(index,GPIO.OUT)
GPIO.output(index,GPIO.LOW)
for buttonVideo in buttonVideos:
GPIO.setup(buttonVideo[0], GPIO.IN, pull_up_down=GPIO.PUD_UP)
signal.signal(signal.SIGINT,signalHandler)
command1 = "sudo killall omxplayer.bin"
player = None
videoPlaying = False
try:
while True:
# check buttons
for buttonVideo in buttonVideos:
if GPIO.input(buttonVideo[0]) == GPIO.LOW:
print(buttonVideo[0],'pressed')
if(buttonVideo[1] == "quit"):
quitPlayerLED()
else:
playVideo(buttonVideo[1])
break
except KeyboardInterrupt:
command1 = "sudo killall -s 9 omxplayer.bin"
os.system(command1)
os.system("exit")
except NameError as error:
command1 = "sudo killall -s 9 omxplayer.bin"
os.system(command1)
os.system("exit")
except TypeError as error:
command1 = "sudo killall -s 9 omxplayer.bin"
os.system(command1)
os.system("exit")
except Exception as exception:
command1 = "sudo killall -s 9 omxplayer.bin"
os.system(command1)
os.system("exit")
【问题讨论】:
请尝试发布minimal reproducible example,将代码更改为更简洁。 我会尽我所能。我对此很陌生。该程序可以工作,但不是我需要的工作方式。 我清除了删除 pygame 部分的代码,因为这不是问题。如果我按下按钮 GPIO 20 播放 corbo.mp4,它会正确播放并闪烁 LED。当视频结束时,如果您再次按下按钮 GPIO 20,视频将播放但没有闪烁的 LED。如果您按下 GPIO 按钮 16,然后按下 GPIO 按钮 20,也是如此。我希望能够停止一个并播放另一个,并保持 LED 为每个按钮分配闪烁。 【参考方案1】:经过多次试验和错误研究,我能够解决问题。它可以在某些地方进行一些清理。我可以使用的帮助是删除 Ctrl-c 上的 pygame 屏幕,因为 pygame.display.quit() 和/或 pygame.quit() 如果不单击 Thonny Python IDE 上的“停止”按钮或重新启动操作系统。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time,signal,sys,os
from omxplayer.player import OMXPlayer
from sys import exit
import pygame
os.environ['SDL_VIDEO_CENTERED'] = '1'
pygame.init()
screen = pygame.display.set_mode((1920,1080), pygame.RESIZABLE)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
def playerExit(code):
os.system("sudo killall omxplayer.bin")
global videoPlaying
videoPlaying=False
def playVideo(video):
global player,videoPlaying
if player == None:
player=OMXPlayer(video, args=['--o', 'local', '--no-osd', '--no-key'])
player.exitEvent += lambda _, exit_code: playerExit(exit_code)
setLEDS()
else:
player.load(video)
player.exitEvent += lambda _, exit_code: playerExit(exit_code)
setLEDS()
player = None
videoPlaying = False
def signalHandler(sig,frame):
print('Ctrl+C pressed')
os.system("sudo killall omxplayer.bin")
player.quit()
def quitPlayerLED():
os.system("sudo killall omxplayer.bin")
for index in ledGPIO:
GPIO.output(index,GPIO.LOW)
def setLEDS():
if buttonVideo[1] == "/home/pi/Videos/noman.mp4":
snore(164)
nomanh16()
nomanr16()
if buttonVideo[1] == "/home/pi/Videos/cobro.mp4":
snore(45)
cobro1()
cobro2()
cobror1()
if buttonVideo[1] == "/home/pi/Videos/terror.mp4":
snore(10)
nomanr16()
def snore(seconds):
for i in range(seconds):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
time.sleep(1)
def nomanh16():
for f in range(0,62):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
GPIO.output(13,GPIO.HIGH) #<<< Turn ON LED
time.sleep(0.7) #<<< wait 1/8 of a second
GPIO.output(13,GPIO.LOW) #<<< Turn OFF LED
time.sleep(0.7) #<<< wait 1/8 of a second
def nomanr16():
for f in range(0,34):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
GPIO.output(13,GPIO.HIGH)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
time.sleep(0.7)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.7)
def cobro1():
for f in range(0,28):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
GPIO.output(13,GPIO.HIGH) #<<< Turn ON LED
time.sleep(0.6) #<<< wait 1/8 of a second
GPIO.output(13,GPIO.LOW) #<<< Turn OFF LED
time.sleep(0.6) #<<< wait 1/8 of a second
def cobro2():
for j in range(0,107):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
if j >= 86:
time.sleep(0.4)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
GPIO.output(13,GPIO.HIGH)
time.sleep(0.4)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.4)
def cobror1():
for k in range(0,109):
if GPIO.input(26) != True:
quitPlayerLED()
playerExit(143)
break
if k >= 42:
GPIO.output(13,GPIO.HIGH)
GPIO.output(17,GPIO.HIGH)
GPIO.output(18,GPIO.HIGH)
GPIO.output(23,GPIO.HIGH)
time.sleep(0.7)
GPIO.output(13,GPIO.LOW)
GPIO.output(17,GPIO.LOW)
GPIO.output(18,GPIO.LOW)
GPIO.output(23,GPIO.LOW)
time.sleep(0.7)
buttonVideos = [[16,"/home/pi/Videos/noman.mp4",False],
[20,"/home/pi/Videos/cobro.mp4",False],
[21,"/home/pi/Videos/terror.mp4",False],
[19,"/home/pi/Videos/normal.mp4",False],
[26,"quit",False]]
ledGPIO = [13,17,18,23]
for index in ledGPIO:
GPIO.setup(index,GPIO.OUT)
GPIO.output(index,GPIO.LOW)
for buttonVideo in buttonVideos:
GPIO.setup(buttonVideo[0], GPIO.IN, pull_up_down=GPIO.PUD_UP)
signal.signal(signal.SIGINT,signalHandler)
my_image = ('/home/pi/Videos/wallpaper.png')
view_screen = pygame.image.load(my_image).convert_alpha()
view_screen_rect = view_screen.get_rect()
screen.fill((0, 0, 0))
view_screen_rect.centerx = 970
view_screen_rect.centery = 540
screen.blit(view_screen,view_screen_rect)
pygame.display.flip()
player = None
videoPlaying = False
try:
while True:
# check buttons
for buttonVideo in buttonVideos:
if GPIO.input(buttonVideo[0]) == GPIO.LOW:
if(buttonVideo[1] == "quit"):
quitPlayerLED()
else:
quitPlayerLED()
playVideo(buttonVideo[1])
break
except KeyboardInterrupt:
command1 = "sudo killall omxplayer.bin"
os.system(command1)
pygame.display.quit()
pygame.quit()
exit(0)
except NameError as error:
command1 = "sudo killall omxplayer.bin"
os.system(command1)
pygame.display.quit()
pygame.quit()
exit(0)
except TypeError as error:
command1 = "sudo killall omxplayer.bin"
os.system(command1)
pygame.display.quit()
pygame.quit()
exit(0)
except Exception as exception:
command1 = "sudo killall omxplayer.bin"
os.system(command1)
pygame.display.quit()
pygame.quit()
exit(0)
【讨论】:
以上是关于尝试使用 Omxplayer 同步 LED 和视频 - 出现 omxplayer.bin 错误和其他问题的主要内容,如果未能解决你的问题,请参考以下文章