H.264 RTSP绝对时间戳

问题描述 投票:6回答:3

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

有必要知道照相机何时拍摄了框架。

谢谢安德里亚

timestamp h.264 rtsp rtp
3个回答
4
投票

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

对于使用H.264的Axis产品,效果很好。如果您还使用MPEG4,则Axis固件有故障,并且RTCP SR中的绝对时间戳不可靠-在这种情况下,您必须将相对RTP时间戳与客户端壁钟同步。


3
投票

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


0
投票

假设摄像机固件正常工作,并且定期与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

© www.soinside.com 2019 - 2024. All rights reserved.