日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

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

發布時間:2023/12/13 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 c# 远程监控(4) 接收端 RTP包重组 分屏显示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們在上一期使用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;
        }

  完整代碼可以到百度云下載:包括發送端和接收端

總結

以上是生活随笔為你收集整理的c# 远程监控(4) 接收端 RTP包重组 分屏显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。