小弟今日用c#开发一项目,需要把UDP组播来的视频流收齐,再用别的协议延迟发送出去。分为接收线程、处理线程和发送线程三部分。接收到的数据Add入Arraylist中,在发送线程中判断是否达到延迟界限,超出则开始发送,每次将arraylist中的第一项send出去,同时Remove这项,在Add和Remove时都做了lock。开始测试小码率的流没有问题,后来测试20M以上的高清视频节目则发现发送速度过慢,拿VLC看发现有很多包都丢失了。接收端我判断了应该没有问题,问题应该出在发送端。不知道是socket发送速度太慢还是操作Arraylist效率太慢。请各位高人指点,小弟不胜感激!(最好能提示解决方法和代码示意)

解决方案 »

  1.   

    不要频繁使用多线程 
    建议方案
    1.等视频有了1M在统一发送   频繁多线程 降低效率
    2.Timer时间为最好5秒在UDP协议中 IP传输中 有最小包的限制 比如64K  即使你发1K的数据  网络也要给你打个64K的包
    所以 最好打包在1M (好象 你去找找UDP的最小包长)
    您在试试
      

  2.   

    3楼你好,首先感谢你的关注。
    我的程序只负责接收和转发视频流,视频流是别的设备通过UDP组播发送过来的。由于是标准TS流,所以每个包的大小都是188*7,根据流的码率不同则发送的包数步同。目前我的问题是低码率时候我的程序还处理的过来,超过20M的码流则会出现发送端发送过慢的情况。我也没有使用timer。所以应该不是你说的这个问题,不过还是谢谢你的提示。
      

  3.   

    我最近也在做视频流的接收部分,也遇到了出奇慢的问题,不过我是接收慢,不知道.net为什么会这样,楼主能帮我看看接收部分的代码有什么问题不?
                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)
                    {
                    }
                }