如何使用 Python 在 Raspberry Pi 上杀死 omxplayer 播放器

Posted

技术标签:

【中文标题】如何使用 Python 在 Raspberry Pi 上杀死 omxplayer 播放器【英文标题】:How can I kill omxplayer player on a Raspberry Pi using Python 【发布时间】:2017-01-23 18:06:09 【问题描述】:

我正在使用 Raspberry Pi 3 进行 DIY 项目,我需要使用 omxplayer 播放 4 个视频。

当您按下原型板上的某个按钮时,每个视频都会播放:

按下按钮 1 - 播放视频 1 按下按钮 2 - 播放视频 2 按下按钮 3 - 播放视频 3 按下按钮 4 - 播放视频 4

每当我使用以下 python 代码按下任何按钮时,我都会成功播放 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 开始在屏幕上正常播放。如果我在 video1 运行时按下任何按钮,则不会发生任何事情。我想要实现的是,每当我按下原型板上的任何按钮时,omxplayer 都应该停止复制任何视频(如果正在播放)并开始一个新视频。

我已经阅读了一些关于使用 PIPE 杀死 omxplayer 的内容,就像他们在以下链接中所说的那样,但没有成功:

How can I kill omxplayer by Python Subprocess

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

我想有点hacky,但你有没有在运行omxplayer之前尝试killall?

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

【讨论】:

谢谢你,马茨!尽管上面的代码没有按预期工作。它把我带到了另一个正常工作的解决方案。【参考方案2】:

我用以下代码修改了 reproducirVideos() 函数,以杀死 omxplayer 的任何进程

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

我还在 command2 的末尾添加了 & 以使命令在后台运行

有点“hacky”但对我来说工作正常:)

【讨论】:

【参考方案3】:

我的解决方案是给视频一个会话 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)

【讨论】:

以上是关于如何使用 Python 在 Raspberry Pi 上杀死 omxplayer 播放器的主要内容,如果未能解决你的问题,请参考以下文章

python 如何检查您的Raspberry Pi版本

使用 Raspberry Pi 将图像发送到 Python 中的 QL-800 打印机时如何解码此错误?

在Raspberry Pi上使用python3进行Bash

Raspberry 4B安装wiringPi库 和 python-dev包

使用物理按钮在不同的循环之间切换(Raspberry / Python)

使用python3在Raspberry Pi上打开和关闭Tkinter GUI