使用Python子流程冻结到FFMPEG的管道

使用Python子流程冻结到FFMPEG的管道,python,ffmpeg,subprocess,Python,Ffmpeg,Subprocess,通过以下代码,我能够使用Python、Numpy和FFMPEG二进制文件将视频帧传输到FFMPEG: from __future__ import print_function import subprocess import numpy as np import sys npshape = [480, 480] cmd_out = ['ffmpeg', '-y', # (optional) overwrite output file if it exists

通过以下代码,我能够使用Python、Numpy和FFMPEG二进制文件将视频帧传输到FFMPEG:

from __future__ import print_function
import subprocess
import numpy as np
import sys

npshape = [480, 480]
cmd_out = ['ffmpeg',
           '-y', # (optional) overwrite output file if it exists
           '-f', 'rawvideo',
           '-vcodec','rawvideo',
           '-s', '%dx%d'%(npshape[1], npshape[0]), # size of one frame
           '-pix_fmt', 'rgb24',
           '-r', '24', # frames per second
           '-i', '-', # The input comes from a pipe
           '-an', # Tells FFMPEG not to expect any audio
           '-vcodec', 'mpeg4',
           'output.mp4']

fout = subprocess.Popen(cmd_out, stdin=subprocess.PIPE, stderr=subprocess.PIPE).stdin

for i in range(24*40):
    if i%(24)==0: 
        print('%d'%(i/24), end=' ')
        sys.stdout.flush()

    fout.write((np.random.random(npshape[0]*npshape[1]*3)*128).astype('uint8').tostring())

fout.close()

如果我写的帧少于37秒,这就行了,但是如果我尝试写更多的帧,代码就会挂起。这种行为的根本原因是什么?如何修复它?

极有可能的罪魁祸首是臭烘烘的
子流程.Popen
行。您不仅忽略了它的返回值(为了确保子流程在某个点完成和/或检查其退出代码,您永远不能忽略它),而且还将
stderr
设为管道,但从不读取它,因此当缓冲区填满时,进程必须挂起

这应该可以解决这个问题:

p = subprocess.Popen(cmd_out, stdin=subprocess.PIPE)
fout = p.stdin

<...>

fout.close()
p.wait()
if p.returncode !=0: raise subprocess.CalledProcessError(p.returncode,cmd_out)
p=subprocess.Popen(cmd\u out,stdin=subprocess.PIPE)
fout=p.stdin
fout.close()
p、 等等
如果p.returncode=0:raise SUBSPROCESS.CalledProcessError(p.returncode,cmd\U out)

A tell:
stderr=subprocess.PIPE
,然后完全忽略它会导致灾难。谢谢,它很管用!从现在起,这将是我处理Python管道的标准方法。