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); } }