GStreamer 中的 RTP 时间戳同步

thr*_*unt 9 rtp video-streaming gstreamer gstreamer-1.0

我们正在尝试同步 2 个不同的流的 RTP 时间戳。更具体地说,我们在端口 5004 和 5005 上以 24 fps、时钟速率 90000Hz 发送两个相同的未压缩视频流,但第二个流的 RTP 时间戳中有 90000/8=11250 的偏移量。因此,当使用下面的 GStreamer 管道显示两个流时,我们希望第二个流的图像晚于 1/8 秒(=3 帧)出现。

\n
caps="application/x-rtp,media=(string)video,clock-rate=90000,encoding-name=(string)RAW,sampling=(string)YCbCr-4:2:2,depth=(string)8,width=(string)640,height=(string)480,payload=96"; \\\nGST_DEBUG="*jitter*:4" \\\ngst-launch-1.0 udpsrc buffer-size=16000000 port=5004 caps="${caps}" ! rtpjitterbuffer mode=0 ! rtpvrawdepay ! queue ! videoconvert ! fpsdisplaysink \\\n               udpsrc buffer-size=16000000 port=5005 caps="${caps}" ! rtpjitterbuffer mode=0 ! rtpvrawdepay ! queue ! videoconvert ! fpsdisplaysink\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,事实并非如此:rtpjitterbuffer 似乎计算从 RTP 时间戳接收到的数据包的 PTS 和 DTS 时间戳,但它对两个流使用不同的“基本 RTP 时间”:

\n
0:00:00.021740027 17400 0x556306a95120 INFO         rtpjitterbuffer rtpjitterbuffer.c:809:rtp_jitter_buffer_calculate_pts: resync to time 0:00:00.000000000, rtptime 0:00:00.125000000\n0:00:00.021752755 17400 0x556306a95180 INFO         rtpjitterbuffer rtpjitterbuffer.c:809:rtp_jitter_buffer_calculate_pts: resync to time 0:00:00.000000000, rtptime 0:00:00.000000000\n
Run Code Online (Sandbox Code Playgroud)\n

RTP 自述文件中,根据运行时间计算 RTP 时间的公式如下所示:

\n
RTP = ((RT - RT-base) * clock-rate / GST_SECOND) + RTP-offset\n
Run Code Online (Sandbox Code Playgroud)\n

因此,接收端的 rtpjitterbuffer 使用的公式可能如下所示:

\n
RT - RT-base  = (RTP - RTP-offset) * GST_SECOND / clock-rate \n
Run Code Online (Sandbox Code Playgroud)\n

如何使 rtpjitterbuffer 计算两个流的 RT-base 和 RTP-offset 值相同的时间戳(RT)?

\n
\n

注意:我们不想使用 RTCP 或任何其他同步机制:RTP 时间戳已经基于相同的时钟(我们在本地主机上工作),偏移量为 0。

\n

编辑:大写的rfc7273-syncrtpjitterbuffer 的属性有帮助吗?a-mediaclk=\xe2\x80\x9ddirect=0\xe2\x80\x9d

\n