1

对于我的一个项目,我需要一种创建自定义媒体播放器类的方法。为此,我创建了一个简单的类,该类使用给定的 url 调用 omxplayer 并写入标准输入字母,例如“p”暂停,“q”退出......等等这是我的代码

import subprocess
import time

class MediaPlayer():
        def __init__(self):
                self.url = None
                self.process = None
        def play(self, url):
                self.url = url
                self.process = subprocess.Popen(['omxplayer', '-o', 'local', self.url], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
        def stop(self):
                self.process.stdin.write('q'.encode())
        def toogle_pause(self):
                self.process.stdin.write(b'p')

url = "/home/pi/Desktop/IOS MIRROR/films/Game.of.Thrones.S01E02.HDTV.VF.avi"

print('start')
media_player = MediaPlayer()
media_player.play(url)
time.sleep(15)
print('pause')
media_player.toogle_pause()
time.sleep(2)
print('resume')
media_player.toogle_pause()
time.sleep(10)
print('stop')
media_player.stop()

当我执行命令时,这在 python2.7 上工作得很好

python omx.py

但是一旦我执行命令

python3 omx.py

我的写行都不起作用,视频播放但不会暂停和停止。没有打印错误,所以我真的被卡住了。有关信息,我使用的是由 Raspbian 提供支持的 Raspberry Pi 3。我需要它在 python3 上工作,因为我的 Mirror 项目正在使用 Python3

在此处输入图像描述

谢谢大家的回答!最好的问候,朱利安

4

1 回答 1

0

恢复这个是因为我刚遇到这个,我不相信 jasonharper 的评论给出了完整的答案。

原因是bufSizein的默认值Popen已从 python2 中的 0(无缓冲)更改为 python3 中的 1(行缓冲)。每次写入后调用stdin.flush()是一种解决方案,但可能更好的是在创建Popenby setting时明确设置它bufSize=0

这应该会导致脚本在 python2 和 3 中始终如一地工作。

于 2020-09-09T09:22:16.053 回答