2016-09-15 2 views
0

나는 omxplayer를 사용하여 4 개의 비디오를 재생해야하는 Raspberry Pi 3를 사용하여 DIY 프로젝트를하고 있습니다. 당신이 프로토 보드의 특정 버튼을 누르면 한 번파이썬을 사용하여 라스베리 파이에서 omxplayer 플레이어를 죽일 수있는 방법

각각의 영상이 재생됩니다 :

  • 을 눌러 버튼 1 - 플레이 동영상 2
  • 을 눌러 버튼 3 - - 플레이 비디오 비디오 1
  • 을 눌러 버튼 2를 플레이 3
  • 을 눌러 버튼 4 - 나는 버튼 중 하나를 누를 때마다 내가 4 동영상 재생에 성공 비디오 4

플레이 다음 파이썬 코드를 사용하십시오 :

import RPi.GPIO as GPIO 
import time 
import os 

GPIO.setmode(GPIO.BCM) # Declaramos que los pines seran llamados como numeros 
GPIO.setwarnings(False) 

GPIO.setup(4, GPIO.IN) # GPIO 7 como entrada 
GPIO.setup(17, GPIO.IN) # GPIO 17 como entrada 
GPIO.setup(27, GPIO.IN) # GPIO 27 como entrada 
GPIO.setup(22, GPIO.IN) # GPIO 22 como entrada 

pathVideos = "/home/pi/VideoHD/Belen"     # Directorio donde se encuentran los videos en HD 

def reproducirVideos(nameVideo): 
    command = "omxplayer -p -o hdmi %s/%s.mp4" % (pathVideos,nameVideo) 
    os.system(command) 
    print "Reproduciendo el Video: %s " % nameVideo 

def programaPrincipal(): 
    print("Inicio") 

    while True: 
     if (GPIO.input(4)): 
      print("Iniciando Video: AMANECER") 
      reproducirVideos("amanecer") 
     elif (GPIO.input(17)): 
      print("Iniciando Video: DIA") 
      reproducirVideos("dia") 
     elif (GPIO.input(27)): 
      print("Iniciando Video: ATARDECER") 
      reproducirVideos("atardecer") 
     elif (GPIO.input(22)): 
      print("Iniciando Video: ANOCHECER") 
      reproducirVideos("anochecer") 
     else: 
      pass 
    print("Fin de programa") 
    GPIO.cleanup() #Limpiar los GPIO 


programaPrincipal()       #Llamamos a la funcion blinkLeds para ejecutar el programa 

여기에 내 문제가 있습니다.

버튼 1과 같이 버튼 1을 누르면 전체 동영상 1이 화면에서 제대로 재생되기 시작합니다. video1이 실행되는 동안 아무 버튼이나 누르면 아무 일도 일어나지 않습니다. 내가 원했던 것은 프로토 보드에있는 버튼을 누를 때마다 omxplayer가 비디오 재생을 중지하고 새로운 재생을 시작해야한다는 것입니다. 그들은 다음 링크에 있지만 성공하지 말처럼

나는 파이프를 사용하여 omxplayer 살인에 대해 뭔가를 읽고 : 어떤 도움을 이해할 수있을 것이다

How can I kill omxplayer by Python Subprocess

답변

1

내가 추측하지만 당신이 해키 비트 omxplayer를 실행하기 전에 killall을 시도 했습니까?

command = "killall omxplayer; omxplayer -p -o hdmi %s/%s.mp4" % (pathVideos,nameVideo) 
os.system(command) 
+0

감사합니다. 위의 코드에도 불구하고 의도 한대로 작동하지 않았습니다. 제대로 작동하는 또 다른 솔루션으로 나를 데려갔습니다. – Iker

0

가 나는 또한 Command2를의 종료시 & 추가

def reproducirVideos(nameVideo): 
    command1 = "sudo killall -s 9 omxplayer.bin" 
    os.system(command1) 
    command2 = "omxplayer -p -o hdmi %s/%s.mp4 &" % (pathVideos,nameVideo) 
    os.system(command2) 
    print "Reproduciendo el Video: %s " % nameVideo 

omxplayer 임의의 프로세스를 종료하기 위해 reproducirVideos()는 다음 코드 함수를 수정 명령이 배경에서 실행되도록하려면

약간 "해킹"했지만 나를 위해 제대로 작동했습니다.

0

제 솔루션은 비디오를 세션 ID로 지정하여 나중에 ID로 프로세스를 종료 할 수 있도록하는 것입니다. 다음은 간단한 비디오 리피터입니다.

import os, signal, subprocess 
import pifacedigitalio as pfd 
from time import sleep 

# Import movie names from /home/pi/video in alphabetical order. Note that movie 0 will loop when another is not playing. 
names = [f for f in os.listdir('/home/pi/video') if os.path.isfile(os.path.join('/home/pi/video', f))] 
movies = ['/home/pi/video/{name}'.format(name=name) for name in names] 
movies.sort() 

pfd.init() 
loopMovie = 0 
sleep (10) 

# Start first instance of movie 0. Note that all processes started get a session ID so they can all be killed together with killpg. 
# Add '-o', 'local' to the omxplayer operators to get local audio (headphone jack) instead of HDMI 
playProcess=subprocess.Popen(['omxplayer','-b',movies [loopMovie]], stdout=subprocess.PIPE, preexec_fn=os.setsid) 

while True : 
    # One piFace import board has 8 inputs numbered 0-7 
    for b in range (8) : 
     if pfd.digital_read(b) == 1 and b + 1 < len(movies) : 
     if playProcess.poll() != 0 : os.killpg(os.getpgid(playProcess.pid), signal.SIGTERM) 
     playProcess=subprocess.Popen(['omxplayer','-b', '-o', 'local', movies [b+1]], stdout=subprocess.PIPE, preexec_fn=os.setsid) 
    # if nothing is playing, restart movie 0. 
    if playProcess.poll() == 0 : 
     playProcess=subprocess.Popen(['omxplayer','-b',movies [0]], stdout=subprocess.PIPE, preexec_fn=os.setsid) 
    sleep (.1) 
관련 문제