Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
Brand Logo

ModalAI Forum

  1. ModalAI Support Forum
  2. Ask your questions right here!
  3. Seeking Reference Code for MPA Integration with RTSP Video Streams for TFLite Server

Seeking Reference Code for MPA Integration with RTSP Video Streams for TFLite Server

Scheduled Pinned Locked Moved Ask your questions right here!
38 Posts 3 Posters 12.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Ethan WuE Offline
    Ethan WuE Offline
    Ethan Wu
    Contributor
    wrote on last edited by
    #1

    Hi,

    I'd like to read a video stream from an RTSP source and then pass it through MPA to connect to a tflite server. Where can I find good reference code for handling video streams with MPA?

    Thanks.

    Alex KushleyevA 1 Reply Last reply
    0
    • Ethan WuE Ethan Wu

      Hi,

      I'd like to read a video stream from an RTSP source and then pass it through MPA to connect to a tflite server. Where can I find good reference code for handling video streams with MPA?

      Thanks.

      Alex KushleyevA Offline
      Alex KushleyevA Offline
      Alex Kushleyev
      ModalAI Team
      wrote on last edited by Alex Kushleyev
      #2

      @Ethan-Wu , I think one of the easier ways to do this would be using python3. Opencv (python3) has capability of capturing rtsp stream into separate frames. We are currently prototyping python3 bindings for some of the mpa pub/sub (specifically images).

      So, essentially you would need a python3 script that captures frames using cv2, does any format conversion if needed, and publishes via python mpa bindings.

      If you are interested in testing out this approach, I can provide an example for you within a few days. What format would you need to publish the image to the tflite server? mono / rgb / yuv etc.

      Alex

      Ethan WuE 2 Replies Last reply
      0
      • Alex KushleyevA Alex Kushleyev

        @Ethan-Wu , I think one of the easier ways to do this would be using python3. Opencv (python3) has capability of capturing rtsp stream into separate frames. We are currently prototyping python3 bindings for some of the mpa pub/sub (specifically images).

        So, essentially you would need a python3 script that captures frames using cv2, does any format conversion if needed, and publishes via python mpa bindings.

        If you are interested in testing out this approach, I can provide an example for you within a few days. What format would you need to publish the image to the tflite server? mono / rgb / yuv etc.

        Alex

        Ethan WuE Offline
        Ethan WuE Offline
        Ethan Wu
        Contributor
        wrote on last edited by
        #3

        @Alex-Kushleyev Sure, a few examples would be great. I think the format is yuv, thank you very much.

        1 Reply Last reply
        0
        • Alex KushleyevA Alex Kushleyev

          @Ethan-Wu , I think one of the easier ways to do this would be using python3. Opencv (python3) has capability of capturing rtsp stream into separate frames. We are currently prototyping python3 bindings for some of the mpa pub/sub (specifically images).

          So, essentially you would need a python3 script that captures frames using cv2, does any format conversion if needed, and publishes via python mpa bindings.

          If you are interested in testing out this approach, I can provide an example for you within a few days. What format would you need to publish the image to the tflite server? mono / rgb / yuv etc.

          Alex

          Ethan WuE Offline
          Ethan WuE Offline
          Ethan Wu
          Contributor
          wrote on last edited by
          #4

          @Alex-Kushleyev Originally, I was thinking of achieving simple image transmission by modifying the example code under libmodal-pipe, and then connecting it to both MPA and the tflite server. Would you advise against this approach?

          Alex KushleyevA 1 Reply Last reply
          0
          • Ethan WuE Ethan Wu

            @Alex-Kushleyev Originally, I was thinking of achieving simple image transmission by modifying the example code under libmodal-pipe, and then connecting it to both MPA and the tflite server. Would you advise against this approach?

            Alex KushleyevA Offline
            Alex KushleyevA Offline
            Alex Kushleyev
            ModalAI Team
            wrote on last edited by Alex Kushleyev
            #5

            @Ethan-Wu , publishing an image using MPA is easy. How were you planning to handle the RTSP video stream and converting the output to YUV?

            An example of publishing various image types (gray, rgb) can be found in voxl-camera-server source code. The example you referenced is a generic one, there is more specific API for publishing images.

            • create the publisher: https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L2161 , you just need to call pipe_server_create.. in short...
            pipe_info_t info;
            strcpy(info.name       , "my_new_camera");
            strcpy(info.type       , "camera_image_metadata_t");
            strcpy(info.server_name, "my_test_app");
            info.size_bytes = 64*1024*1024;  //pipe buffer size in bytes
            int pipe_id     = pipe_server_get_next_available_channel(); #pipe id to use for publishing
            int flags       = 0;
            pipe_server_create(pipe_id, info, flags); 
            
            • publish : https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L934 (please take a look at the camera_image_metadata_t in libmodal_pipe headers. there is a timestamp and other fields that are not directly filled in this example (they are filled elsewhere).

            short example (assuming image is just raw8):

            int publish_image(uint8_t * image_data, uint32_t width, uint32_t height)
            {
              camera_image_metadata_t meta;
              meta.magic_number = CAMERA_MAGIC_NUMBER;
              meta.frame_id = 0; //TODO fill in the frame id / counter
              meta.width  = width;
              meta.stride = width;
              meta.height = height;
              meta.size_bytes = meta.width * meta.height;
              meta.format = IMAGE_FORMAT_RAW8;
              meta.timestamp_ns = 0; //TODO: fill in correct timestamp
              meta.exposure_ns = 0; //TODO: fill in exposure info if available
              meta.gain = 0; //TODO: fill in gain info if available
            
              return pipe_server_write_camera_frame(pipe_id, meta, image_data);
            }
            

            The full definition of camera_image_metadata_t can be found here : https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/library/include/modal_pipe_interfaces.h#L190

            Ethan WuE 2 Replies Last reply
            0
            • Alex KushleyevA Alex Kushleyev

              @Ethan-Wu , publishing an image using MPA is easy. How were you planning to handle the RTSP video stream and converting the output to YUV?

              An example of publishing various image types (gray, rgb) can be found in voxl-camera-server source code. The example you referenced is a generic one, there is more specific API for publishing images.

              • create the publisher: https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L2161 , you just need to call pipe_server_create.. in short...
              pipe_info_t info;
              strcpy(info.name       , "my_new_camera");
              strcpy(info.type       , "camera_image_metadata_t");
              strcpy(info.server_name, "my_test_app");
              info.size_bytes = 64*1024*1024;  //pipe buffer size in bytes
              int pipe_id     = pipe_server_get_next_available_channel(); #pipe id to use for publishing
              int flags       = 0;
              pipe_server_create(pipe_id, info, flags); 
              
              • publish : https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L934 (please take a look at the camera_image_metadata_t in libmodal_pipe headers. there is a timestamp and other fields that are not directly filled in this example (they are filled elsewhere).

              short example (assuming image is just raw8):

              int publish_image(uint8_t * image_data, uint32_t width, uint32_t height)
              {
                camera_image_metadata_t meta;
                meta.magic_number = CAMERA_MAGIC_NUMBER;
                meta.frame_id = 0; //TODO fill in the frame id / counter
                meta.width  = width;
                meta.stride = width;
                meta.height = height;
                meta.size_bytes = meta.width * meta.height;
                meta.format = IMAGE_FORMAT_RAW8;
                meta.timestamp_ns = 0; //TODO: fill in correct timestamp
                meta.exposure_ns = 0; //TODO: fill in exposure info if available
                meta.gain = 0; //TODO: fill in gain info if available
              
                return pipe_server_write_camera_frame(pipe_id, meta, image_data);
              }
              

              The full definition of camera_image_metadata_t can be found here : https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/library/include/modal_pipe_interfaces.h#L190

              Ethan WuE Offline
              Ethan WuE Offline
              Ethan Wu
              Contributor
              wrote on last edited by Ethan Wu
              #6

              @Alex-Kushleyev
              Hi, thanks for replying, that really helps. I was intended to use opencv C++ to read rtsp stream, at least to read a local video for testing. I looked into voxl-mpa-tools which makes use of voxl-opencv as one of its dependency, and wrote a simple program to read video source like below :

              #include <opencv2/opencv.hpp>
              #include <iostream>
              
              using namespace cv;
              using namespace std;
              
              int main() {
                  string filename;
                  cout << "Enter the file name of the video: ";
                  cin >> filename;
              
                  VideoCapture cap(filename);
              
                  if (!cap.isOpened()) {
                      cerr << "Error: Unable to open video file." << endl;
                      return -1;
                  }
                  // play video on local host
              }
              

              While it can played both mp4 and RTSP source on my PC, isOpened always returns False on voxl.

              I also install python3 and opencv-python on voxl and test it out, but it's able to open mp4 but failed to read RTSP. That goes same on my PC, so I might get something wrong.

              I have used ffmpeg to confirm that the RTSP URL is correct, so I don't think it's a problem with the URL being incorrect.

              1 Reply Last reply
              0
              • Alex KushleyevA Alex Kushleyev

                @Ethan-Wu , publishing an image using MPA is easy. How were you planning to handle the RTSP video stream and converting the output to YUV?

                An example of publishing various image types (gray, rgb) can be found in voxl-camera-server source code. The example you referenced is a generic one, there is more specific API for publishing images.

                • create the publisher: https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L2161 , you just need to call pipe_server_create.. in short...
                pipe_info_t info;
                strcpy(info.name       , "my_new_camera");
                strcpy(info.type       , "camera_image_metadata_t");
                strcpy(info.server_name, "my_test_app");
                info.size_bytes = 64*1024*1024;  //pipe buffer size in bytes
                int pipe_id     = pipe_server_get_next_available_channel(); #pipe id to use for publishing
                int flags       = 0;
                pipe_server_create(pipe_id, info, flags); 
                
                • publish : https://gitlab.com/voxl-public/voxl-sdk/services/voxl-camera-server/-/blob/master/src/hal3_camera_mgr.cpp?ref_type=heads#L934 (please take a look at the camera_image_metadata_t in libmodal_pipe headers. there is a timestamp and other fields that are not directly filled in this example (they are filled elsewhere).

                short example (assuming image is just raw8):

                int publish_image(uint8_t * image_data, uint32_t width, uint32_t height)
                {
                  camera_image_metadata_t meta;
                  meta.magic_number = CAMERA_MAGIC_NUMBER;
                  meta.frame_id = 0; //TODO fill in the frame id / counter
                  meta.width  = width;
                  meta.stride = width;
                  meta.height = height;
                  meta.size_bytes = meta.width * meta.height;
                  meta.format = IMAGE_FORMAT_RAW8;
                  meta.timestamp_ns = 0; //TODO: fill in correct timestamp
                  meta.exposure_ns = 0; //TODO: fill in exposure info if available
                  meta.gain = 0; //TODO: fill in gain info if available
                
                  return pipe_server_write_camera_frame(pipe_id, meta, image_data);
                }
                

                The full definition of camera_image_metadata_t can be found here : https://gitlab.com/voxl-public/voxl-sdk/core-libs/libmodal-pipe/-/blob/master/library/include/modal_pipe_interfaces.h#L190

                Ethan WuE Offline
                Ethan WuE Offline
                Ethan Wu
                Contributor
                wrote on last edited by
                #7

                @Alex-Kushleyev
                As for converting video to YUV, I haven't reach that part, but I think opencv might be used for that conversion.

                Alex KushleyevA 1 Reply Last reply
                0
                • Ethan WuE Ethan Wu

                  @Alex-Kushleyev
                  As for converting video to YUV, I haven't reach that part, but I think opencv might be used for that conversion.

                  Alex KushleyevA Offline
                  Alex KushleyevA Offline
                  Alex Kushleyev
                  ModalAI Team
                  wrote on last edited by Alex Kushleyev
                  #8

                  @Ethan-Wu ,

                  I have not tested using opecv in c++ to receive the RTSP streams, but i have tested the same thing in python3 with opencv on VOXL2. I also found that video capture did not work if i just provided the rtsp stream location as the "filename". It turns out that on VOXL2, the opencv video capture uses gstreamer (not sure about PC), so i had to tell opencv what gstreamer pipeline to use. Specifically, here is the the snippet of the python code that i tested to receive h264 stream that was actually generated by voxl-camera-server on VOXL2 (i have not tested h265 this way). You can test out a similar approach in C++

                  import cv2
                  stream_url = 'rtsp://127.0.0.1:8900/live'
                  
                  #using software decoder (i think)
                  stream = 'gst-launch-1.0 rtspsrc location=' + stream_url + ' latency=0 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! autovideoconvert ! appsink'
                  
                  #using hardware decoder
                  #stream = 'gst-launch-1.0 rtspsrc location=' + stream_url + ' latency=0  ! queue ! rtph264depay ! h264parse ! qtivdec turbo=true ! autovideoconvert ! appsink'
                  
                  vcap = cv2.VideoCapture(stream,cv2.CAP_GSTREAMER)
                  
                  while(1):
                      ret, frame = vcap.read()
                      #check ret and process image...
                  

                  Please note that the current version of opencv installed on voxl2 does not have python3 bindings, but i enabled that in order to use opencv in Python3. We will probably update the opencv voxl2 deb package soon to include the python3 bindings.

                  Ethan WuE 1 Reply Last reply
                  0
                  • Alex KushleyevA Alex Kushleyev

                    @Ethan-Wu ,

                    I have not tested using opecv in c++ to receive the RTSP streams, but i have tested the same thing in python3 with opencv on VOXL2. I also found that video capture did not work if i just provided the rtsp stream location as the "filename". It turns out that on VOXL2, the opencv video capture uses gstreamer (not sure about PC), so i had to tell opencv what gstreamer pipeline to use. Specifically, here is the the snippet of the python code that i tested to receive h264 stream that was actually generated by voxl-camera-server on VOXL2 (i have not tested h265 this way). You can test out a similar approach in C++

                    import cv2
                    stream_url = 'rtsp://127.0.0.1:8900/live'
                    
                    #using software decoder (i think)
                    stream = 'gst-launch-1.0 rtspsrc location=' + stream_url + ' latency=0 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! autovideoconvert ! appsink'
                    
                    #using hardware decoder
                    #stream = 'gst-launch-1.0 rtspsrc location=' + stream_url + ' latency=0  ! queue ! rtph264depay ! h264parse ! qtivdec turbo=true ! autovideoconvert ! appsink'
                    
                    vcap = cv2.VideoCapture(stream,cv2.CAP_GSTREAMER)
                    
                    while(1):
                        ret, frame = vcap.read()
                        #check ret and process image...
                    

                    Please note that the current version of opencv installed on voxl2 does not have python3 bindings, but i enabled that in order to use opencv in Python3. We will probably update the opencv voxl2 deb package soon to include the python3 bindings.

                    Ethan WuE Offline
                    Ethan WuE Offline
                    Ethan Wu
                    Contributor
                    wrote on last edited by Ethan Wu
                    #9

                    @Alex-Kushleyev
                    Hi,
                    I'm now able to stream rtsp with opencv-python on my PC, but fail on voxl, and I think that might be some environmental issue. I'm using conda and following this script to install gstreamer support opencv, and the program just stuck at VideoCapture() whenever start running. Here are some information after I hit ctrl+C to stop it :

                    ^C
                    (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                    Trying to dispose element queue0, but it is in PAUSED instead of the NULL state.
                    You need to explicitly set elements to the NULL state before
                    dropping the final reference, to allow them to clean up.
                    This problem may also be caused by a refcounting bug in the
                    application or some element.
                    
                    
                    (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                    Trying to dispose element pipeline0, but it is in READY instead of the NULL state.
                    You need to explicitly set elements to the NULL state before
                    dropping the final reference, to allow them to clean up.
                    This problem may also be caused by a refcounting bug in the
                    application or some element.
                    
                    [ WARN:0@1.170] global /tmp/tmp.zudKvFNc4N/opencv-python-master/opencv/modules/videoio/src/cap_gstreamer.cpp (1356) open OpenCV | GStreamer warning: unable to start pipeline
                    [ WARN:0@1.170] global /tmp/tmp.zudKvFNc4N/opencv-python-master/opencv/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
                    
                    (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                    Trying to dispose element appsink0, but it is in READY instead of the NULL state.
                    You need to explicitly set elements to the NULL state before
                    dropping the final reference, to allow them to clean up.
                    This problem may also be caused by a refcounting bug in the
                    application or some element.
                    
                    Traceback (most recent call last):
                      File "/playground/play.py", line 17, in <module>
                        vcap = cv2.VideoCapture(stream,cv2.CAP_GSTREAMER)
                    KeyboardInterrupt
                    
                    

                    I'm currently dealing with it and not sure whether it's a problem from voxl or not.

                    Also, since MPA API is written in C++, I'm curious that even if I success to stream RTSP in python, how should I connect them?

                    Ethan WuE 1 Reply Last reply
                    0
                    • Ethan WuE Ethan Wu

                      @Alex-Kushleyev
                      Hi,
                      I'm now able to stream rtsp with opencv-python on my PC, but fail on voxl, and I think that might be some environmental issue. I'm using conda and following this script to install gstreamer support opencv, and the program just stuck at VideoCapture() whenever start running. Here are some information after I hit ctrl+C to stop it :

                      ^C
                      (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                      Trying to dispose element queue0, but it is in PAUSED instead of the NULL state.
                      You need to explicitly set elements to the NULL state before
                      dropping the final reference, to allow them to clean up.
                      This problem may also be caused by a refcounting bug in the
                      application or some element.
                      
                      
                      (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                      Trying to dispose element pipeline0, but it is in READY instead of the NULL state.
                      You need to explicitly set elements to the NULL state before
                      dropping the final reference, to allow them to clean up.
                      This problem may also be caused by a refcounting bug in the
                      application or some element.
                      
                      [ WARN:0@1.170] global /tmp/tmp.zudKvFNc4N/opencv-python-master/opencv/modules/videoio/src/cap_gstreamer.cpp (1356) open OpenCV | GStreamer warning: unable to start pipeline
                      [ WARN:0@1.170] global /tmp/tmp.zudKvFNc4N/opencv-python-master/opencv/modules/videoio/src/cap_gstreamer.cpp (862) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
                      
                      (python:21276): GStreamer-CRITICAL **: 07:27:40.646: 
                      Trying to dispose element appsink0, but it is in READY instead of the NULL state.
                      You need to explicitly set elements to the NULL state before
                      dropping the final reference, to allow them to clean up.
                      This problem may also be caused by a refcounting bug in the
                      application or some element.
                      
                      Traceback (most recent call last):
                        File "/playground/play.py", line 17, in <module>
                          vcap = cv2.VideoCapture(stream,cv2.CAP_GSTREAMER)
                      KeyboardInterrupt
                      
                      

                      I'm currently dealing with it and not sure whether it's a problem from voxl or not.

                      Also, since MPA API is written in C++, I'm curious that even if I success to stream RTSP in python, how should I connect them?

                      Ethan WuE Offline
                      Ethan WuE Offline
                      Ethan Wu
                      Contributor
                      wrote on last edited by
                      #10

                      @Ethan-Wu Or perhaps my gstreamer installation is not completely right? Here's the document I read for installation : https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c

                      Alex KushleyevA 1 Reply Last reply
                      0
                      • Ethan WuE Ethan Wu

                        @Ethan-Wu Or perhaps my gstreamer installation is not completely right? Here's the document I read for installation : https://gstreamer.freedesktop.org/documentation/installing/on-linux.html?gi-language=c

                        Alex KushleyevA Offline
                        Alex KushleyevA Offline
                        Alex Kushleyev
                        ModalAI Team
                        wrote on last edited by
                        #11

                        @Ethan-Wu,

                        Gstreamer on voxl2 has customizations to make use of voxl2 hardware (video encoder, decoder), so i am not sure if standard gstreamer installation would work. Perhaps that is why you are seeing issues with the standard installation of gstreamer.

                        Alex KushleyevA 1 Reply Last reply
                        0
                        • Alex KushleyevA Alex Kushleyev

                          @Ethan-Wu,

                          Gstreamer on voxl2 has customizations to make use of voxl2 hardware (video encoder, decoder), so i am not sure if standard gstreamer installation would work. Perhaps that is why you are seeing issues with the standard installation of gstreamer.

                          Alex KushleyevA Offline
                          Alex KushleyevA Offline
                          Alex Kushleyev
                          ModalAI Team
                          wrote on last edited by
                          #12

                          I wrote some examples how to use use python3 to get external rtsp stream into python using opencv (which uses gstreamer) and then publish RGB image via MPA.

                          • https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/pympa-experimental/tools/python/rtsp_rx.py
                          • https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/pympa-experimental/tools/python/rtsp_rx_mpa_pub.py .

                          This requires updated version of the opencv package for VOXL2 with python3 bindings (i have not published that yet). there is also an experimental interface to get and send images via MPA (using pympa python bindings).

                          If you are interested trying out this option, we can explore it

                          Ethan WuE 1 Reply Last reply
                          0
                          • Alex KushleyevA Alex Kushleyev

                            I wrote some examples how to use use python3 to get external rtsp stream into python using opencv (which uses gstreamer) and then publish RGB image via MPA.

                            • https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/pympa-experimental/tools/python/rtsp_rx.py
                            • https://gitlab.com/voxl-public/voxl-sdk/utilities/voxl-mpa-tools/-/blob/pympa-experimental/tools/python/rtsp_rx_mpa_pub.py .

                            This requires updated version of the opencv package for VOXL2 with python3 bindings (i have not published that yet). there is also an experimental interface to get and send images via MPA (using pympa python bindings).

                            If you are interested trying out this option, we can explore it

                            Ethan WuE Offline
                            Ethan WuE Offline
                            Ethan Wu
                            Contributor
                            wrote on last edited by
                            #13

                            @Alex-Kushleyev

                            Thank you very much, that really works! And it's REALLY COOL!

                            Now, the remaining issue is with GStreamer support. When streaming RTSP, GStreamer often freezes without any indication or error messages, making it difficult to identify the problem. Although this may not be the most suitable question to ask here, I still want to seek advice and see if there are other ways besides blindly testing different combinations.

                            Thank you for your assistance.

                            Alex KushleyevA 1 Reply Last reply
                            0
                            • Ethan WuE Ethan Wu

                              @Alex-Kushleyev

                              Thank you very much, that really works! And it's REALLY COOL!

                              Now, the remaining issue is with GStreamer support. When streaming RTSP, GStreamer often freezes without any indication or error messages, making it difficult to identify the problem. Although this may not be the most suitable question to ask here, I still want to seek advice and see if there are other ways besides blindly testing different combinations.

                              Thank you for your assistance.

                              Alex KushleyevA Offline
                              Alex KushleyevA Offline
                              Alex Kushleyev
                              ModalAI Team
                              wrote on last edited by
                              #14

                              @Ethan-Wu , can you clarify the gstreamer freezing issue? Are you saying that the client side freezes? what source are you using as the rtsp server?

                              In my testing the above python scripts, i found that if the rtsp stream is generated using a combination of voxl-camera-server and voxl-streamer then the gstreamer client does freeze occasionally. I will investigate this at some point soon.

                              However, there is a 3rd party app that allows you to use gstreamer on the server side and i did not experience client freezing with that option. In this case, gstreamer server side is also on voxl2 and it is using a qtiqmmfsrc plugin to get video from the camera pipeline.

                              #start rtsp server using gst-rtsp-launch ( https://github.com/sfalexrog/gst-rtsp-launch )
                              gst-rtsp-launch -p 8900 -e live "( qtiqmmfsrc camera=0 name=hires ! video/x-h264,format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! h264parse ! rtph264pay name=pay0 pt=96 )"
                              
                              Ethan WuE 1 Reply Last reply
                              0
                              • Alex KushleyevA Alex Kushleyev

                                @Ethan-Wu , can you clarify the gstreamer freezing issue? Are you saying that the client side freezes? what source are you using as the rtsp server?

                                In my testing the above python scripts, i found that if the rtsp stream is generated using a combination of voxl-camera-server and voxl-streamer then the gstreamer client does freeze occasionally. I will investigate this at some point soon.

                                However, there is a 3rd party app that allows you to use gstreamer on the server side and i did not experience client freezing with that option. In this case, gstreamer server side is also on voxl2 and it is using a qtiqmmfsrc plugin to get video from the camera pipeline.

                                #start rtsp server using gst-rtsp-launch ( https://github.com/sfalexrog/gst-rtsp-launch )
                                gst-rtsp-launch -p 8900 -e live "( qtiqmmfsrc camera=0 name=hires ! video/x-h264,format=NV12,width=1920,height=1080,framerate=30/1 ! queue ! h264parse ! rtph264pay name=pay0 pt=96 )"
                                
                                Ethan WuE Offline
                                Ethan WuE Offline
                                Ethan Wu
                                Contributor
                                wrote on last edited by Ethan Wu
                                #15

                                @Alex-Kushleyev
                                I think the client side is freezing, and I noticed that VideoCapture takes some time to complete, but ultimately hangs on cap.read(). Below is the relevant debug information:

                                created output pipe rtsp-debug, channel 0, flags 0
                                gst-launch-1.0 rtspsrc location=rtsp://169.254.4.201:554/live0 latency=0  ! queue !  rtph264depay ! h264parse config-interval=-1 ! qtivdec ! qtivtransform !  video/x-raw,format=BGR,width=1280,height=720 !  autovideoconvert ! appsink
                                0:00:00.000749593 14685   0x55c069b780 WARN            GST_REGISTRY gstregistrybinary.c:489:gst_registry_binary_check_magic: Binary registry magic version is different : 1.3.0 != 1.12.0
                                0:00:00.057125316 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:876:priv_gst_parse_yyparse: unexpected reference "gst-launch-1" - ignoring
                                0:00:00.057160626 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:882:priv_gst_parse_yyparse: unexpected pad-reference "0" - ignoring
                                0:00:00.057168959 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtspsrc"!
                                0:00:00.057173647 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtspsrc"
                                0:00:00.057890325 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x55c070f730]
                                0:00:00.057908970 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtph264depay"!
                                0:00:00.057914021 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtph264depay"
                                0:00:00.057918969 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x55c070f730]
                                0:00:00.057923292 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "h264parse"!
                                0:00:00.057927354 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "h264parse"
                                0:00:00.057932250 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                0:00:00.057936260 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "qtivdec"!
                                0:00:00.057939437 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "qtivdec"
                                0:00:00.057944072 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                0:00:00.057947874 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "qtivtransform"!
                                0:00:00.057951467 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "qtivtransform"
                                0:00:00.057956884 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                0:00:00.057971726 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "autovideoconvert"!
                                0:00:00.057979851 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "autovideoconvert"
                                0:00:00.057985215 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                0:00:00.058182496 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x55c06f51b0]
                                
                                (python:14685): GStreamer-CRITICAL **: 08:49:15.037: gst_caps_get_structure: assertion 'GST_IS_CAPS (caps)' failed
                                
                                (python:14685): GStreamer-CRITICAL **: 08:49:15.038: gst_structure_get_int: assertion 'structure != NULL' failed
                                [ WARN:0@30.090] global cap_gstreamer.cpp:1714 open OpenCV | GStreamer warning: cannot query video width/height
                                
                                (python:14685): GStreamer-CRITICAL **: 08:49:15.038: gst_structure_get_fraction: assertion 'structure != NULL' failed
                                [ WARN:0@30.090] global cap_gstreamer.cpp:1722 open OpenCV | GStreamer warning: cannot query video fps
                                [ WARN:0@30.090] global cap_gstreamer.cpp:1777 open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
                                
                                (python:14685): GStreamer-CRITICAL **: 08:50:20.041: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                [ERROR:0@95.092] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                
                                (python:14685): GStreamer-CRITICAL **: 08:51:25.042: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                [ERROR:0@160.094] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                ^C
                                (python:14685): GStreamer-CRITICAL **: 08:52:30.044: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                [ERROR:0@225.096] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                Traceback (most recent call last):
                                  File "/voxl-mpa-tools/tools/python/rtsp_rx_mpa_pub.py", line 62, in <module>
                                    ret, frame = vcap.read()
                                KeyboardInterrupt
                                
                                

                                Today, I referenced the official website and tested the situation of OpenCV, gstreamer, and MPA with other example commands. The result is that the image produced by gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink can ultimately be seen on the portal. So, I don't think it's an issue with gstreamer installation?

                                My RTSP source is from an external camera (edge computing device) acting as a server, connected to VOXL via Ethernet for transmission. Currently, I am not using VOXL's built-in camera or UVC camera, and I am not generating an RTSP stream through VOXL's services.

                                Ethan WuE 1 Reply Last reply
                                0
                                • Ethan WuE Ethan Wu

                                  @Alex-Kushleyev
                                  I think the client side is freezing, and I noticed that VideoCapture takes some time to complete, but ultimately hangs on cap.read(). Below is the relevant debug information:

                                  created output pipe rtsp-debug, channel 0, flags 0
                                  gst-launch-1.0 rtspsrc location=rtsp://169.254.4.201:554/live0 latency=0  ! queue !  rtph264depay ! h264parse config-interval=-1 ! qtivdec ! qtivtransform !  video/x-raw,format=BGR,width=1280,height=720 !  autovideoconvert ! appsink
                                  0:00:00.000749593 14685   0x55c069b780 WARN            GST_REGISTRY gstregistrybinary.c:489:gst_registry_binary_check_magic: Binary registry magic version is different : 1.3.0 != 1.12.0
                                  0:00:00.057125316 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:876:priv_gst_parse_yyparse: unexpected reference "gst-launch-1" - ignoring
                                  0:00:00.057160626 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:882:priv_gst_parse_yyparse: unexpected pad-reference "0" - ignoring
                                  0:00:00.057168959 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtspsrc"!
                                  0:00:00.057173647 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtspsrc"
                                  0:00:00.057890325 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x55c070f730]
                                  0:00:00.057908970 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "rtph264depay"!
                                  0:00:00.057914021 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "rtph264depay"
                                  0:00:00.057918969 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no sink [source=@0x55c070f730]
                                  0:00:00.057923292 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "h264parse"!
                                  0:00:00.057927354 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "h264parse"
                                  0:00:00.057932250 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                  0:00:00.057936260 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "qtivdec"!
                                  0:00:00.057939437 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "qtivdec"
                                  0:00:00.057944072 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                  0:00:00.057947874 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "qtivtransform"!
                                  0:00:00.057951467 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "qtivtransform"
                                  0:00:00.057956884 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                  0:00:00.057971726 14685   0x55c069b780 WARN     GST_ELEMENT_FACTORY gstelementfactory.c:456:gst_element_factory_make: no such element factory "autovideoconvert"!
                                  0:00:00.057979851 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:816:priv_gst_parse_yyparse: no element "autovideoconvert"
                                  0:00:00.057985215 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@(nil)]
                                  0:00:00.058182496 14685   0x55c069b780 ERROR           GST_PIPELINE grammar.y:901:priv_gst_parse_yyparse: link has no source [sink=@0x55c06f51b0]
                                  
                                  (python:14685): GStreamer-CRITICAL **: 08:49:15.037: gst_caps_get_structure: assertion 'GST_IS_CAPS (caps)' failed
                                  
                                  (python:14685): GStreamer-CRITICAL **: 08:49:15.038: gst_structure_get_int: assertion 'structure != NULL' failed
                                  [ WARN:0@30.090] global cap_gstreamer.cpp:1714 open OpenCV | GStreamer warning: cannot query video width/height
                                  
                                  (python:14685): GStreamer-CRITICAL **: 08:49:15.038: gst_structure_get_fraction: assertion 'structure != NULL' failed
                                  [ WARN:0@30.090] global cap_gstreamer.cpp:1722 open OpenCV | GStreamer warning: cannot query video fps
                                  [ WARN:0@30.090] global cap_gstreamer.cpp:1777 open OpenCV | GStreamer warning: Cannot query video position: status=0, value=-1, duration=-1
                                  
                                  (python:14685): GStreamer-CRITICAL **: 08:50:20.041: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                  [ERROR:0@95.092] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                  
                                  (python:14685): GStreamer-CRITICAL **: 08:51:25.042: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                  [ERROR:0@160.094] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                  ^C
                                  (python:14685): GStreamer-CRITICAL **: 08:52:30.044: gst_sample_get_caps: assertion 'GST_IS_SAMPLE (sample)' failed
                                  [ERROR:0@225.096] global cap_gstreamer.cpp:934 retrieveVideoFrame GStreamer: gst_sample_get_caps() returns NULL
                                  Traceback (most recent call last):
                                    File "/voxl-mpa-tools/tools/python/rtsp_rx_mpa_pub.py", line 62, in <module>
                                      ret, frame = vcap.read()
                                  KeyboardInterrupt
                                  
                                  

                                  Today, I referenced the official website and tested the situation of OpenCV, gstreamer, and MPA with other example commands. The result is that the image produced by gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink can ultimately be seen on the portal. So, I don't think it's an issue with gstreamer installation?

                                  My RTSP source is from an external camera (edge computing device) acting as a server, connected to VOXL via Ethernet for transmission. Currently, I am not using VOXL's built-in camera or UVC camera, and I am not generating an RTSP stream through VOXL's services.

                                  Ethan WuE Offline
                                  Ethan WuE Offline
                                  Ethan Wu
                                  Contributor
                                  wrote on last edited by
                                  #16

                                  @Ethan-Wu

                                  About the error 'unexpected reference "gst-launch-1" ', I do get the same error when I replace the gstreamer command with gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink, so I think that's not a problem.

                                  Alex KushleyevA 1 Reply Last reply
                                  0
                                  • Ethan WuE Ethan Wu

                                    @Ethan-Wu

                                    About the error 'unexpected reference "gst-launch-1" ', I do get the same error when I replace the gstreamer command with gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink, so I think that's not a problem.

                                    Alex KushleyevA Offline
                                    Alex KushleyevA Offline
                                    Alex Kushleyev
                                    ModalAI Team
                                    wrote on last edited by Alex Kushleyev
                                    #17

                                    @Ethan-Wu ,

                                    Hmm. When i tested with a local rtsp stream generated on the same voxl2, the video capture started immediately. The freezing would occur in the python client side sometime after i got a bunch of frames (when using voxl-streamer to produce the rtsp stream). When the freezing happened, it looked like voxl-streamer dropped the client connection for some reason. I will test with a local ip cam that is producing rtsp today.

                                    It seems gstreamer rtsp receiving end may not be running correctly on your end. How about i share with you updated native opencv package with python bindings and you could try running this natively on voxl2 without your environment? This whay you can test what I am testing.

                                    Alex KushleyevA Ethan WuE 2 Replies Last reply
                                    0
                                    • Alex KushleyevA Alex Kushleyev

                                      @Ethan-Wu ,

                                      Hmm. When i tested with a local rtsp stream generated on the same voxl2, the video capture started immediately. The freezing would occur in the python client side sometime after i got a bunch of frames (when using voxl-streamer to produce the rtsp stream). When the freezing happened, it looked like voxl-streamer dropped the client connection for some reason. I will test with a local ip cam that is producing rtsp today.

                                      It seems gstreamer rtsp receiving end may not be running correctly on your end. How about i share with you updated native opencv package with python bindings and you could try running this natively on voxl2 without your environment? This whay you can test what I am testing.

                                      Alex KushleyevA Offline
                                      Alex KushleyevA Offline
                                      Alex Kushleyev
                                      ModalAI Team
                                      wrote on last edited by
                                      #18

                                      I just tried playing a local rtsp stream from an ip cam (using rtsp_rx_mpa_pub.py) and it initially starts playing but gets stuck after a few seconds. However, changing the pipeline to use the following (using avdec_h264 instead of qtivdec:

                                       .... rtph264depay ! h264parse config-interval=-1 ! avdec_h264 ! autovideoconvert ! appsink
                                      

                                      Does not get stuck.

                                      So there must be something about the hw decoder that causes it to get stuck, I will investigate further..

                                      1 Reply Last reply
                                      0
                                      • Alex KushleyevA Alex Kushleyev

                                        @Ethan-Wu ,

                                        Hmm. When i tested with a local rtsp stream generated on the same voxl2, the video capture started immediately. The freezing would occur in the python client side sometime after i got a bunch of frames (when using voxl-streamer to produce the rtsp stream). When the freezing happened, it looked like voxl-streamer dropped the client connection for some reason. I will test with a local ip cam that is producing rtsp today.

                                        It seems gstreamer rtsp receiving end may not be running correctly on your end. How about i share with you updated native opencv package with python bindings and you could try running this natively on voxl2 without your environment? This whay you can test what I am testing.

                                        Ethan WuE Offline
                                        Ethan WuE Offline
                                        Ethan Wu
                                        Contributor
                                        wrote on last edited by
                                        #19

                                        @Alex-Kushleyev
                                        Sharing opencv package would be great, and I also want to share how I built opencv that supports gstreamer. I looked into this issue and followed instructions here, and made sure I saw the followings information to get gstreamer working with opencv by calling cv2.getBuildInformation() :

                                          Video I/O:
                                            DC1394:                      NO
                                            FFMPEG:                      YES
                                              avcodec:                   YES (57.107.100)
                                              avformat:                  YES (57.83.100)
                                              avutil:                    YES (55.78.100)
                                              swscale:                   YES (4.8.100)
                                              avresample:                NO
                                            GStreamer:                   YES (1.14.5)
                                            v4l/v4l2:                    YES (linux/videodev2.h)
                                        
                                        

                                        I was using conda for virtual environment and run opencv with python 3.10 (3.9 and 3.8 are also tested), and my opencv version is 4.9.0.80.

                                        Alex KushleyevA 1 Reply Last reply
                                        0
                                        • Ethan WuE Ethan Wu

                                          @Alex-Kushleyev
                                          Sharing opencv package would be great, and I also want to share how I built opencv that supports gstreamer. I looked into this issue and followed instructions here, and made sure I saw the followings information to get gstreamer working with opencv by calling cv2.getBuildInformation() :

                                            Video I/O:
                                              DC1394:                      NO
                                              FFMPEG:                      YES
                                                avcodec:                   YES (57.107.100)
                                                avformat:                  YES (57.83.100)
                                                avutil:                    YES (55.78.100)
                                                swscale:                   YES (4.8.100)
                                                avresample:                NO
                                              GStreamer:                   YES (1.14.5)
                                              v4l/v4l2:                    YES (linux/videodev2.h)
                                          
                                          

                                          I was using conda for virtual environment and run opencv with python 3.10 (3.9 and 3.8 are also tested), and my opencv version is 4.9.0.80.

                                          Alex KushleyevA Offline
                                          Alex KushleyevA Offline
                                          Alex Kushleyev
                                          ModalAI Team
                                          wrote on last edited by
                                          #20

                                          @Ethan-Wu , I uploaded the opencv deb here : https://storage.googleapis.com/modalai_public/temp/voxl2-misc-packages/voxl-opencv_4.5.5-3_arm64.deb

                                          it was built using this branch of voxl-opencv project : https://gitlab.com/voxl-public/voxl-sdk/third-party/voxl-opencv/-/tree/add-python3-bindings/

                                          You can just install that deb to overwrite your existing opencv installation and try the python scripts for rtsp natively on voxl2

                                          By the way, how do you get gstreamer to output that debug info? does it automatically print it if there is an issue?

                                          Ethan WuE A 3 Replies Last reply
                                          0

                                          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                          With your input, this post could be even better 💗

                                          Register Login
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          ModalAI
                                          Categories Recent Tags ModalAI.com Docs
                                          © 2026 ModalAI® · Accelerating autonomy for smaller, smarter, safer drones · Powered by NodeBB
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups