投屏软件有几个指标:
1,首屏过去的时间(T0)要尽可能短。
2,发送端与接收端的时间差(T1)要尽可能短。
3,如果T1值不断变大,要能及时纠正回去。目前的现象是,经常是T1值超过30S的时候才跳回去。
问题1:
通过提前协商好发送端的流信息,来解决。 (不要执行avformat_find_stream_info,这个是造成T0的元凶)
问题2:
通过缩小发送端与接收端的缓冲区大小来解决。这里有个问题,如果接收端的音频缓冲区不能太小了,不然很容易造成声音播放卡顿;如果缓冲区太大,就会造成T1值变大。
问题3:
这个原因有:路由器、发送端cpu,发送端和接收端的网卡,rtmp server端设置不对。
路由器:
关于路由器的问题,当我了解到了之后,就明白了,为什么 vive头盔会拖着一根线了,因为无线真的不靠谱啊(在当前的无线协议下)。
发送端与接收端都是有线的话,是最好的;如果两端其中之一是无线连接的话,就要适当调小视频的码率了。
cpu的问题:
接收端倒还好,就是显示的时候占用的cpu高点。
发送端因为牵扯到截屏和编码,cpu占用一点都不含糊。尽量用DX截,因为cpu占用率低。
无线网卡的问题:
无线就是不那么稳定,你怎么着吧~~,公司有台老的测试thinkpad,局域网 ping值经常到 1000ms以上,在加上tcp协议保证数据正确性的特点,导致了延迟。
rtmp server端的问题:
参数值设置缓冲区大小,貌似没用。后来想了一下server端的处理逻辑,想明白了。server端堆积视频帧缓冲区满了的时候,它是直接清空了整个缓冲区。(这就导致了接收端 可能长时间接收不到I帧,导致解析不出图像来),其实最好的做法是把I帧留下,把P帧B帧清除出去。目前我还没能力更改server端的代码(或者说可能要花的时间太多)~~~~~