1、参考https://blog.csdn.net/fantasy_ARM9/article/details/78150804
这个帖子里面有一点不太赞同,下面out_pos有队列长度,且按照0->255->0的规则去增长。这个队列是表示待发送队列,且一定是累加增长的。因为ffmpeg推送的数据,肯定一直向rtmp服务器发送,假设按照350kbit/s的速率发过来,rtmp本身会设置chunksize,一般是8192附近,所以接收队列会源源不断有数据进入。但是这个数据不会导致播放延迟几秒。
2、尝试分析ffmpeg发送数据到rtmp是否阻塞
rtmp接收ffmpeg的流程如下:
ngx_worker_process_cycle
ngx_process_events_and_timers
ngx_process_events【ngx_epoll_process_events】
events = epoll_wait(ep, event_list, (int) nevents, timer);//等待当前fd的epoll事件
epoll: fd:3 ev:0001 d:00007F8837E102E1。 当前有1个事件,是0001=IN 事件
rev->handler(rev);// IN事件,进入read函数
ngx_rtmp_recv
rtmp按照LET边缘触发设置epoll监听ffmpeg消息。
收到一次IN事件后,会去做第一次recv操作。 当recv返回>0后,继续recv,实测发现第二次recv: n:-2。退出recv。等待下一次IN事件到来。
且每次recv都是fd没有满,
recv: eof:0, avail:1
2020/09/02 14:22:34 [debug] 58642#0: *3 recv: fd:3 186 of 8202。表示缓冲区接收186 of recv缓冲区剩余8202空间
2020/09/02 14:22:34 [debug] 58642#0: *3 recv: n:186
2020/09/02 14:22:34 [debug] 58642#0: *3 RTMP recv video (9) csid=6 timestamp=79833 mlen=186 msid=1 nbuf
3、rtmp发送队列是否阻塞
发送数据流程,
ngx_rtmp_live_av
ngx_rtmp_prepare_message
ngx_rtmp_send_message
同时观察每次recv后,对应的send fd状态,
每次send的数据,都是recv接收到的数据。且没有明显的时间延迟。说明send队列没有阻塞。
4、观察video的timestamp是否和推流时间戳一致
rtmp的视频流会记录当前数据流的timestamp,经对比,入流和出流时间一致,入流为1:19s时,出流是79833ms
综上,vlc播放卡顿,不是入流和出流问题,大概率是VLC缓存原因导致。