Some time ago, Edward and I wrote a new element that allows clocking a GStreamer pipeline from an MPEG-TS stream, for example received via SRT.
This new element, mpegtslivesrc
, wraps around any existing live source element, e.g. udpsrc
or srtsrc
, and provides a GStreamer clock that approximates the sender's clock. By making use of this clock as pipeline clock, it is possible to run the whole pipeline at the same speed as the sender is producing the stream and without having to implement any kind of clock drift mechanism like skewing or resampling. Without this it is necessary currently to adjust the timestamps of media coming out of GStreamer's tsdemux
element, which is problematic if accurate timestamps are necessary or the stream should be stored to a file, e.g. a 25fps stream wouldn't have exactly 40ms inter-frame timestamp differences anymore.
The clock is approximated by making use of the in-stream MPEG-TS PCR, which basically gives the sender's clock time at specific points inside the stream, and correlating that together with the local receive times via a linear regression to calculate the relative rate between the sender's clock and the local system clock.
Usage of the element is as simple as
$ gst-launch-1.0 mpegtslivesrc source='srtsrc location=srt://1.2.3.4:5678?latency=150&mode=caller' ! tsdemux skew-corrections=false ! ...
$ gst-launch-1.0 mpegtslivesrc source='udpsrc address=1.2.3.4 port=5678' ! tsdemux skew-corrections=false ! ...
Addition 2025-06-28: If you're using an older (< 1.28) version of GStreamer, you'll have to use the
ignore-pcr=true
property on tsdemux
instead. skew-corrections=false
was
only added recently
and allows for more reliable handling of MPEG-TS timestamp discontinuities.
A similar approach for clocking is implemented in the AJA source element and the NDI source element when the clocked timestamp mode is configured.