c# 远程监控(4) 接收端 RTP包重组 分屏显示

本文介绍了一种使用RTP协议实现视频远程监控的方法,包括数据的实时重组、多客户端视频发送及接收端的分屏显示,通过代码示例展示了如何在接收端解析和重组RTP包,并在不同客户端上展示视频流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在上一期使用RTP协议,并进行了配置,打包了视频数据,这一期我们就对发送的数据进行重组,并显示在接受端上。最后对其进行扩展,支持多客户端视频发送,并在接收端分屏显示。完成远程监控的模拟。

 

先来个效果图吧

 

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

  完整代码可以到百度云下载:包括发送端和接收端

 

转载于:https://www.cnblogs.com/herenwei-wayne/p/4383583.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值