I am trying to change the pipeline dynamically but do not get it
working. I also did not get splitmuxsrc working but that is a
The general idea is recording a rtp live stream to disk and split it
into files of some size or time. For this part splitmuxsink seems to
work well. gst-launch-1.0
-e rtpbin udpsrc caps="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264"address=22.214.171.124
port=5000 ! rtph264depay ! h264parse ! splitmuxsink location=~/video%02d.mp4
max-size-bytes=100000000 The next step is playing it back (a bit like a DVR) as a
playlist or chunks/files (as rtp again). This is where i struggle.
My pipeline looks basically like this:
gst-launch-1.0 rtpbin name=rtpbin
filesrc location=/home/user/video00.mp4 ! qtdemux ! h264parse !
rtph264pay ! capsfilter 'application/x-rtp,ssrc=(uint)1356955624' !
rtpbin.send_rtp_src_0 ! udpsink
rtpbin.send_rtcp_src_0 ! udpsink port=5001
udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0
(I was expecting splitmuxsrc to work in the reverse way but it did
not somehow and the limitation to the pattern is not exactly what I
Then I was trying it with concat what works well but I want to add
new files to the playlist dynamically and seek between them. So I
was writing some code and trying to dynamically change the pipeline
(like in the documentation page with the same name).
So first I tried to find a signal or event at the filesrc which
tells me when I need to read the next element. I was expecting EOS
for example but did not get it there.
Then I found out the EOS seems to get created by the demuxer and I
tried to probe it there. In the blocking probe I tried to change the
location of the filesrc but it complains then.
So I tried to change the state to null for the filesrc, change the
location and set the state back to playing. Then I got errors about
demux.sink was in push mode - which I do not understand. I also got
errors telling me I am in the wrong thread for the change.
How can it be the wrong thread for me when the example does it in
the same way and place?
However just to be sure I also tried two different filesrc elements
and creating a new one but I end up with the same thing all the
I also tried a idle callback on the filesrc which did not kick in
and a g_idle_add was also not working out for me.
What is the correct or best way to achieve this? What is my mistake
On Wed, 2018-07-11 at 16:06 +0200, Alexander Binzberger wrote:
Lots of stuff to process in here.
In general, you can't just shut down filesrc and restart it with a new
file and expect the demuxer downstream to just work on the new file,
that's not really how things work from a data processing perspective in
GStreamer. You need to shut down or replace both filesrc ! demuxer.
If you want to support seeking across chunks then you need to use
splitfilesrc. The best approach might be to add some new API to
splitfilesrc to support specifying or filtering the files to load, and
to add new files on the fly.
The state change warning you got may have been because you were trying
to shut down an element or the pipeline from within its own a streaming
thread (e.g. pad probe callback or so). Which is not allowed. Without
seeing the code I can only guess though.