omxplayer dbus控件在导出项目时停止工作

时间:2017-01-20 16:36:12

标签: python cron dbus omxplayer

我最近在我的树莓上做了一个项目来读取来自TCP / IP协议的4字节信号,并根据信号(0001,0002,0101或0102)播放足够的视频。

我有两个问题:

1-手动执行时代码工作正常但如果我使用cron在重启时启动代码,则代码正在运行,但无法正常工作。

2-代码工作(手动)在我编码的Pi上,但是如果我将文件传输到另一个Pis我需要它,我得到完全相同的错误(手动启动)就像我启动它一样通过1号皮尔的cron。

我在这里提到的执行错误如下:     dbus命令不会停止视频,它没有响应。

代码在python 3中,所有树莓都有完全相同的参数,我把文件放在第一个Pi上,然后将它们复制到其他文件上。

我的cron文件是

@reboot python /home/v1_M.py &

我的代码是:

from time import sleep
import subprocess
import os
import socket
import sys

play_video1 = None
play_video2 = None
play_video3 = None
play_video4 = None

vid_block = 0
check = None
data = None

try:

    while True:

        subprocess.Popen(["nc -l 1024 -i 1 > /home/resultat.txt"], shell=True)#Listens to port 1024 and writes data in txt file
    sleep(2)
    a=open('/home/resultat.txt','r')
    lines = a.readlines()
    a.close()
    if lines:
        signal = lines[-1]#signal in bytes
        data = signal[-4:]#converts signal to string
        #print (signal)
    subprocess.Popen(["> /home/resultat.txt"], shell=True)#Empties txt file

    #print (data)

    if data != check :
        vid_block = 0
        check = data

    if data == '0101' and vid_block == 0 : # video 1
        os.system('dbuscontrol.sh stop')
        play_video1 = subprocess.Popen(['omxplayer -o hdmi -r --no-osd --aspect-mode fill /home/misano_iway_v3.mp4'],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        shell=True)
        vid_block = 1

    elif data == '0102' and vid_block == 0 : # video 2
        os.system('dbuscontrol.sh stop')
        play_video2 = subprocess.Popen(['omxplayer -o hdmi -r --no-osd --aspect-mode fill /home/indy_iway_v2.mp4'],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        shell=True)
        vid_block = 1

    elif data == '0001' and vid_block == 0: # Video logo
        os.system('dbuscontrol stop')       
        play_video3 = subprocess.Popen(['omxplayer -r --no-osd --loop --aspect-mode fill /home/Logo.mp4'],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        shell=True)
        vid_block = 1

    elif data == '0002' and vid_block == 0: # Video logo
        os.system('dbuscontrol.sh stop')
        play_video4 = subprocess.Popen(['omxplayer -r --no-osd --loop --aspect-mode fill /home/Logo.mp4'],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE,
                        shell=True)
        vid_block = 1


except KeyboardInterrupt:
    print("Exit")
    data = None
    os.system('dbuscontrol.sh stop')

我知道我的代码不是很漂亮,但我对python和raspberry都很陌生,我只想让它现在正常工作,关于优化的idc。

如果你们能提供帮助,我真的很感激。

1 个答案:

答案 0 :(得分:0)

更新:没关系,我刚刚使用了os.system(' killall omxplayer.bin')

有点残酷,但工作正常,至少我很确定我没有任何剩余的未公开过程