我有一个Python 3.6程序,它使用ffplay
命令从ffmpeg库调用Popen
。
我想发送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秒。代码有什么问题?
答案 0 :(得分:1)
向附加ffplay
的{{1}}进程发送转义击键将无法执行任何操作。要验证这一点,请执行-nodisp
并尝试按下转义键。它显然注册,但程序并不关心。所以这种行为是可以预料的。
此外,所有按键都由GUI注册ffplay -nodisp examples/sounds/Fantascape_Looping.mp3
,因此您传入的任何内容都不重要(禁止在Unix系统上使用Control-C等默认设置)。
要解决您的问题,您需要避免尝试将击键发送到ffplay
。其中一个(相当粗略的)解决方案是直接终止进程,但这显然只能用于停止播放。
ffplay
除了this mailing list question之外,我找不到任何关于控制my_subprocess.terminate() # replacing your writing to stdin
播放的内容,除了https://laravel.com/docs/5.5/authentication#protecting-routes之外还没有答案,它会询问以下内容。
是否有办法让ffplay接受播放控制 终端而不是播放器窗口?与ffmeg的相似之处 可以接受stdin输入来控制过滤器。
这让我相信你可能想要在StackOverflow上没有ffplay
的显示来询问有关播放控制的另一个问题(我没有答案),或者使用不同的库。< / p>
由于您无法控制ffplay
-novid
进程,我可以考虑的唯一合理解决方案是限制停止播放问题的直接范围。