f*******o 发帖数: 88 | 1 也许对很多大牛来说是一个比较老的问题,不过对我来说是一个新问题。
起因是想从一个video文件在任意时间点读取图像出来。 最开始是用opencv实现的,在
一些文件上测试也没有问题。后来换了一批h264格式的video文件就有问题了,很多文
件读取不出来。 在网上查了一下后,换成用moviepy来读取。 但是现在有新的问题是
就是moviepy在读取有些video文件在初始化阶段就死锁了。 跟踪进去,发现问题主要
出现在:
s = self.proc.stdout.read(nbytes) 语句时。
这个之前还有一堆初始化的代码, 主要是调用ffmpeg来执行并声称一个pipe.
def initialize(self, starttime=0):
"""Opens the file, creates the pipe. """
self.close() # if any
if starttime != 0 :
offset = min(1, starttime)
i_arg = ['-ss', "%.06f" % (starttime - offset),
'-i', self.filename,
'-ss', "%.06f" % offset]
else:
i_arg = [ '-i', self.filename]
cmd = ([get_setting("FFMPEG_BINARY")]+ i_arg +
['-loglevel', 'error',
'-f', 'image2pipe',
"-pix_fmt", self.pix_fmt,
'-vcodec', 'rawvideo', '-'])
popen_params = {"bufsize": self.bufsize,
"stdout": sp.PIPE,
"stderr": sp.PIPE,
"stdin": DEVNULL}
if os.name == "nt":
popen_params["creationflags"] = 0x08000000
self.proc = sp.Popen(cmd, **popen_params)
网上查了一下,这是一个老问题了, 好像用popen.stdout.read 造成死锁很容易发生
,但是解决方法没有一个统一的说法。 不知道各位大牛有没有相关的经验,或者提供
别的解决方法也行。
另外,现在系统是在windows下用的,所有有些linux下面的解决方案也不适用。 |
|