Hello GStreamer forums,
I’m a new member and would appreciate your assistance with the following code:
import sys
import numpy as np
import pyzed.sl as sl
import cv2
import gi
gi.require_version(‘Gst’, ‘1.0’)
gi.require_version(‘GstRtspServer’, ‘1.0’)
from gi.repository import Gst, GstRtspServer, GObject
def main():
# Create a ZED camera object
zed = sl.Camera()
init = sl.InitParameters()
init.camera_resolution = sl.RESOLUTION.HD720
init.camera_fps = 30
init.set_from_serial_number(serial)
# Open the camera
err = zed.open(init)
if err != sl.ERROR_CODE.SUCCESS:
print(repr(err))
zed.close()
exit(1)
# Set runtime parameters
runtime = sl.RuntimeParameters()
# Image size
image_size = sl.Resolution(1280, 720)
image_size_out = sl.Resolution(1280, 720)
# Create sl.Mat matrices
image_zed = sl.Mat(image_size.width, image_size.height, sl.MAT_TYPE.U8_C4)
image_zed_out = sl.Mat(image_size_out.width, image_size_out.height, sl.MAT_TYPE.U8_C4)
# Configure GStreamer pipeline
out_send = cv2.VideoWriter(
'appsrc is-live=false ! videoconvert ! video/x-raw,format=YUY2,width=1280,height=720,framerate=30/1 ! '
'nvvidconv ! nvv4l2h264enc insert-sps-pps=1 bitrate=9000000 ! video/x-h264, '
'stream-format=byte-stream ! rtph264pay config-interval=1 ! '
'udpsink host=(ip) port=3000',
cv2.CAP_GSTREAMER, 0, 30, (1280, 720), True)
if not out_send.isOpened():
print('VideoWriter not opened')
exit(0)
rtsp_port_num = 3000
# Set up RTSP server
server = GstRtspServer.RTSPServer.new()
server.props.service = "%d" % rtsp_port_num
server.attach(None)
codec = "H264"
updsink_port_num = 3000
factory = GstRtspServer.RTSPMediaFactory.new()
factory.set_launch(
"(udpsrc name=pay0 port=%d buffer-size=524288 caps=\"application/x-rtp, media=video, clock-rate=90000, encoding-name=(string)%s, payload=96 \" )"
% (updsink_port_num, codec))
factory.set_shared(True)
server.get_mount_points().add_factory("/ds-test", factory)
# Output RTSP info
print("\n *** Launched RTSP Streaming at rtsp://localhost:%d/ds-test ***\n\n" % rtsp_port_num)
key = ' '
while True:
err = zed.grab(runtime)
if err == sl.ERROR_CODE.SUCCESS:
# Retrieve images
zed.retrieve_image(image_zed, sl.VIEW.LEFT, sl.MEM.CPU, image_size)
zed.retrieve_image(image_zed_out, sl.VIEW.LEFT)
# Convert sl.Mat to numpy array for OpenCV
image_ocv = image_zed.get_data()
image_ocv_out = image_zed_out.get_data()
# Convert RGBA to RGB
image_RGB = cv2.cvtColor(image_ocv_out, cv2.COLOR_RGBA2RGB)
# Stream using RTSP
out_send.write(image_RGB)
key = cv2.waitKey(1)
cv2.destroyAllWindows()
zed.close()
if name == “main”:
main()
I am able to stream the video locally using VLC on another machine over the local network, and the stream works well with a small delay that is currently acceptable. However, my main concern is finding a way to stream the video to a web browser without relying on VLC. I have tried various methods without success, and I would greatly appreciate your guidance to achieve this.
Additional Information:
- I need to use the ZED SDK to leverage its depth mapping and other features, so removing it from the code is not an option.
- Due to bandwidth limitations, I must use high-efficiency encoding such as H.264.
Thank you in advance for your support!