FFMPEG和Pythons子流程

2024-04-26 01:35:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为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刷新它的方式有关。有办法进入吗?


Tags: selfconvertinputoutputifsettings进程with
3条回答

我经常注意到读取标准输出(甚至标准错误)时出现的问题对于子流程,由于缓冲问题很难解决。当我确实需要从子进程中读取此类stdout/stderr时,我最喜欢的解决方案是切换到使用,而不是subprocess^{}(或者,在Windows上,^{})。

只需将universal_newlines=True添加到您的子流程中。

cmd="ffmpeg -i in.mp4 -y out.avi"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True)
for line in process.stdout:
    print(line)

现在你可以循环排队了,比如:

frame= 1900 fps=453 q=18.6 Lsize=    3473kB time=00:01:16.08 bitrate= 373.9kbits/s

使用time=值确定进度百分比。

我认为您不能使用readline,因为ffmpeg从不打印一行,状态是通过写入(carrige return)然后再次写入行来更新的。

size=      68kB time=0.39 bitrate=1412.1kbits/s    \rsize=    2786kB time=16.17 bitrate=1411.2kbits/s    \rsize=    5472kB time=31.76 bitrate=1411.2kbits/s    \r\n

如果检查上面的行,您会注意到只有一个行,并且在文件转换完成时会打印该行。

相关问题 更多 >

    热门问题