|ZYCWPF| RTP发送的话每秒应该发送多少KB才正常,为什么我10帧,每帧为38KB都会卡和丢数据呢?
如我做一个视频会议
主讲的电脑进行录音和截屏进行RTP发送给接收方(现是1对1对方式)
图像每帧大小为38KB,
如果我用1秒4帧的话传送正常
但是要是1秒10帧的话就显示不正常,且会有丢数据的问题,也就是花屏
10*38=380K每秒 在本地网络应该没有问题才对啊
那是怎么回事
谢谢
------最佳解决方案--------------------你的网速是多少?理论上百兆网传380KB/秒应该是可行的。你的测试网络环境怎么样,测试时候不会有人在传文件或下载吧?
380KB/s虽然应该可以传,但换算成码率3800kbit/s还是太高了,一般的视频压缩码率通常只有几百K,但是图像质量不一定差,所以关键还是压缩算法。
另外就是你目前的程序没有容错、纠错的功能,就是说偶然的丢失/错乱一个包,会影响整个帧,而且也会可能 影响下一帧(结束包丢失或本帧包错乱到下一帧数据中),而这在通信资源紧张的时候还是很有可能发生。
------其他解决方案--------------------你接收端是否用到缓存,缓存的空间创建是否足够大,有没有在接收完成之后,清理缓存?
------其他解决方案--------------------调试下,将“花屏”的数据保存下来分析,数据包是否同步。
------其他解决方案--------------------
讲得很好
------其他解决方案--------------------花屏问题可以了,但现在只要1秒的数据达到38K*10的话,就接收不到了
这是为什么呢
------其他解决方案--------------------我用你最新的程序试了下,我这里interval最低可以设到100,再低就开始出现花屏、跳屏,低于80就彻底死掉了。我的环境是100M有线连接,交换机也是100M,桌面比你大点,平均每张图68K。
我观察到超过10fps的时候,就会明显发生重入现象,就是上一帧未传送完的时候,定时器就已经到点开始下一张了。这种情况下后一张图将冲掉前一张图的timestamp,造成完全错乱。
简单和粗暴解决的办法是在Send方法开头加上一个再入标志并检查,如正在传送则丢弃一帧。比如:
bool _sending = false;
public void Send(byte[] data)
{
if (_sending) return;
_sending = true;
。。。
_sending = false;
}
还有在超过10fps的时候,我发现cpu,内存等全面资源紧张,这时候可能已经不是单纯网络瓶颈,而是要全面优化系统了。比如buffer不能用List这种动态数组,而应该用定长数组,用快速内存拷贝复制数据(不用linq)。Encode/Decode应该分开到单独线程中执行,确保屏幕的绘画不影响收/发数据,等等。