nginx+rtmp直播使用VLC播放出现播放延迟几秒分析

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缓存原因导致。 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值