【发布时间】:2016-06-20 15:05:28
【问题描述】:
所以我使用 handbrake 和 python 根据时间表对视频进行编码。我需要监控进度,因为我用它来估计编码时间。然后我可以将它安装到我的调度程序中。
我在从流程中获取 ETA 和完成百分比时遇到问题。这是我到目前为止所拥有的
profile = ["HandBrakeCLI","-i",input,"-o","output","-e","x264"]
cp = subprocess.Popen(profile, stderr=subprocess.PIPE, bufsize=1)
for line in iter(cp.stderr.readline, b''):
# regex match for % complete and ETA
matches = re.match( r'.*(\d+\.\d+)\s%.*ETA\s(\d+)h(\d+)m(\d+)s', line.decode('utf-8') )
if matches:
print( matches.group() )
print(line),
cp.stderr.close()
cp.wait()
它不匹配,事实上我不完全确定发生了什么。当我运行我的脚本时,我看到了 ETA 和 % complete 打印输出
Encoding: task 1 of 1, 1.19 % (45.57 fps, avg 62.74 fps, ETA 00h08m01s)
我尝试过使用标准输出,但它也不起作用。
【问题讨论】:
-
我很确定问题是 Handbrake CLI 不会在每次进程进行一点时输出新的附加行,而是修改现有行。尝试在
for line in inter..之后立即打印该行,看看它实际上给了你什么。 -
这不会在 for 循环退出后给我输出吗?那么该过程何时完成?我想在这个过程中得到信息。
-
首先,你在迭代stderr,也许你需要迭代stdout。其次,我认为 cp.stderr.readline 会从子进程本身返回完整的行,而不是单个重复更新的行。我会在
handbreak进程完成后打印最后一行,看看它的外观。而且,正如我告诉你的,我会打印 for 循环中的每一行,以了解我实际收到的内容。 -
迭代标准输出不会打印出编码信息。我不明白你的意思,你能举个例子吗?
-
尝试删除第 5-13 行,而只输出
print(line),并告诉我它实际打印的时间和内容。
标签: python subprocess progress-bar handbrake