我需要使用ffmpeg/avconv将jpg帧传输到python PIL(Pillow)Image对象,使用gst作为中介*.我一直在寻找这个答案而没有太多运气.我想我很接近 - 但我被困住了.使用Python 2.7
我从python启动的理想管道如下所示:
我将控制的前几个步骤作为单个命令,将.jpgs写入磁盘的速度与硬件允许的速度一样快.
该命令看起来像这样:
command = [
"ffmpeg",
"-f video4linux2",
"-r 30",
"-video_size 1280x720",
"-pixel_format 'uyvy422'",
"-i /dev/video0",
"-vf fps=30",
"-f H264",
"-vcodec libx264",
"-preset ultrafast",
"pipe:1 -",
"|", # Pipe to GST
"gst-launch-1.0 fdsrc !",
"video/x-h264,framerate=30/1,stream-format=byte-stream !",
"decodebin ! videorate ! video/x-raw,framerate=30/1 !",
"videoconvert !",
"jpegenc quality=55 !",
"multifilesink location=" + Utils.live_sync_path + "live_%04d.jpg"
]
Run Code Online (Sandbox Code Playgroud)
如果使用popen或os.system运行,这将成功将帧写入磁盘.
但是我没有将帧写入磁盘,而是想要捕获我的子进程管道中的输出,并在写入时将帧读取到类似文件的缓冲区中,然后由PIL读取.
像这样的东西:
import subprocess as …Run Code Online (Sandbox Code Playgroud) OpenCV无法在Linux上为超过8个网络摄像头打开VideoCaptures.这是一个简单的例子:
# "opencap.py"
import cv2, sys
dev = int(sys.argv[1])
cap = cv2.VideoCapture(dev)
print "device %d: %s" %(dev, "success" if cap.isOpened() else "failure")
Run Code Online (Sandbox Code Playgroud)
对于我的设置(OpenCV 2.4.11,Ubuntu 14.04),例如9个网络摄像头,opencap.py成功进行了前8个网络摄像头(0-7),但对于最后一个我获得
> python opencap.py 8
HIGHGUI ERROR: V4L: index 8 is not correct!
device 8: failure
Run Code Online (Sandbox Code Playgroud)
注意:v4l2-ctl --list-devices正确列出9个网络摄像头(/ dev/video0,...,/ dev/video8).