簡體   English   中英

適用於mplayer進程的Python子進程標准輸出PIPE

[英]Python Subprocess stdout PIPE for mplayer processes

我已經使用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上不起作用。 解決子流程輸入/輸出問題的任何其他幫助將不勝感激。

不確定,但我認為問題在於管道已緩沖。 我看到您正在嘗試通過發送換行符並調用flush()在標准輸入方面解決此問題。 也許這還不夠。 嘗試發送8 KB的換行符。

對於readline(),您需要一個行尾字符('\\ n'),但是mplayer通常將其進度信息寫在同一行上(帶有'\\ r')。

由於終端應用程序可以立即打印輸出,因此必須有可能直接(不使用緩沖區)進入和輸出子流程。 它可能涉及將您的進程附加到偽終端設備。 一個起點可能是如何在帶有C的Linux中使用偽終端?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM