小弟今日用c#开发一项目,需要把UDP组播来的视频流收齐,再用别的协议延迟发送出去。分为接收线程、处理线程和发送线程三部分。接收到的数据Add入Arraylist中,在发送线程中判断是否达到延迟界限,超出则开始发送,每次将arraylist中的第一项send出去,同时Remove这项,在Add和Remove时都做了lock。开始测试小码率的流没有问题,后来测试20M以上的高清视频节目则发现发送速度过慢,拿VLC看发现有很多包都丢失了。接收端我判断了应该没有问题,问题应该出在发送端。不知道是socket发送速度太慢还是操作Arraylist效率太慢。请各位高人指点,小弟不胜感激!(最好能提示解决方法和代码示意)
建议方案
1.等视频有了1M在统一发送 频繁多线程 降低效率
2.Timer时间为最好5秒在UDP协议中 IP传输中 有最小包的限制 比如64K 即使你发1K的数据 网络也要给你打个64K的包
所以 最好打包在1M (好象 你去找找UDP的最小包长)
您在试试
我的程序只负责接收和转发视频流,视频流是别的设备通过UDP组播发送过来的。由于是标准TS流,所以每个包的大小都是188*7,根据流的码率不同则发送的包数步同。目前我的问题是低码率时候我的程序还处理的过来,超过20M的码流则会出现发送端发送过慢的情况。我也没有使用timer。所以应该不是你说的这个问题,不过还是谢谢你的提示。
int len = (int)TsFormat.TsFormat188 * 7; // 1316, udp 报文最大长度为1472
byte[] receiveBytes = new byte[len]; EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); int realLen = 0;
while (!this.m_stop) //循环扫描
{
try
{
realLen = m_socket.Receive(receiveBytes);
if (realLen > 0)
{
while (m_fifo.Write(receiveBytes) <= 0)
Thread.Sleep(1);
}
else
Thread.Sleep(2);
}
catch (SocketException exp)
{
if (exp.ErrorCode == 0x2738)
{
len = (int)TsFormat.TsFormat204 * 7; // 1428, udp 报文最大长度为1472
StateObject.BufferSize = (int)TsFormat.TsFormat204 * 7;
receiveBytes = new byte[len];
}
}
catch (Exception exp)
{
}
}