范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

WebRTC实战P2P音视频通话解决方案

  1、简介
  本文将详细介绍如何利用  WebRTC  技术实现  P2P  音视频通话,并提供了一个跨平台的方案,包括:基于  socket.io  和  Node.js  实现的服务端,以及  JavaScript  和  Android  客户端。让我们一起来探讨如何搭建这个系统,以及如何编写代码吧。
  由于 server 、js、android 代码还在整理中,预计还需要 2-3 天时间。地址:github.com/yangkun1992…
  下面是 PC 与 IOS 在不同网络环境下的效果图(WiFi <->移动网络):
  2、服务端2.1 使用 nodejs 和 socket.io 实现信令服务器
  我们借助上一篇信令服务的流程图,来实现一个 nodejs 信令服务器
  我们先设计一个信令
  join:  当前用户和远端用户加入到房间中的信令
  leave:  当前用户和远端用户离开房间的信令
  message:  交换双方的 SDP、ICE 信令
  首先,我们需要搭建一个  Node.js  服务端,用于处理信令交换。在这里,我们将使用  socket.io  库作为通信协议,借助 http、https、fs 等组件。实现一个简单的  Node.js  服务端实例:
  create server.js 下面就是信令服务的核心代码 var log4js = require("log4js"); var http = require("http"); var https = require("https"); var fs = require("fs"); var socketIo = require("socket.io");  var express = require("express"); var serveIndex = require("serve-index");  var USERCOUNT = 3;  ...  //http server var http_server = http.createServer(app); http_server.listen(80, "0.0.0.0");  var options = {         key : fs.readFileSync("./cert/xxx.key"),         cert: fs.readFileSync("./cert/xxx.pem") }  //https server var https_server = https.createServer(options, app); var io = socketIo.listen(https_server);   io.sockets.on("connection", (socket)=> {     socket.on("message", (room, data)=>{             socket.to(room).emit("message",room, data);//发送给当前房间的其它客户端     });      socket.on("join", (room)=>{             socket.join(room);             var myRoom = io.sockets.adapter.rooms[room];             var users = (myRoom)? Object.keys(myRoom.sockets).length : 0;             logger.debug("the user number of room is: " + users);              if(users < USERCOUNT){                     socket.emit("joined", room, socket.id); //发送给自己,相当于回调                if(users > 1){                   socket.to(room).emit("otherjoin", room, socket.id); //发送给当前房间的其它客户端                     }              }else{                     socket.leave(room);                     socket.emit("full", room, socket.id);             }     });     socket.on("leave", (room)=>{         var myRoom = io.sockets.adapter.rooms[room];         var users = (myRoom)? Object.keys(myRoom.sockets).length : 0;         logger.debug("the user number of room is: " + (users-1));         socket.to(room).emit("bye", room, socket.id);         socket.emit("leaved", room, socket.id); }); });  https_server.listen(443, "0.0.0.0");
  要运行上面的 server.js 信令服务器,您需要按照以下步骤进行安装和运行: 安装 Node.js 和 npm: 安装所需的依赖项 npm install express socket.io fs http https启动 server node server.js2.2 搭建 sturn/turn 服务器
  由于网络环境的影响我们需要搭建一个 sturn/turn 服务器,以便提升 P2P 的成功率,下面是一个粗略的搭建方式,但是也够用了。 安装 Coturn
  在终端中输入以下命令,使用 yum 包管理器安装 Coturn: sudo yum install coturn配置 Coturn
  找到并编辑 Coturn 的配置文件  /etc/coturn/turnserver.conf  ,根据您的需求修改以下配置项: # 配置监听的端口号 listening-port=3478 min-port=49152 max-port=65535 #配置域名 realm=xxx.com #允许使用 TURN/STUN 服务的用户的凭据 user=123456:123456 cert=/path/to/xxx.pem pkey=/path/to/xxx.pem # 配置日志文件路径 log-file=/root/log/turnserver.log启动 Coturn
  在终端中输入以下命令,启动 Coturn 服务: sudo systemctl start coturn sudo systemctl stop coturn sudo systemctl restart coturn sudo systemctl status coturn测试 coturn 我们可以去 trickle-ice 测试网站进行测试
  正如 trickle-ice 网站所说: 如果你测试一个 STUN 服务器,你能收集到一个类型为"srflx"的候选者,它就可以工作。如果你测试一个 TURN 服务器,你能收集到一个类型为"relay"的候选人,它就会工作.
  由此上图 sturn 和 turn 候选者地址都能成功连接。
  C++音视频学习资料免费获取方法:关注音视频开发T哥  ,点击「链接」即可免费获取2023年最新 C++音视频开发进阶独家免费学习大礼包! 3、客户端
  WebRTC 是一种基于  Web  技术的实时通信解决方案,可用于在浏览器中实现P2P音视频通话。当然,现在基本上所有上层平台都支持了。在  WebRTC  中,双方通信通过  ICE  协议进行连接,通过  SDP  协议交换媒体信息,通过  DTLS  协议进行加密,通过  SRTP  协议进行媒体传输。
  下面,我们将为你介绍如何使用  WebRTC  在浏览器和  Android  中实现  P2P  音视频通话。 3.1 Web
  我们按照上面信令的流程来实现: 3.1.1 获取媒体流
  WebRTC  支持从设备摄像头和麦克风获取视频和音频流。使用  JavaScript  的 getUserMedia   API,您可以请求用户授权,从摄像头和麦克风获取本地媒体流,并将其添加到一个 MediaStream  对象中。 function startCall(){      if(!navigator.mediaDevices ||         !navigator.mediaDevices.getUserMedia){         console.error("the getUserMedia is not supported!");         return;     }else {          var constraints = {             video: true, //传输视频             audio: true  //传输音频         }          navigator.mediaDevices.getUserMedia(constraints)                     .then(getMediaStream)//打开成功的回调                     .catch(handleError);//打开失败     }  }3.1.2 连接信令服务器并加入到房间中function connect(){   //连接信令服务器   socket = io.connect();     //加入成功的通知     socket.on("joined", (roomid, id) => {             ...     });     //远端加入     socket.on("otherjoin", (roomid) => {             ...     });     //房间满了     socket.on("full", (roomid, id) => {         ...     });    //接收自己离开房间的回调    socket.on("leaved", (roomid, id) => {         ...     });     //收到对方挂断的消息    socket.on("bye", (room, id) => {      ...     });   //收到服务断开的消息   socket.on("disconnect", (socket) => {     ...     });   //收消息,用于交换 SDP 和 ICE 消息等   socket.on("message", (roomid, data) => {     ...     });   //发送 join 消息到信令服务器并加入到 123456 房间中   socket.emit("join", 123456); }3.1.3 创建 PeerConnection 并添加媒体轨道
  当收到自己加入房间成功的消息后,连接到远程对等方,我们就需要创建一个 RTCPeerConnection  对象,并将本地媒体流添加到其中。然后,您需要创建一个 RTCDataChannel  对象,用于在对等方之间传输数据。 var pcConfig = {   "iceServers": [{     "urls": "turn:xxx:3478",     "credential": "1234",     "username": "1234"   }] }; pc = new RTCPeerConnection(pcConfig);         //当前 icecandida 数据 pc.onicecandidate = (e)=>{       ... }      //datachannel 传输通道 pc.ondatachannel = e=> {         ... } // 添加远端的媒体流到 

译。NET7中的性能改进(五)回复1获取开发者路线图学习分享丨作者郑子铭这是DotNetNB公众号的第210篇原创文章原文StephenToub翻译郑子铭循环提升和克隆(LoopHoistingandCloni郭为出手!第四家上市公司见习记者卢鸰自2000年原联想集团分家之后,前联想少帅郭为掌控的神州系阵营正日趋强大。神州数码2月26日晚间公告,公司全资子公司神州云科拟以每股20。78元的价格,受让越超高科持有浅谈一下SpringBootStarter的实现使用Springcloud的时候,需要使用某些功能的时候,通过引用starter然后做些简单的配置就可以直接使用对应的功能,卧槽,爽,哎,那自己想自己撸一个要怎么实现呢?官方文档有1500档手机天玑8100曲面屏IMX766,你选哪个?红米Note11TPro首款搭载中端神U天玑8100,重200g6。6英寸144HzLCD居中挖孔屏这块屏幕虽然没有经过A认证,但目前已知是和pro的屏幕素质没有太大差别,7档变速扫码开门自助选购一键结算无人零售越来越多在湖南省检验检测特色产业园内,市民通过无人零售车购买商品。新华社记者陈泽国摄扫码开门自助选购一键结算无人售货机的出现方便了大家的生活,在商场车站地铁公园办公楼等人员密集的地方四处可近5000家P2P全部停业,央行整顿互联金融平台,对普通人有何影响近日,央行宣布,完成对互联网金融风险专项整治行动,近5000家P2P全部停业,系统性金融风险上升势头得以遏制,国内金融业脱实向虚盲目扩张态势得到根本扭转,牢牢守住了不发生系统性金融商场数字化万达广场的商圈数字化转型之路坐拥线下海量天然客流的万达广场在今年9月对商场数字化进行全面的升级和改造,主要是从基础的支付迈向深度的经营。运用微信和腾讯生态内的支付能力和营销能力帮助商业管理公司商户和服务商,并ChatGPT来临,架构师何去何从?1。1ChatGPT来临,架构师何去何从?你好,我是李运华。最近科技圈大火的事件就是ChatGPT的全球火热流行。这款由OpenAI公司在2022年11月底推出的聊天机器人,创造了汽车圈惊天大骗局曝光?烧完200亿后,小白兔变成大灰狼新能源汽车正处于风口之上,什么神仙佛圣,什么妖魔鬼怪,全部都有。近日这个圈里爆出一个惊天大骗局,这家新能源车企烧光200亿后,可怜无辜的小白兔,变身成行骗圈钱的大灰狼。到底是怎么回陈宝惠潘冬立课题组JVIROL开发CASVIT技术可视化疱疹病毒复制疱疹病毒(herpesviruses)是一类在人和动物宿主中广泛存在的DNA病毒,其中单纯疱疹病毒I型(HSV1)普遍感染人类,据估计,全球有37亿人(67)是HSV1携带者。多数抢先华为一步!全球第一的手机,终于硬起来了MWC2023已经拉开序幕,除了种子选手准备整活,老牌厂商也没闲着出来。比如诺基亚,就表示为了专注于积极增长的目标,计划把经典Logo改了。好家伙,懂哥没记错的话,这应该是诺基亚近
顶薪3万?中超践行陈戌源公益联赛,新军南通支云新赛季顶薪3万?头条创作挑战赛北京时间3月26日,名记苗原爆料,一支江苏的中超升班马球队,新赛季球员顶薪为税前3万,赛季全部费用总投入2000万。而本赛季的升班马,江苏只有南通支云,所以,大概率南首届中国大众网球联赛大区联赛贵阳站开赛中新网贵州新闻3月25日电(记者张伟)首届中国大众网球联赛大区联赛贵阳站开赛仪式25日在贵阳市金阳网球中心举行。本项赛事由国家体育总局网球运动管理中心中国网球协会贵州省体育局贵阳市三味药,退心火,肝火自消,血压自降!三味药,退心火,肝火自消,血压自降!人生最大的财富不是金钱,也不是声誉,而是健康。生活中的吃喝拉撒都关乎到健康,只有保持健康,才能享受快乐幸福。高血压已经是非常常见的一个疾病,今天更多摄入镁可能意味着更健康的大脑特别是对女性而言痴呆症是一种无法治愈使人衰弱的疾病,影响着全世界数百万人。当科学继续寻找治疗这种疾病的答案时,已经转向了预防。一项研究提供了关于镁摄入量和大脑健康之间联系的新证据。以前的研究表明,60岁以后,骨头脆,腰背痛,腿抽筋,5味中药或能帮助排忧解难60岁以后,身体很多机能走下坡路,表现较多见的是腿脚酸软腰背酸痛手脚发麻抽筋等,影响上下楼梯走路。男人多是年轻奔波劳碌,疏于调理,中老年就会出现一些病痛,越积越多女人有的是年轻时风贝弗利我告诉老詹这场只是开始,威少会将湖人送出附加赛我告诉詹姆斯这场只是开始,4月6日打快船,威少会亲手将他们送出附加赛。贝弗利赛后笑得很开心。北京时间3月27日,洛杉矶湖人在主场以108118惨败于芝加哥公牛,此战过后,湖人排名西韩媒江原FC收到深圳队拖欠的林采民转会费,合计15亿韩元直播吧3月27日讯据韩联社消息,江原FC收到深足拖欠的林采民转会费,合计15亿韩元(约793。5万元人民币)。林采民去年4月从江原FC加盟深足,但是江原FC并未收到全部转会费,有1292424!下一个亿元先生?模板已有,7号秀夏普展翅高飞吧今日,NBA常规赛开拓者对阵雷霆的比赛已经结束,全场战罢,开拓者在主场以112118不敌雷霆遭遇2连败。此役过后,开拓者的战绩为32胜42负排名西部第13位,离季后赛越来越远了。由噩耗不断!曼城伤不停哈兰德腹股沟福登阑尾炎,瓜帅靠他挽回颜面曼城此前取得了不俗的成绩,虽然英超层面球队在少赛1轮的前提下,落后阿森纳8个积分,但是后面的赛程实际上对蓝月军团相当有利。瓜迪奥拉一直告诉球员,在国际比赛日球员们的主要目标只有一个里德本赛季对阵勇士时场均21。3分,三分命中率41在今日的常规赛中,森林狼客场9996力克勇士。本场比赛,森林狼替补中锋纳兹里德上场21分钟,17投10中其中三分球5中3,得到23分6篮板1助攻。StatMuse数据显示,本赛季里3换1!火箭报价威金斯休斯顿火箭队在本赛季的表现并不尽如人意,目前以18胜57负的战绩位居西部第15位,排名西部联盟倒数第一,这样的表现让球队管理层深感失望,他们决定在休赛期进行一些重大的调整,以期在下