小智 5
正如 Ralf 已经说过的——RTP 时间戳是相对于随机时钟的——它们仅用于计算两个帧(或一般的 RTP 数据包)之间的差异。为了将这些相对值同步到挂钟,您可以使用 RTCP 发送器 - 只需查看 Ralf 提供的链接。
对于使用 H.264 的 Axis 产品,这非常有效。如果您还使用 MPEG4,Axis 固件有问题,并且 RTCP SR 中的绝对时间戳不可靠 - 在这种情况下,您必须将相对 RTP 时间戳同步到您的客户端挂钟。
假设相机固件工作正常并且定期与 NTP 同步,您可以从 RTCP 发送器报告中提取绝对时间戳。但此功能在 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;
Run Code Online (Sandbox Code Playgroud)
完整的例子在这里。