通过ffmpeg Pipe将视频输出流式传输到Python脚本中以进行分析。如何管道进入python?

时间:2017-01-24 15:27:24

标签: python bash python-2.7

我正在与其他库一起处理脚本,这些库需要RGB24格式的帧或图像。为了提高兼容性,我决定允许外部管道将帧流式传输到此程序中。每次在代码中更改设备或源代码都会变得乏味,并且使用解析器来简单地指定源会导致语法错误。例如:

ffmpeg -f dshow -i video="OEM Device" a.mpg

完全符合您的想法。但是在python的子进程中

pipe = sp.Popen('ffmpeg -f dshow -i video="OEM Device" a.mpg'.split(),...

修改 我试图手动拆分。 'video =“OEM Device”'在python中也不起作用。

导致'无效参数“OEM OEM 设备分隔为两个不同的变量/参数。我也尝试了替代名称。

这让我相信

是问题所在。 这导致我通过终端将视频流传输到python中。

ffmpeg -i a.mpg -f image2pipe -vcode rawvideo -pix_fmt rgb24 - |python myscript.py

这就是我在剧本中所拥有的。

import subprocess as sp
import numpy
import sys
import os
pipe = sp.Popen('ffmpeg -f rawvideo -pix_fmt rgb24 -an -vcodec rawvideo -i - -f image2pipe -pix_fmt rgb24 -an -vcodec rawvideo -'.split(), stdin=sys.stdin, stderr=sp.PIPE, stdout=sp.PIPE)
#Assumeing 720x576 resolution 
raw_img = pipe.stdout.read(720*576*3)
image = numpy.fromstring(raw_img, dtype='uint8')
img_load = image.reshape(576, 720, 3)

我知道不需要上面的管道,可能会被替换为。(我已尝试过)

raw_img = sys.stdin.read(720*576*3)

无论这两者通常给出输出,都会产生

image.reshape(576,720,3) 

接收不规则尺寸,而不是指定所需的720x576。我不得不承认这是第一次使用python管道。据我所知,stderr已被禁止,因为我已指定 image2pipe

如何让ffmpeg为python提供所需的维度或为子进程提供语法,这允许给定命令中的而不分割值或导致语法错误?

2 个答案:

答案 0 :(得分:0)

而不是写一个字符串然后.split() - 只需传递一个正确的数组开始:

.Popen(['ffmpeg', '-f', 'dshow', '-i', 'video="OEM Device"', 'a.mpg'], ...)

您正在调用的命令需要将video="OEM Device"视为其args数组中的单个元素,因此您需要将其作为单个元素传递给Popen args数组。

答案 1 :(得分:0)

@Grisha Levit的Curtesy:答案是简单地删除 而不是写一个字符串然后.split() - 只需传递一个正确的数组开始:

.Popen(['ffmpeg', '-f', 'dshow', '-i', 'video=OEM Device', 'a.mpg'], ...)

您正在调用的命令需要将'video = OEM Device'视为其args数组中的单个元素,因此您需要将其作为单个元素传递给Popen args数组。