ffplay拿不到rtp流_H264-YUV通过RTP接收视频流ffmpeg解码SDL实时播放

本文介绍了在遇到ffplay接收RTP视频流时出现‘RTP: dropping old packet received too late’错误的问题,分析了错误原因,并详细讲解了如何构建一个简单的自定义播放器,利用opencv、x264、ffmpeg和SDL2实现H264视频的解码和实时播放,以解决RTP流播放中断的问题。
摘要由CSDN通过智能技术生成

写在前面的话

写一个简单的播放器,通过RTP接收视频流,进行实时播放。最初,使用ffplay或者vlc接收按照SDP协议文件可以播放视频,但是视频中断后重启,不能正确的解包,时常会出现如下的错误信息。

[sdp @ 0x7ffb35034e00] RTP: dropping old packet received too late

Last message repeated 15 times

使用ffplay播放udp视频。

➜ view-show ffplay -protocol_whitelist "file,http,https,rtp,udp,tcp,tls" test.sdp

➜ view-show cat test.sdp

m=video 6665 RTP/AVP 96

a=rtpmap:96 H264/90000

c=IN IP4 0.0.0.0

分析ffmpeg原代码,在rtpdec.c代码文件中,这个错误的原因是ffplay接收RTP视频流时,如果前一个RTP包的流水号大于后一个帧时,会将当前RTP报文丢弃。

static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)

{

...

if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {

/* First packet, or no reordering */

return rtp_parse_packet_internal(s, pkt, buf, len);

} else {

uint16_t seq = AV_RB16(buf + 2);

int16_t diff = seq - s->seq;

if (diff < 0) {

/* 注意看这里 Packet older than the previously emitted one, drop */

av_log(s->ic, AV_LOG_WARNING,

"RTP: dropping old packet received too late\n");

return -1;

} else if (diff <= 1) {

/* Correct packet */

rv = rtp_parse_packet_internal(s, pkt, buf, len);

return rv;

} else {

/* Still missing some packet, enqueue this one. */

rv = enqueue_packet(s, buf, len);

if (rv < 0)

return rv;

*bufptr = NULL;

/* Return the first enqueued packet if the queue is full,

* even if we're missing something */

if (s->queue_len >= s->queue_size) {

av_log(s->ic, AV_LOG_WARNING, "jitter buffer full\n");

return rtp_parse_queued_packet(s, pkt);

}

return -1;

}

}

}

但是,实际的业务场合中,对于一个大的视频文件,会按照MTU(以太网1500)拆分成很多个RTP报文(1400大小),多帧视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值