2

好的,所以我的google-fu真的很烂,我找不到答案,希望你们能帮助我^_^

好的,所以我认为一个简单的脚本似乎无法正确地与其子进程通信,我正在逐行运行。我也在用mpg123播放器,这是一个Linux系统(嗯,树莓派)

    from subprocess import Popen, PIPE, STDOUT
    p = Popen(["mpg123", "-C", "test.mp3"], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    #wait a few seconds to enter this, "q" without a newline is how the controls for the player work to quit out if it were ran like "mpg123 -C test.mp3" on the command line
    p.communicate(input='q')[0]

我可以在它上面运行 stdout.read() 就好了,但是使用通信输入只会让它挂起,而 p.stdin.write('q') 似乎什么也没做。这是与 python 相关的,尽管我觉得我也没有在 mpg123 文档中找到正确的位置。请善待,因为我对此非常陌生^_^

4

2 回答 2

0

Check what arguments your mpg123 version understands. The following works on my machine:

#!/usr/bin/env python3
import time
from subprocess import Popen, PIPE, DEVNULL, STDOUT

p = Popen(["mpg123", "-K", "test.mp3"], stdin=PIPE, stdout=DEVNULL, stderr=STDOUT)

# wait a little
time.sleep(3)

# send command "Skip song", wait for the player to exit
p.communicate(b'n')[0]

It starts playing the file, waits ~3 seconds, and exits.

于 2013-06-18T06:14:16.303 回答
0

这是一个糟糕的解决方案,但它在紧要关头起作用。我将其用作补丁,因为出于某种原因,我无法让 Python 库在我的 Raspberry Pi 上正常运行。

如果您mpg123以远程模式 ( mpg123 -R) 启动,则可以更轻松地向其发送命令:

proc = sp.Popen(["mpg123", "-R"], stdin=sp.PIPE)

然后,您可以向其stdin属性发送命令。

笔记:

  • 命令不一样。暂停,例如"pause",不是。" "在控制台中运行mpg123 -R,然后向其发送help命令以查看命令列表。
  • 命令需要换行符终止。

从文档:

-R,--远程

激活通用控制接口。mpg123 然后将从标准输入读取并执行命令。基本用法是 ''load'' 播放一些文件和明显的 ''pause''、'' 命令。''jump'' 将跳转/寻找给定点(MPEG 帧号)。发出“帮助”以获取命令和语法的完整列表。

于 2021-04-12T18:14:13.743 回答