我正在与其他库一起处理脚本,这些库需要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提供所需的维度或为子进程提供语法,这允许给定命令中的“而不分割值或导致语法错误?
答案 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数组。