RTP协议转发视频流

RTP转发

做完上次的读取摄像头之后,项目需要将视频转发给客户端,所以研究了下RTP并且做了一个小程序测试功能,现在分享出来。
原料:VS2017,RTP.NET,摄像头
语言:C#
标签:EmguCV,C#,读取摄像头,NuGet,RTP
GitHub源码:https://github.com/SmithYan/RTPTransmit
百度网盘链接:https://pan.baidu.com/s/1gseTBW4_VnWrV7XuksdRzQ
提取码:hd75
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 先做两个项目,一个为RTPServer,另一个为RTPClient,将
    界面都搭好,效果如图
    RTPServer
    RTPServer界面
    RTPClient
    RTPClient界面图
    此时已经可以在RTPServer读取RTSP流,本地摄像机,以及本地视频文件
    我们需要做的是将RTPServer读取到的视频信息转发到RTPClient中,所以得导入RTP.NET的dll文件。
    先将RTP.NET的dll包复制到RTPServer以及RTPClient项目中的package中,再将之引用
    如下图引用RTP.NET
    导入好了RTP.NET之后,接下来就是使用它来达到传输视频的目的了
    RTP.NET中有几个主要组件
  • RTPSender:RTP发送者
  • RTPReceive:RTP接收者
  • RTPParticipant:RTP参与者
  • RTPSession:RTP会话端

我们需要一个类RTPFactory来将这些组件组合起来以便于使用
代码如下

