跳至主要内容

请教一个python下面popen的问题


http://www.mitbbs.com/article_t/Programming/31501943.html

发信人: flamingoo (flamingo), 信区: Programming
标  题: 请教一个python下面popen的问题
发信站: BBS 未名空间站 (Fri Apr 28 12:09:00 2017, 美东)


也许对很多大牛来说是一个比较老的问题,不过对我来说是一个新问题。

起因是想从一个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下面的解决方案也不适用。







--
※ 修改:·flamingoo 於 Apr 28 12:12:20 2017 修改本文·[FROM: 23.]

评论