Raspberry Pi Low-Latency Stream with GStreamer

waymond91 waymond91 at gmail.com
Thu Oct 26 06:52:24 UTC 2017


Hello All!
I am trying to setup a raspberry pi as a low latency network camera (max.
latency 200ms).
In an ideal world, the raspberry pi would read the camera, send it over wifi
to a host pc.
This host PC would both display the video stream and save it to a file. 
A key aspect that I am really struggling with is:
I would like the displayed image to be saved to a file that included a
timestamp of when an individual frame was actually displayed.
That being said, this is my first time doing any video processing
whatsoever.
I was able to find and build a gstreamer source for the pi camera from the
git repository here:
https://github.com/thaytan/gst-rpicamsrc

This seems to work. With the raspberry pi I am able to start a network
pipeline with the following command:
*$ gst-launch-1.0 rpicamsrc bitrate=1000000 \
    ! 'video/x-h264,width=640,height=480' \
    ! h264parse \
    ! queue \
    ! rtph264pay config-interval=1 pt=96 \
    ! gdppay \
    ! udpsink host=[MY IP] port=5000*

And on my host PC I can display a live stream with about 150mS latency with:
*$ gst-launch-1.0 udpsrc port=5000 \
    ! gdpdepay \
    ! rtph264depay \
    ! avdec_h264 \
    ! videoconvert \
    ! autovideosink sync=false*

Or save the stream with:
*$ gst-launch-1.0 udpsrc port=5000 \
    ! gdpdepay \
    ! rtph264depay \
    ! avdec_h264 \
    ! videoconvert \
    ! filesink location=video.h264*

So I am beginning to feel like I am on track. 
Ultimately, however, I feel like I need to decode the h264 into some other
format (MP4?) so that I can actually start displaying and saving individual
frames and associating them with the current time (or at the least the time
between frames).
At the very least, I would like to be able to save and display the h264
stream with one pipeline.

On my host side, I have tried a tee element like so:
*$ gst-launch-1.0 udpsrc port=5000 \
  ! gdpdepay \
  ! rtph264depay \
  ! avdec_h264 \
  ! videoconvert \
  ! tee name = t \
  t. ! autovideosink sync=false \
  t. ! filesink location=tee.h264*

However, the video stream freezes up shortly after initialization. Any ideas
of how I can fix this?
Any ideas of how I can save the decoded, displayed frames and the time it
was displayed? I don't mind doing a little post-processing to get this lined
up correctly :P
Any ideas on how to cut latency?

Thanks again for the help!
PS Sorry I couldn't get code tags to work...



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list