我已经使用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,因为它不是一个套接字。 任何更多帮助修复子进程输入/输出问题将不胜感激。
答案 0 :(得分:0)
不确定,但我认为问题是管道是缓冲的。我看到你试图通过发送换行符并调用flush()来解决stdin方面的这个问题。也许这还不够。尝试发送8 KB的换行符。
对于readline(),您需要一个行尾字符(' \ n')但mplayer通常会将其进度信息写在同一行(使用' \ r' )。
必须能够直接输入和输出子进程(无缓冲区),因为终端应用程序可以立即打印输出。它可能涉及将您的进程附加到伪终端设备。一个起点可能是 How to use pseudo-terminals in Linux with C?