Трансляция с веб-камеры на канал GStreamer с помощью Python и OpenCV

#python #opencv #gstreamer #shared-memory

Вопрос:

Я смог использовать 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
 

Теперь нужно передавать массивы numpy с помощью opencv, так что я просто заменил 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) amp; 0xFF == ord('q'):
            break
    else:
        print("Camera error.")
        time.sleep(10)

cap.release()

 

Но это вообще не создает /tmp/blah файл.

Есть идеи, почему opencv не создает целевой файл shmsink?