如我做一个视频会议
主讲的电脑进行录音和截屏进行RTP发送给接收方(现是1对1对方式)
图像每帧大小为38KB,
如果我用1秒4帧的话传送正常
但是要是1秒10帧的话就显示不正常,且会有丢数据的问题,也就是花屏
10*38=380K每秒 在本地网络应该没有问题才对啊那是怎么回事谢谢
主讲的电脑进行录音和截屏进行RTP发送给接收方(现是1对1对方式)
图像每帧大小为38KB,
如果我用1秒4帧的话传送正常
但是要是1秒10帧的话就显示不正常,且会有丢数据的问题,也就是花屏
10*38=380K每秒 在本地网络应该没有问题才对啊那是怎么回事谢谢
解决方案 »
- |ZYCWPF| WebBorswer添加了DocumentCompleted事件后,在取得Event后如何清空 谢谢 有示例代码
- 如何用代码读取客户端软件查询出的数据
- 向表里中插入数据毫无反应
- 高手来看看,Citrix上运行的程序如何获取客户端计算机名
- try..catch...finally能不能嵌套使用?
- 计算价格总额问题、、、
- 请问怎么在C#里用API函数SendMessage来显示标题栏的系统菜单???
- 关于“远程处理”之byreference,最简单的例程运行居然出错!
- C#的控件绘制效率问题
- SESSION会莫名其妙的丢失!!!.NET的BUG????
- 求骂,求虐,求教育,ClickOne怎么手工部署?
- DataTbale中的参数方法怎么写?
380KB/s虽然应该可以传,但换算成码率3800kbit/s还是太高了,一般的视频压缩码率通常只有几百K,但是图像质量不一定差,所以关键还是压缩算法。
另外就是你目前的程序没有容错、纠错的功能,就是说偶然的丢失/错乱一个包,会影响整个帧,而且也会可能 影响下一帧(结束包丢失或本帧包错乱到下一帧数据中),而这在通信资源紧张的时候还是很有可能发生。
简单和粗暴解决的办法是在Send方法开头加上一个再入标志并检查,如正在传送则丢弃一帧。比如:
bool _sending = false;
public void Send(byte[] data)
{
if (_sending) return;
_sending = true;
_sending = false;
}
还有在超过10fps的时候,我发现cpu,内存等全面资源紧张,这时候可能已经不是单纯网络瓶颈,而是要全面优化系统了。比如buffer不能用List这种动态数组,而应该用定长数组,用快速内存拷贝复制数据(不用linq)。Encode/Decode应该分开到单独线程中执行,确保屏幕的绘画不影响收/发数据,等等。