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

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

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

任何帮助将不胜感激。预先感谢,

c ffmpeg rtsp rtp
3个回答
7
投票

最后我不得不像这样侵入 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
投票

对于任何想要从 FFmpeg=4.4.2 中提取此内容的人,这是我制作的一个漂亮补丁:https://github.com/necla-ml/feedstocks/blob/main/recipes/ffmpeg/patches/rtp_ntp_timestamp_4。 4.2.补丁

这将为 AVPacket 添加一些新属性

uint32_t timestamp;
uint64_t last_rtcp_ntp_time;
uint32_t last_rtcp_timestamp;
uint16_t seq;
bool synced;

您也可以从我们的 conda 通道安装 fffmpeg:

mamba install -c necla-ml ffmpeg=4.4.2=*ntp*
并使用 https://github.com/LukasBommes/mv-extractor,它可以计算绝对 ntp 时间戳,同时维护类似 opencv 的接口。


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
© www.soinside.com 2019 - 2024. All rights reserved.