我正在尝试为FFMPEG
编写一个gui。我使用pythons子进程为我想要的每个转换创建一个ffmpeg进程。这很好,但我也希望有一种方法来获得转换的进度,无论转换是否失败等等。我想我可以这样访问进程的stdout:
调用subprocess.Popen()
# Convert - Calls FFMPEG with current settings. (in a seperate
# thread.)
def convert(self):
# Check if options are valid
if self.input == "" or self.output == "":
return False
# Make the command string
ffmpegString = self.makeString()
# Try to open with these settings
try:
self.ffmpeg = subprocess.Popen(ffmpegString, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
except OSError:
self.error.append("OSError: ")
except ValueError:
self.error.append("ValueError: Couldn't call FFMPEG with these parameters")
# Convert process should be running now.
以及阅读stdout
:
convert = Convert()
convert.input = "test.ogv"
convert.output = "test.mp4"
convert.output_size = (0, 0)
convert.convert()
while 1:
print convert.ffmpeg.stdout.readline()
这是可行的,但是ffmpeg的状态不显示。我想这和ffmpeg刷新它的方式有关。有办法进入吗?
我经常注意到读取标准输出(甚至标准错误)时出现的问题对于子流程,由于缓冲问题很难解决。当我确实需要从子进程中读取此类stdout/stderr时,我最喜欢的解决方案是切换到使用,而不是} (或者,在Windows上,^{} )。
subprocess
、^{只需将universal_newlines=True添加到您的子流程中。
现在你可以循环排队了,比如:
使用time=值确定进度百分比。
我认为您不能使用readline,因为ffmpeg从不打印一行,状态是通过写入(carrige return)然后再次写入行来更新的。
如果检查上面的行,您会注意到只有一个行,并且在文件转换完成时会打印该行。
相关问题 更多 >
编程相关推荐