2016-09-15 33 views
0

私はomplayerを使用して4つのビデオを再生する必要があるラズベリーパイ3を使用してDIYプロジェクトを行っています。Pythonを使用してラズベリーパイのomxplayerプレーヤーを殺すにはどうすればいいですか

あなたはprotoboard上の特定のボタンを押すと各ビデオが再生されます:

  • 押しボタン1 - ビデオ1
  • 押しボタン2を再生 - ビデオ2
  • 押しボタン3を再生 - ビデオを再生3
  • 押しボタン4 - ビデオ4

を再生する私は、私はいずれかのボタンを押すと、必ず4つの動画を再生するに成功しました次のPythonコードを使用してください。

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全体が画面上で正しく再生されます。 video1の実行中にいずれかのボタンを押すと、何も起こりません。私が達成したいのは、私がプロトボード上の任意のボタンを押すたびに、omxplayerはビデオの再生を停止し、新しい再生を開始することです。彼らは、以下のリンクではなく、成功せずに言うよう

私はPIPEを使用して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) 
関連する問題