如何获得接收帧的相机时间戳?



我有gstreamer管道,它接受来自RTSP流的输入,将其转换并将其转换为appsink:

data.source = gst_element_factory_make("uridecodebin", "source");
data.convert = gst_element_factory_make("videoconvert", "conv");
data.app_sink = gst_element_factory_make("appsink", "app_sink");

我学会了如何提取媒体缓冲区到我的应用程序,但我想知道的事情是时间戳。媒体自带我认为相机硬件预渲染时钟在左下角,有办法让我得到那个时间吗?我查看了RTP header它应该有时间戳信息。我看了看Gstreamer信息和教程和缓冲区描述,其中有ptsdts时间戳,但我不认为这是我需要的,它听起来像本地机器时间。

总结一下问题,如何从RTSP流中提取相机时间戳?

您可以使用PTS变量检索每帧的RTP时间戳。例如,如果你的相机是25 FPS,你应该将PTS乘以9/1000000来获得RTP时间戳。这不是你想要的,但它很方便。

为了查看实际的时间戳,您希望使用RTCPBuffer并检索每个rtcpcpppacket,这是实时传输控制协议数据包,包括NTP和RTP时间戳,在缓冲区中使用gst_rtcp_packet_sr_get_sender_info(...)方法查看这些时间戳。然后,每次收到新的RTCP数据包时,您将同步NTP和RTP时间戳。

你必须做一个计算来找到RTP时间戳间隔在NTP时间中对应的时间。