使用FFMPEG从IP摄像机读取RTCP数据包

时间:2013-11-28 11:55:55

标签: c ffmpeg rtsp rtp

我正在使用ffmpeg C库。我需要拦截来自摄像头的RTCP数据包,以便从发件人报告中获取时间戳。 ffmpeg中是否有任何方法或结构可以提供这些信息?我完全陷入困境,但我无法解决这个问题。

任何帮助将不胜感激。提前谢谢,

2 个答案:

答案 0 :(得分:5)

最后我不得不像这样侵入ffmpeg库:

        // Patch for retrieving inner ffmpeg private data
        RTSPState* rtsp_state = (RTSPState*) context->priv_data;
        RTSPStream* rtsp_stream = rtsp_state->rtsp_streams[0];
        RTPDemuxContext* rtp_demux_context = (RTPDemuxContext*) rtsp_stream->transport_priv;

        // Decode the NTP time from the 64 bit structure
        uint64_t ntp_time = rtp_demux_context->last_rtcp_reception_time;
        uint32_t seconds = (uint32_t) ((ntp_time >> 32) & 0xffffffff);
        uint32_t fraction  = (uint32_t) (ntp_time & 0xffffffff);
        double useconds = ((double) fraction / 0xffffffff);

我终于得到了时间戳信息。

答案 1 :(得分:0)

我已经对ffmpeg(版本3.4.6)进行了一些实验。

AVFormatContext* ifmt_ctx = avformat_alloc_context();
AVStream * st = xx; // select stream
double timebase = av_q2d(st->time_base);
streamStartTime  = ifmt_ctx->start_time_realtime; // this is ntp time , i.e. stream build time 

然后,将相对时间添加到ntp时间,就可以得到每帧的绝对时间

streamStartTime + (1000000 * pkt->pts * time_base) // AVPacket * pkt