用于mplayer进程的Python Subprocess stdout PIPE

时间:2015-06-16 22:17:15

标签: python subprocess mplayer

我已经使用tkinter编写了以下代码作为mplayer的前端。但是,我一直试图使用来自mplayer的'get_time_pos'之类的命令,因为答案非常零星地写入PIPE。我的意思是,有时它根本不会写它,直到程序关闭才会被读取,有时它会被读取。但每次,视频暂停,即使暂停的切换设置为播放(因为它已经暂停),因为传入另一个命令(获取时间pos)。

我很茫然,老实说,不知道如何解决这个问题,甚至不知道如何充分描述这个问题......

关注:我只通过发布相关的代码部分来修改帖子

from Tkinter import *
from ttk import Frame
from tkFileDialog import askopenfilename, askopenfile
from tkMessageBox import showerror, showinfo
from subprocess import *
from threading import Thread
from Queue import Queue, Empty, LifoQueue
import os, sys
import socket
import select

def command_player(self, comd):
    if self.mplayer_isrunning():
        try:
            self.player_process.stdin.write("%s\r\n"%comd)
            self.player_process.stdin.flush()
        except :
            showerror("Error","Error passing command to mplayer\n%s"%sys.exc_info()[1])

self.player_process = Popen(["mplayer","-fs","-slave","-quiet","-wid",str(winid),self.filenm],stdin=PIPE, stdout=PIPE)

#TRYING TO GET VIDEO POSITION IN TERMS OF % AND THEN PAUSE
self.command_player("get_percent_pos")
output = self.player_process.stdout.readline()
self.command_player("pause")

以上确实读取了百分比位置,但无论如何它始终保持视频暂停。如果我只保留暂停命令,则暂停按预期工作(它会切换黑白播放和暂停)

此外,select()部分是我尝试不同的方式,但它不适用于Windows,因为它不是一个套接字。 任何更多帮助修复子进程输入/输出问题将不胜感激。

1 个答案:

答案 0 :(得分:0)

不确定,但我认为问题是管道是缓冲的。我看到你试图通过发送换行符并调用flush()来解决stdin方面的这个问题。也许这还不够。尝试发送8 KB的换行符。

对于readline(),您需要一个行尾字符(' \ n')但mplayer通常会将其进度信息写在同一行(使用' \ r' )。

必须能够直接输入和输出子进程(无缓冲区),因为终端应用程序可以立即打印输出。它可能涉及将您的进程附加到伪终端设备。一个起点可能是 How to use pseudo-terminals in Linux with C?