H.264 RTSP绝对时间戳



是否可以从Axis相机通过RTSP发送的H.264流中读取绝对时间戳?

有必要知道相机什么时候拍下了相框。

谢谢Andrea

正如Ralf已经说过的那样-RTP时间戳是相对于随机时钟的-它们只适用于计算两个帧(或通常的RTP数据包)之间的差异。为了将这些相对值同步到墙上的时钟,您可以使用RTCP发送器-只需查看Ralf提供的链接即可。

对于使用H.264的Axis产品来说,这非常有效。如果您也在使用MPEG4,Axis固件有问题,RTCP SR中的绝对时间戳不可靠-在这种情况下,您必须将相对RTP时间戳同步到您的客户端墙上的时钟。

假设相机固件工作正常,并且定期与NTP同步,则可以从RTCP Sender Report中提取绝对时间戳。但此功能在FFMpeg库API中不可用,您必须使用头libavformat/rtsp.h才能访问内部数据结构。然后你必须计算每帧的ntp时间戳:

RTSPState* rtsp_state = (RTSPState*) pFormatCtx->priv_data;
RTSPStream* rtsp_stream = rtsp_state->rtsp_streams[0];
RTPDemuxContext* rtp_demux_context = (RTPDemuxContext*) rtsp_stream->transport_priv;
int32_t d_ts = rtp_demux_context->timestamp - rtp_demux_context->last_rtcp_timestamp;
uint64_t last_ntp_time = rtp_demux_context->last_rtcp_ntp_time;
uint32_t seconds = ((last_ntp_time >> 32) & 0xffffffff)-2208988800;
uint32_t fraction  = (last_ntp_time & 0xffffffff);
double useconds = ((double) fraction / 0xffffffff);
double base_time = seconds+useconds;
double frame_ntp_time = base_time+d_ts/90000.0;

完整的例子在这里。

RTP流中包含时间戳。RTSP是一种可以用于启动/控制RTP媒体会话的协议。我假设使用了RTP,您可以在此处查看RTP标头。

有一个名为openRTSP的程序(Debian上的livemedia-utils,Arch上的live-media),它获取参数o:

openRTSP -r rtsp://109.98.78.106
[...]
o=- 1613080009143448 1 IN IP4 109.98.78.106

在没有阅读源代码的情况下,我认为这是发件人报告RTCP Packets Islam Sabyrgaliyev提到的NTS系统时间戳。

date -d@$( echo $(openRTSP -r rtsp://109.98.78.106 2>&1 | grep -Po '(?<=o=-s)d+' | head -n1 ) / 1000000 | bc )
Thu Feb 11 10:46:07 PM CET 2021

最新更新