使用Python和OpenCV从网络摄像头流式传输到GStreamer shmsink

问题描述 投票:0回答:1

我只能使用 GStreamer 将视频从网络摄像头流式传输到 shmsink:

# Sender:
gst-launch-1.0 v4l2src ! "video/x-raw,format=YUY2,color-matrix=sdtv,chroma-site=mpeg2,width=(int)320, \
  height=(int)240,framerate=(fraction)30/1"  ! shmsink socket-path=/tmp/blah shm-size=2000000

# Receiver to verify:
gst-launch-1.0 shmsrc socket-path=/tmp/blah \
  ! "video/x-raw,format=YUY2,color-matrix=sdtv,chroma-site=mpeg2,width=(int)320,height=(int)240,framerate=(fraction)30/1" \
  ! queue ! videoconvert ! autovideosink

现在,需要使用 opencv 流式传输 numpy 数组,因此我只需将

v4l2src
替换为
appsrc
:

import time
import cv2

fps = 30.
frame_width = 320
frame_height = 240
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
cap.set(cv2.CAP_PROP_FPS, fps)

gst_str = "appsrc ! \"video/x-raw,format=YUY2,color-matrix=sdtv,chroma-site=mpeg2,width=(int)320, " \
          "height=(int)240,framerate=(fraction)30/1\" ! shmsink socket-path=/tmp/blah shm-size=2000000"

# Create VideoWriter as a SHM sink
out = cv2.VideoWriter(gst_str, cv2.CAP_GSTREAMER, fps, (frame_width, frame_height), True)

while True:
    ret, frame = cap.read()
    if ret:
        out.write(frame)
        cv2.imshow("Frame", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        print("Camera error.")
        time.sleep(10)

cap.release()

但这根本不会创建

/tmp/blah
文件。

知道为什么 opencv 不创建目标 shmsink 文件吗?

python opencv gstreamer shared-memory
1个回答
0
投票

是的,这个问题很老了。但在google上的排名还是很高的... 所以这里有一些故障排除指南:

  1. 使用“gst-launch-1.0”来测试管道是否存在语法错误。如果您的管道能够在命令行上运行,请先在 gst-launch 中运行它,然后再将其集成到您的应用程序中。

  2. 应用程序日志说什么?尝试使用 GST_DEBUG=3 或更高版本运行它,以获取 Gstreamer 内部运行情况的更多信息。 Linux 示例:“GST_DEBUG=4 ./myapplication”

  3. 检查您的应用程序是否具有在目标位置创建任何文件的正确文件系统权限。

  4. 检查文件是否已经存在。如果没有正确关闭,shm 插件有时会留下套接字。在这种情况下,它无法重用旧的套接字,并且将无法启动管道。

© www.soinside.com 2019 - 2024. All rights reserved.