Help geeting OpenCV to output a videostream using gstreamer.

asked 2020-07-08 01:30:50 -0500

updated 2020-07-08 14:46:55 -0500

supra56 gravatar image

List, I am having a problem running gstreamer pipeline from Python 3 via OpenCv. I do not know gstreamer very well although I am somewhat comfortable with opencv. My issues stem from my ignorance not actual issue with Jetson TX2. I am working with Jetpack 4.4, running OpenCV 4.1.1 with gstreamer (unchanged build from Jetpack), and the Python version I am using is Python 3.6.9. On the hardware side I am using a devkit with Jetson TX2. The camera I am using is an ELP USB camera. The dev kit is headless. With this setup I am able to take pictures, record video, and stream video from the Jetson using gstreamer directly. My problem arises when I attempted to use it in python. Right now I am using a very simple python script to open my camera and stream video to another computer on the same network. My goal is to latter use a neural network I made to do detection, add bounding boxes, and pipe the post processed video via g streamer to another computer. I have tested a number of pipelines on command line and in general they work fine. When I add the pipeline to Python add attempt to use the same pipeline it errors out. For example I am using these pipelines for testing the USB web cam which is running off of a Jetson TX2.

gst-launch-1.0 v4l2src device=/dev/video0 ! ‘video/x-raw, format=YUY2’ ! nvvidconv ! ‘video/x-raw(memory:NVMM), width=640, height=480’ ! omxh264enc ! h264parse ! rtph264pay config-interval=1 ! udpsink host=192.168.86.26 port=5000

gst-launch-1.0 udpsrc port=5000 ! ‘application/x-rtp, encoding-name=H264, payload=96’ ! rtph264depay ! h264parse ! avdec_h264 ! xvimagesink

My goal is to get the output from my YOLO4 implementation to stream as HD264. Just trying some simple toy code I have been able to get video to write to file, albeit really bad. When I try streaming like the code below it seems to do nothing with the exception of this warning.

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (933) open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1

Here is the toy code.

import time
import cv2

fps = 30
frame_width = 640
frame_height = 480
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_rtp = "appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay !             
udpsink host=192.168.86.26 port=5000"

if cap.isOpened() is not True:
    print("Cannot open camera. Exiting.")
    quit()
out = cv2.VideoWriter(gst_str_rtp, 0, fps, (frame_width, frame_height), True)
while True:
    ret, frame = cap.read()
    if ret is True:

        frame = cv2.flip(frame, 1)
        out.write(frame)
    else:
        print("Camera error.")
        time.sleep(10)

cap.release()

I would appreciate if someone can help me understand what I need to do to open up a stream that I can pass frames to.

edit retag flag offensive close merge delete