Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过ffmpeg管道将视频输出流到Python脚本中,以供分析。如何将管道导入python?_Python_Bash_Python 2.7 - Fatal编程技术网

通过ffmpeg管道将视频输出流到Python脚本中,以供分析。如何将管道导入python?

通过ffmpeg管道将视频输出流到Python脚本中,以供分析。如何将管道导入python?,python,bash,python-2.7,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(),.

我正在与其他库一起编写一个脚本,它需要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设备”在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)
我知道上面的管道是不需要的,可能可以用替换。(我已经试过了)

不管这两种情况如何,它通常会给出输出,这会导致

image.reshape(576,720,3) 
接收不规则尺寸,且不得达到规定的720x576。我必须承认这是第一次在python中使用管道。据我所知,stderr被抑制,因为我已经指定了image2pipe


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

而不是编写字符串,然后
.split()
-ing它,只需传递一个适当的数组即可开始:

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

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

而不是先写字符串,然后再
.split()
-ing它,只需传递一个适当的数组即可开始:

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

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

Curtesy of@Grisha Levit:答案是只需删除 不要先写入字符串,然后.split()-将其拆分,只需传递一个适当的数组即可:

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

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

Curtesy of@Grisha Levit:答案是只需删除 不要先写入字符串,然后.split()-将其拆分,只需传递一个适当的数组即可:

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

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

也没有,因为“OEM Device”传递给ffmpeg,而不是没有的名称,我也尝试将两者都删除。仅后跟错误:AttributeError:'NoneType'对象没有属性'read'也没有训练,因为“OEM设备”被传递到ffmpeg,而不是没有属性的名称“,我也试着把两者都去掉。仅后跟错误:AttributeError:“非类型”对象没有属性“读取”。编辑结果是我的打字错误。我以前尝试使用video=和“OEM设备”作为单独的拆分。另外,pipe.stdout.read()需要一个声明,在意识到自己的错误之前,我错过了一秒钟。谢谢Grisha Levit。[dshow@000000000 25530c0]在类型为video的源设备中找不到名为[“OEM设备”]的视频设备。video=“OEM设备”:I/O错误没有训练,因为“OEM设备”被传递到ffmpeg,而不是没有的名称”,我也尝试删除这两个。仅后跟错误:AttributeError:“NoneType”对象没有属性“read”也没有训练,因为“OEM设备”被传递到ffmpeg,而不是没有的名称“,我也试着把它们都去掉。仅后跟错误:AttributeError:“非类型”对象没有属性“读取”。编辑结果是我的打字错误。我以前尝试使用video=和“OEM设备”作为单独的拆分。另外,pipe.stdout.read()需要一个声明,在意识到自己的错误之前,我错过了一秒钟。谢谢Grisha Levit。[dshow@000000000 25530c0]在类型为video的源设备中找不到名为[“OEM设备”]的视频设备。video=“OEM设备”:I/O错误