using StreamCoders.Network;using System;using System.Net;namespace RTPServer{/// <summary>/// RTP工厂/// </summary>class RTPFactory{/// <summary>/// 只读RTP会话端/// </summary>public readonly RTPSession Session;/// <summary>/// RTP发送者/// </summary>public RTPSender Sender;/// <summary>/// RTP接收者/// </summary>public RTPReceiver Receiver;/// <summary>/// RTP参与者/// </summary>private RTPParticipant participant;/// <summary>/// RTP发送参与者/// </summary>private RTPParticipant senderParticipant;public RTPFactory(String RTPipAddress, int RTPport, String RTCPipAddress, int RTCPport, String forwardIP, int forwardPort){//初始会话端Session = new RTPSession();//初始化发送者Sender = new RTPSender();//初始化接收者Receiver = new RTPReceiver();var senderEp = new IPEndPoint(IPAddress.Parse(forwardIP), forwardPort);//将发送参与者初始化绑定到目的端口senderParticipant = new RTPParticipant(senderEp);//将发送参与者添加到发送者中Sender.AddParticipant(senderParticipant);//将发送者添加到会话端中Session.AddSender(Sender);var rtpEp = new IPEndPoint(IPAddress.Parse(RTPipAddress), RTPport);var rtcpEp = new IPEndPoint(IPAddress.Parse(RTCPipAddress), RTCPport);//将RTP参与者初始化绑定到RTP网络端点以及RTCP网络端点participant = new RTPParticipant(rtpEp, rtcpEp);//将RTP参与者添加到RTP接收者中Receiver.AddParticipant(participant);//将RTP接收者添加到会话端中Session.AddReceiver(Receiver);}}}

搞定了这些之后就是开始使用它们
在RTPServer窗口界面双击Start添加事件,并且添加内容用以初始化变量以及绑定RTP所需要的网络端点。
绑定了之后需要在RTPServer的Capture一次次解析图像的时候将图像做成RTP包并且发送即可,需要在Capture_ImageGrabbed事件中编写如下内容
RTPServer端 ——主要内容

        /// <summary>/// 图片解析事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Capture_ImageGrabbed(object sender, EventArgs e){Mat frame = new Mat();capture.Retrieve(frame, 0);IBShow.Image = frame;if (StartToSend)//如果可以开始传送{//新建流var ms = new MemoryStream();//将图片以Jpeg格式保存到流中frame.Bitmap.Save(ms, ImageFormat.Jpeg);//将流转化为byte数据var data = ms.ToArray(); //图片数据ms.Close();//Rtp 协议发送 构建rtp包var timeStamp = DateTime.Now.ToUniversalTime().Ticks;var packetSize = 1000 - 12;//一个rtp包如果是经过UDP传输的原则上不要超过1460//如果有数据持续发送while (data.Length > 0){//初始化RTP包开始构建var rtpPacket = new RTPPacket{//SSRC = ,//同步源Timestamp = (int)timeStamp,//时间戳DataPointer = data.Take(packetSize).ToArray(),//帧数据Marker = data.Length <= packetSize};//在RTP工厂中发送此RTP包rTPFactory.Sender.Send(rtpPacket);//返回剩余数据data = data.Skip(packetSize).ToArray();}}}

发送端做完之后就得做接收端,也就是接收包以及拆包并且显示
Client:双击Connect按钮添加事件,在事件中实例化工厂,并将包解析事件绑定
在绑定的方法中写入如下代码

        /// <summary>/// 收到RTP包进行处理/// </summary>/// <param name="packet"></param>/// <returns></returns>private bool NewRTPPacket(RTPPacket packet){//如果接受端第一次接受到某源的数据,则加入到if (!Clients.ContainsKey(packet.SSRC)){if (Clients.Count < 4)//如果发送端为4,则丢弃包{Clients.Add(packet.SSRC, new List<RTPPacket> { packet });}}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;}//包重组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));PBShow.Image = bmp;}catch (Exception){}finally{ms.Close();}}return true;}

这样一来,整个结构就做完了,下面来看看测试效果
测试成功
需要注意的一点是,这么传输视频会卡,需要进一步完善

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27397.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时视频流播放 和 流 推流器

ffmpeg学习&#xff08;二&#xff09; 通过rtsp获取H264裸流并保存到mp4文件 顾文锦 2014-9-24 11:06:51 阅读(2853) 评论(0) 本篇将使用上节http://www.cnblogs.com/wenjingu/p/3977015.html中编译好的库文件通过rtsp获取网络上的h264裸流并保存到mp4文件中。 1、VS2010建…

RTMP推流平台/视频直播点播分析平台/人脸识别系统EasyDSS如何实现RTMP负载均衡?

负载均衡实际上是我们集群的时候提到的一个概念&#xff0c;作为有集群需要的视频直播点播平台EasyDSS&#xff0c;我们在实现多路推流的时候&#xff0c;也需要做到RTMP负载均衡。如何在EasyDSS上实现RTMP负载均衡将是我们在本文中主要讨论的问题。 负载均能能够提供一种廉价、…

基于Gstreamer的实时视频流的分发

1 Overview Gstreamer是一款功能强大、易扩展、可复用的、跨平台的用流媒体应用程序的框架。 该框架大致包含了应用层接口、主核心框架以及扩展插件三个部分。 Fig 1.0Gstreamer 应用层接口主要是给各类应用程序提供接口如&#xff1a;多媒体播放器、流媒体服务器、视频编辑…

ChatGPT还没玩明白,自主人工智能已经来了

Datawhale干货 最新&#xff1a;AutoGPT&#xff0c;来源&#xff1a;机器之心 OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#x…

炸裂!Hugging Face 发布重磅更新,人手一个 AutoGPT!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; Hugging Face&#xff0c;作为 AI 开源圈最为知名的「网红」创业公司&#xff0c;成立仅几年&#xff0c;便在 GitHub 开源了诸多实用开源项目&#xff0c;受到了不少开发者的赞赏。 其中影…

这对情侣火了,你猜是因为啥

注意看&#xff0c;这张情侣照在网上转疯了&#xff1a; —— 本文转载自量子位 旧厂街风格&#xff0c;带着浓浓90年代氛围感&#xff0c;但是&#xff0c;他俩一夜爆火的原因&#xff0c;你可能想象不到—— 这二位并不是真人&#xff01;而是由AI一键生成的&#xff01; &am…

OpenAI 发布 GPT-4 ,功能炸裂!网友:真人工智能更近一步!

编辑&#xff1a;金磊 梦晨转自&#xff1a;量子位 | 公众号 QbitAI 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; 有多强&#xff1f; 根据OpenA…

Redis Plus 来了,性能炸裂!

点击关注公众号&#xff0c;Java干货及时送达 学习 Spring Cloud 微服务的正确姿势&#xff01; 用上 ChatGPT 啦&#xff0c;强的离谱&#xff01; 博客园在绝境求生。。 来源&#xff1a;https://developer.aliyun.com/article/705239 1 什么是KeyDB&#xff1f; KeyDB是Redi…

OpenAI 重磅发布 GPT-4 !ChatGPT 炸裂大升级,直接能考上哈佛,抢先体验后我慌了...

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; ​ 一觉醒来&#xff0c;万众期待的GPT-4&#xff0c;它来了&#xff01; OpenAI老板Sam Altman直接开门见山地介绍说&#xff1a; 这是我们迄今为止功能最强大的模型&#xff01; …

QQ、微信、lol自动发消息工具

写了一个电脑自动发消息的工具&#xff0c;脱离双手&#xff0c;让我们聊天更方便跟简洁&#xff01; 电脑软件。 自动发消息&#xff0c;双手离开键盘&#xff01;能设置次数和发送间隔。 ​​​​​​链接在这&#xff1a;阿里云盘分享提取码&#xff1a;51ar 一定要先看…

AIGC的下一步,AIGA改写企业软件

▎在AIGC产品里&#xff0c;我们已经证明了生成式自动化在大模型和超级自动化时代是完全可行的。 编者按&#xff1a; 贾岿博士是弘玑Cyclone首席产品官&#xff0c;曾担任UiPath全球研发中心高级研发总监、微软Azure云计算主任架构师。弘玑Cyclone 是一家专注于RPA的厂商&…

zblog仿站必看!附加zblog所有必备标签调用规则和中文说明

Z-Blog是一个开源的PHP博客程序&#xff0c;具有轻量、简洁、易用等特点&#xff0c;非常适合新手搭建个人博客。以下是Z-Blog仿站教程&#xff0c;包含了基本的代码示例。 1. 下载Z-Blog程序并安装 首先&#xff0c;需要到官网下载Z-Blog程序&#xff0c;解压缩后上传到服务器…

老板用了ChatGPT后,决定扩招40%程序员...

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 陆奇在最近的分享中提出一个观点&#xff1a;“生成式AI&#xff0c;不会抢程序员的饭碗&#xff0c;相反会增加程序员的岗位。” 理由很简单&#xff0c;AI大幅提升程序员的工作效率&#xff0c;同样…

只需要两步就能快速接入GPT

缘起 最近一个朋友提出&#xff0c;让我出个关于如何快速接入GPT的教程&#xff0c;今天就给大家安排上。 需要的工具 经过实测&#xff0c;这是迄今为止最便捷的接入方式&#xff0c;而且亲测有效。 首先&#xff0c;第一步你需要下载最新版的微软Edge浏览器&#xff0c;去…

强推宝藏网站

最近还是有很强烈的感受&#xff0c;方法大于努力。最近就整理了一下大学期间比较好用的网站&#xff0c;也陪我度过了一段时间了&#xff0c;排名不分先后&#xff0c;把压箱底的东西拿出来了。 ChatGPT WeTab 新标签页https://www.wetab.link/ 这个就不用多说&#xff0c;最…

如果让chatAI来写代码,会是怎么样的效果?

近日&#xff0c;我在刷B站的时候看到了由UP主老耗游戏发布的这个视频这下键盘不会废了&#xff01; 在这个视频中&#xff0c;我了解到了这个网站&#xff1a;WeTab新标签页&#xff0c;也在这个网站中真正的接触到了ChatAI。 这个网站的chatAI功能实际上还是需要下载安装如谷…

GPT免费网站分享(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

一个iPhone/iPad可以无成本使用GPT的方法

WeTab新标签页 虽然gpt已经上线app store&#xff0c;但是国内的iPhone用户还是无法快速拥有。而最近WeTab新标签页上线了iOS和iPadOS端&#xff0c;直接在app store就能下载&#xff0c;并且无使用成本。 一直以来WeTab新标签页的PC端浏览器插件就受到了很多用户的喜爱&…

大数据看惊天逆转+绝杀,亚洲杯时隔16年夺冠,恭喜女足

在北京时间2022年2月6日晚结束的女足亚洲杯决赛中&#xff0c;在上半场0:2落后的局面下&#xff0c;’ 中国女足下半场5分钟连进两球&#xff0c;顽强扳平比分。 在随后的比赛中&#xff0c;中国女足在伤停补时阶段又打进1球&#xff0c;以最终比分3:2夺冠&#xff01; 第9次夺…

程序员也为你骄傲~恭喜2022年女足夺得亚洲杯冠军~中国冠军~

今天是正月初七&#xff0c;虎年开工大吉的日子。 想想昨天女足夺冠的场景&#xff0c;还是很激动&#xff01; 今天这版面留给特别的女足&#xff01; 北京时间2月6日晚&#xff0c;中国国家女子足球队3比2逆转乾坤&#xff0c;战胜韩国女足&#xff0c;第9次捧起亚洲杯冠军…