是否可以从通过RTSP从Axis相机发送的H.264流中读取绝对时间戳?
有必要知道相机拍摄的时间。
由于 安德烈
答案 0 :(得分:4)
正如Ralf已经说过的那样--RTP时间戳是相对于随机时钟的 - 它们仅用于计算两帧(或一般的RTP包)之间的差异。要将这些相对值同步到挂钟,您可以使用RTCP发送器 - 只需查看Ralf提供的链接。
对于使用H.264的Axis产品,这非常有用。如果您还使用MPEG4,则Axis固件有问题且RTCP SR中的绝对时间戳不可靠 - 在这种情况下,您必须将相对RTP时间戳与您的客户端挂钟同步。
答案 1 :(得分:3)
假设摄像机固件正常工作,并且定期与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;
完整示例为here。
答案 2 :(得分:1)
时间戳包含在RTP流中。 RTSP是一种可用于启动/控制RTP媒体会话的协议。我假设使用了RTP,您可以查看RTP标头here。
答案 3 :(得分:0)
有一个名为 openRTSP(Debian 上的livemedia-utils
,Arch 上的 live-media
)的程序获取参数 o
:
openRTSP -r rtsp://109.98.78.106
[...]
o=- 1613080009143448 1 IN IP4 109.98.78.106
在没有阅读源代码的情况下,我认为它是 Sender Report 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