【问题标题】:Sending keystrokes to subprocess using Python's popen使用 Python 的 popen 向子进程发送击键
【发布时间】:2018-09-19 12:46:50
【问题描述】:

我有一个 Python 3.6 程序,它使用 Popen 命令从 ffmpeg 库中调用 ffplay

我想发送ffplay 击键,以便我可以控制播放。但似乎什么也没有发生。举个例子:

import subprocess
import time

# Array with the command in it
my_command = ("ffplay", "-nodisp", "-autoexit", "examples/sounds/Fantascape_Looping.mp3")

# Open a subprocess
my_subprocess = subprocess.Popen(my_command, 
                                 stdin=subprocess.PIPE, 
                                 stdout=subprocess.PIPE, 
                                 stderr=subprocess.PIPE)

# Wait 2 seconds
time.sleep(2)

# Try to send an escape:
print("Attempt to send and 'escape' to stop the sound")
my_subprocess.stdin.write(b'\x1b')

# Wait and see what happens
print("Should no longer hear anything")
time.sleep(5)

我听音乐 7 秒,而不是 2 秒。代码有什么问题?

【问题讨论】:

    标签: python ffmpeg popen


    【解决方案1】:

    向附加了-nodispffplay 进程发送转义键不会执行任何操作。要验证这一点,请执行ffplay -nodisp examples/sounds/Fantascape_Looping.mp3 并尝试按下您的转义键。它显然注册了,但程序并不关心。所以这种行为是意料之中的。

    此外,GUI 为ffplay 注册了所有击键,因此您输入的任何内容都无关紧要(除非在 Unix 系统上使用 Control-C 等默认设置)。

    要解决您的问题,您需要避免尝试将击键发送到ffplay。一种这样的(相当粗略的)解决方案是直接终止进程,但这显然只适用于停止播放。

    my_subprocess.terminate()  # replacing your writing to stdin
    

    除了this mailing list question,我找不到任何关于在没有显示器的情况下控制ffplay 播放的信息,它还没有答案,它会询问以下内容。

    有没有办法让 ffplay 接受来自 终端而不是播放器窗口?类似于 ffmeg 将如何 可以接受标准输入来控制过滤器。

    这让我相信您可能想在 StackOverflow 上针对ffplay 此处提出关于不显示播放控制的另一个问题(我对此没有答案),或者使用其他库。

    仅限于您​​停止播放问题的直接范围,鉴于您无法控制 -novid ffplay 进程,我能提出的唯一合理解决方案是终止进程。

    【讨论】:

    • 至少在 Ubuntu 17 上,ffplay 使用 -nodisp 选项可以很好地抓取击键。我确实想知道输入是否以某种不允许管道工作的方式完成。
    • 这很奇怪。在我运行 Ubuntu 17.10 的系统上,当我运行 ffplay -nodisp sound.mp3 时,它会抓取按键但不响应它们。
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2014-05-26
    • 1970-01-01
    相关资源
    最近更新 更多