Попытка синхронизации светодиодов и видео с помощью Omxplayer - получение ошибок omxplayer.bin и другие проблемы - PullRequest
0 голосов
/ 14 января 2019

Я новичок в Python 3, и я работаю над кодом, который будет воспроизводить 4 разных видео, когда нажата одна из пяти назначенных кнопок, и 3 из видео по умолчанию мигали светодиодами с помощью time.sleep (). У меня все время работает хорошо; однако я не могу заставить одно видео воспроизводить / мигать светодиодами, а затем на другой кнопке делать то же самое, даже если оно прерывает предыдущее видео / мигает. Как только кнопка нажата, а светодиоды мигают, они больше не мигают, если видео заканчивается и кнопка нажимается снова. Пятая кнопка настроена на уничтожение программы (как экстренную), но иногда мне приходится вручную запускать «sudo killall omxplayer» из LXterminal. Кроме того, я получаю новые ошибки с omxplayer.bin, заканчивающимся в строке 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")

1 Ответ

0 голосов
/ 15 января 2019

После нескольких проб и ошибок и исследований, я смог решить проблему. Это может использовать некоторые очистки в местах. С помощью справки я могу удалить экран pygame на Ctrl-c, так как 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)
...