Example #1
0
        static void Main(string[] args)
        {
            LogFactory.Assign(new ConsoleLogFactory());

            byte[] datagram = new byte[277777];
            for (int i = 0; i < datagram.Length; i++)
            {
                datagram[i] = 1;
            }

            ICollection <UdpPacket> packets = UdpPacketSplitter.Split(1024, datagram, 65535);

            foreach (var packet in packets)
            {
                Console.WriteLine(packet.ToString());
            }

            foreach (var packet in packets)
            {
                byte[]    data    = packet.ToArray();
                UdpPacket convert = UdpPacket.FromArray(data);
                Console.WriteLine(convert.ToString());
            }

            Console.ReadKey();
        }
        private void OnDatagramReceived(object sender, UdpDatagramReceivedEventArgs <byte[]> e)
        {
            try
            {
                UdpPacket udpPacket = UdpPacket.FromArray(e.Datagram);

                if (udpPacket.Total == 1)
                {
                    RtpPacket packet = new RtpPacket(udpPacket.Payload, udpPacket.PayloadSize);
                    Bitmap    bitmap = packet.ToBitmap();
                    RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));
                }
                else
                {
                    // rearrage packets to one packet
                    if (packetCache.ContainsKey(udpPacket.Sequence))
                    {
                        List <UdpPacket> udpPackets = null;
                        if (packetCache.TryGetValue(udpPacket.Sequence, out udpPackets))
                        {
                            udpPackets.Add(udpPacket);

                            if (udpPackets.Count == udpPacket.Total)
                            {
                                packetCache.TryRemove(udpPacket.Sequence, out udpPackets);

                                udpPackets = udpPackets.OrderBy(u => u.Order).ToList();
                                int rtpPacketLength = udpPackets.Sum(u => u.PayloadSize);
                                int maxPacketLength = udpPackets.Select(u => u.PayloadSize).Max();

                                byte[] rtpPacket = new byte[rtpPacketLength];
                                foreach (var item in udpPackets)
                                {
                                    Buffer.BlockCopy(item.Payload, 0, rtpPacket, (item.Order - 1) * maxPacketLength, item.PayloadSize);
                                }

                                RtpPacket packet = new RtpPacket(rtpPacket, rtpPacket.Length);
                                Bitmap    bitmap = packet.ToBitmap();
                                RaiseNewFrameEvent(bitmap, Epoch.GetDateTimeByYesterdayTotalMilliseconds(packet.Timestamp));

                                packetCache.Clear();
                            }
                        }
                    }
                    else
                    {
                        List <UdpPacket> udpPackets = new List <UdpPacket>();
                        udpPackets.Add(udpPacket);
                        packetCache.AddOrUpdate(udpPacket.Sequence, udpPackets, (k, v) => { return(udpPackets); });
                    }
                }
            }
            catch (Exception ex)
            {
                RaiseVideoSourceExceptionEvent(ex.Message);
            }
        }