isPipelinePlaying OpenCV | GStreamer warning

281 Views Asked by At

I am getting the following warning:

[ WARN:[email protected]] global /private/var/folders/sy/f16zz6x50xz3113nwtb9bvq00000gp/T/abs_506zufg7xt/croots/recipe/opencv-suite_1664548331847/work/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created

I am attempting to run the following code on my MacBook Pro with MacOS 10.15.7 to stream video from a pycamera on my raspberrypi to my MacBook in order to use it as a virtual camera:

import cv2
import numpy as np
import io
import socket
import struct
import time
from Quartz import CoreVideo
import CoreMedia

IMG_W = 1280
IMG_H = 720

server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8000))
server_socket.listen(0)

connection = server_socket.accept()[0].makefile('rb')

cam = cv2.VideoCapture(0)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, IMG_W)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, IMG_H)

try:
        display_link = CoreVideo.CVDisplayLinkCreateWithActiveCGDisplays(None)
        while True:
                ret, frame = cam.read()
                flipped = cv2.flip(frame, 1)
                if frame is not None:
                        print("frame is not None, proceed with flip")
                        flipped = cv2.flip(frame, 1)
                        frame[0 : IMG_H, IMG_W//2 : IMG_W] = flipped[0 : IMG_H, IMG_W//2 : IMG_W]
                else:
                        print("frame is None, skipping flip")
                # Read the length of the image as a 32-bit unsigned int.
                image_len_packed = connection.read(struct.calcsize('<L'))
                if not image_len_packed:
                        break
                image_len = struct.unpack('<L', image_len_packed)[0]
                # Read the image data.
                image_stream = io.BytesIO()
                remaining = image_len
                while remaining > 0:
                        chunk = connection.read(min(remaining, 4096))
                        if not chunk:
                                break
                        image_stream.write(chunk)
                        remaining -= len(chunk)
                # Rewind the stream
                image_stream.seek(0)

                image = np.array(bytearray(image_stream.read()), dtype=np.uint8)
                frame = cv2.imdecode(image, cv2.IMREAD_COLOR)
                # Resize the frame to the desired size for the virtual camera
                if frame is not None and frame.shape == (IMG_H, IMG_W, 3):
                        print("frame is not None and has correct shape")
                        frame = cv2.resize(frame, (IMG_W, IMG_H))
                else:
                        print("frame is None or has incorrect shape, skipping resize")
                # Convert the frame to a format suitable for OS X's AVFoundation framework
                if frame is not None and frame.shape[0] > 0 and frame.shape[1] > 0:
                        print("frame is not None and has dimensions")
                        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
                else:
                        print("frame is None or has no dimensions, skipping cvtColor")

                # Create a `CVPixelBuffer` from the image data
                if frame is not None:
                        print("frame and pixel_buffer are not none")
                        pixel_buffer = CoreVideo.CVPixelBufferCreateWithBytes(
                                IMG_W, IMG_H, CoreVideo.kCVPixelFormatType_32BGRA,
                                frame.tobytes(), frame.strides[0],
                                None, None, None, None, None,
                        )

                        # Create a `CMSampleBuffer` from the pixel buffer
                        sample_buffer = CoreMedia.CMSampleBufferCreateForImageBuffer(
                                None, pixel_buffer, True, None, None,
                                CoreMedia.kCMSampleAttachmentKey_DisplayImmediately,
                        )

                        # Send the sample buffer to the virtual camera
                        CoreVideo.CVDisplayLinkStart(display_link)
                        CoreVideo.CVPixelBufferLockBaseAddress(pixel_buffer, 0)
                        CoreVideo.CVDisplayLinkRender(display_link, sample_buffer)
                        CoreVideo.CVPixelBufferUnlockBaseAddress(pixel_buffer, 0)
                        CoreVideo.CVDisplayLinkStop(display_link)
                else:
                        print("frame is None, skipping")

except Exception as e:
        print(e)

finally:
        cam.release()
        CoreVideo.CVDisplayLinkStop(display_link)
        CoreVideo.CVDisplayLinkRelease(display_link)

And here is my corresponding code that I am running on my RaspberryPi to transmit the stream:

import io
import socket
import struct
import time
import picamera

# Create a socket connection between the Raspberry Pi and the computer
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('10.37.68.171', 8000))
connection = client_socket.makefile('wb')

try:
    with picamera.PiCamera() as camera:
        camera.resolution = (640, 480)
        # Start a stream to the socket
        camera.start_recording(connection, format='h264')
        while True:
            camera.wait_recording(1)
finally:
    camera.stop_recording()
    connection.close()
    client_socket.close()

First: How can I fix the warning? Or is it even necessary to fix it?

Second: Is there anything in general that I should be doing differently with my code in order to be able to use the stream as a virtual camera on my MacBook?

0

There are 0 best solutions below