Search code examples
gstreamer

gstreamer: create rtp-stream out of mp4-file without transcoding


I wanted to create a RTP-stream of a mp4-file with gstreamer. I am using gstreamer 1.18.4 on debian bullseye.

To create a mp4-file I recorded an RTSP-stream from my webcam using the following command:

gst-launch-1.0 -e rtspsrc location="rtsp://192.168.111.146/axis-media/media.amp" port-range=28000-38000 buffer-mode=0 latency=80 ! rtph264depay ! h264parse ! mp4mux ! filesink location=filename.mp4

After recording the file filename.mp4 I tried to stream it using RTP:

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! h264parse ! avdec_h264 ! x264enc ! h264parse ! rtph264pay ! udpsink port=50000 host=127.0.0.1

And the playback of the stream could be started using the following command on the same machine:

gst-launch-1.0 udpsrc address=127.0.0.1 port=50000 auto-multicast=true ! application/x-rtp,encoding-name=H264,payload=96 ! rtph264depay ! avdec_h264 ! autovideosink

Everything works as expected!

But since I don't want to transcode the file, I just wanted to skip the decoding and encoding part. Therefore, I created the following pipelines:

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! h264parse ! rtph264pay ! udpsink port=50000 host=127.0.0.1

and

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! rtph264pay ! udpsink port=50000 host=127.0.0.1

However, if I retry the playback pipeline (the pipeline with udpsrc) on both pipelines the stream is not displayed. Interestingly, nload shows network traffic on lo. What is wrong with the streaming pipelines? Did I miss some magic-plugin in between?


Solution

  • Meanwhile I found an answer to my question.

    Changing the stream-server-pipeline from

    gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! h264parse ! rtph264pay ! udpsink port=50000 host=127.0.0.1
    

    to

    gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! h264parse config-interval=-1 ! rtph264pay ! udpsink port=50000 host=127.0.0.1
    

    solves the issue.

    Thus, the difference is setting the parameter config-interval=-1 for h264parse.