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 帧)出现。
\ncaps="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\nRun Code Online (Sandbox Code Playgroud)\n不幸的是,事实并非如此:rtpjitterbuffer 似乎计算从 RTP 时间戳接收到的数据包的 PTS 和 DTS 时间戳,但它对两个流使用不同的“基本 RTP 时间”:
\n0: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\nRun Code Online (Sandbox Code Playgroud)\n从RTP 自述文件中,根据运行时间计算 RTP 时间的公式如下所示:
\nRTP = ((RT - RT-base) * clock-rate / GST_SECOND) + RTP-offset\nRun Code Online (Sandbox Code Playgroud)\n因此,接收端的 rtpjitterbuffer 使用的公式可能如下所示:
\nRT - RT-base = (RTP - RTP-offset) * GST_SECOND / clock-rate \nRun Code Online (Sandbox Code Playgroud)\n如何使 rtpjitterbuffer 计算两个流的 RT-base 和 RTP-offset 值相同的时间戳(RT)?
\n注意:我们不想使用 RTCP 或任何其他同步机制:RTP 时间戳已经基于相同的时钟(我们在本地主机上工作),偏移量为 0。
\n编辑:大写的rfc7273-syncrtpjitterbuffer 的属性有帮助吗?a-mediaclk=\xe2\x80\x9ddirect=0\xe2\x80\x9d