如我做一个视频会议
主讲的电脑进行录音和截屏进行RTP发送给接收方(现是1对1对方式)
图像每帧大小为38KB,
如果我用1秒4帧的话传送正常
但是要是1秒10帧的话就显示不正常,且会有丢数据的问题,也就是花屏
10*38=380K每秒 在本地网络应该没有问题才对啊那是怎么回事谢谢

解决方案 »

  1.   

    你的网速是多少?理论上百兆网传380KB/秒应该是可行的。你的测试网络环境怎么样,测试时候不会有人在传文件或下载吧?
    380KB/s虽然应该可以传,但换算成码率3800kbit/s还是太高了,一般的视频压缩码率通常只有几百K,但是图像质量不一定差,所以关键还是压缩算法。
    另外就是你目前的程序没有容错、纠错的功能,就是说偶然的丢失/错乱一个包,会影响整个帧,而且也会可能 影响下一帧(结束包丢失或本帧包错乱到下一帧数据中),而这在通信资源紧张的时候还是很有可能发生。
      

  2.   

    我用你最新的程序试了下,我这里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应该分开到单独线程中执行,确保屏幕的绘画不影响收/发数据,等等。