通过ffmpeg管道将视频输出流到Python脚本中,以供分析。如何将管道导入python?
我正在与其他库一起编写一个脚本,它需要RGB24格式的帧或图像。为了提高兼容性,我决定允许外部管道将帧流式传输到这个程序中。每次在代码中更改设备或源代码都会变得单调乏味,使用解析器简单地指定源代码会导致语法错误。例如:通过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(),.
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错误