c# 远程监控(4) 接收端 RTP包重组 分屏显示
我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上。最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示。完成远程监控的模拟。
先来个效果图吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | private bool NewRTPPacket(RTPPacket packet) { if (!Clients.ContainsKey(packet.SSRC)) //如果接受端第一次接受到某源的数据,则加入到 { if (Clients.Count < 4) //如果发送端为4,则丢弃包 { Clients.Add(packet.SSRC, new List<RTPPacket> {packet}); ImagesBoxMapping[ImagesBoxMapping.First(pair => pair.Value == null ).Key] = packet.SSRC; } } else { Clients[packet.SSRC].Add(packet); } if (packet.Marker) //如果已经发送完毕 { //丢包检测 var orderPackets = Clients[packet.SSRC].OrderBy(rtpPacket => rtpPacket.SequenceNumber); if (Clients[packet.SSRC].Count != (orderPackets.Last().SequenceNumber - orderPackets.First().SequenceNumber + 1)) { Clients[packet.SSRC].Clear(); //清空缓存区 return true ; } //1.包重组 var count = Clients[packet.SSRC].Sum(rtpPacket => rtpPacket.DataSize); //数据总数 var newData = new byte [count]; long offSet = 0; foreach ( var rtpPacket in Clients[packet.SSRC]) { Array.Copy(rtpPacket.DataPointer, 0, newData, offSet, rtpPacket.DataSize); offSet += rtpPacket.DataSize; } Clients[packet.SSRC].Clear(); //清空缓存区 var ms = new MemoryStream(newData); try { var bmp = new Bitmap(Image.FromStream(ms)); var img = new Image<Bgr, Byte>(bmp); ImagesBoxMapping.First(pair => pair.Value == packet.SSRC).Key.Image = img; } catch (Exception) { } finally { ms.Close(); } } return true ; } |
完整代码可以到百度云下载:包括发送端和接收端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)