百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

webrtc原理及相关api使用逻辑_webrtcvad原理

myzbx 2025-10-02 04:23 42 浏览

#简单剖析webrtc,并结合easyrtc与coturn(stun,turn)服务实现音视频聊天

  • webRTC全称为Web Real-Time Communications,即web实时通讯
  • 音视频聊天实现前提,跟直播不一样哦~api类型繁多,有的也过时了,见到有不同的就翻翻MDN,换个方案吧,谷歌需要https或者localhost才能开启媒体权限,火狐则不需要,但做兼容很费工夫。localhost下就自己开两个网页测吧,后面会讲easyrtc

理解websocket连接/websocket算是node.js最繁华的领域了,http://socket.io简单粗暴
https://github.com/socketio/socket.io.git

理解webrtc的工作流程 juejin.cn/post/684490…

  • stun服务器作用,获取双方ip协助建立连接
  • turn服务器作用,转发音视频
  • 信令服务器作用,利用http://socket.io实现,主要就是转发音视频聊天双方的软硬件信息ip,设备信息,协助直连或者视频转发

简化文章内容介绍,webrtc流程,以下在内网中可以运行

  • 1.获取用户音视频媒体,完成这步,即可看到自己的摄像头影像
  navigator.mediaDevices.getUserMedia({
    audio: true,
    video: true,
  }).then((stream) => {
    let video = document.querySelector('#video')
    video.srcObject = stream  // mediaDevices.getUserMedia获取到的音视频流捆绑在video标签上
    video.onloadedmetadata = () => video.play() // 读取数据时进行播放
  })

2.进行peertopeer点对点连接,

  • 2-1.房主createOffer回调中能取到房主的信息desc,音视频结构软硬件信息,储存本地,并且发送到信令服务器,协助转发
  let peer = new RTCPeerConnection(servers)
  pc.createOffer(sendOffer, function (error) {
    console.log('发送 offer 失败')
  })
  function sendOffer (desc) {
    console.log('sendOffer')
    pc.setLocalDescription(desc);
    socket.emit('offer', JSON.stringify({
    data: {sdp: desc}
      })
    )
  }

2-2.房主createOffer时会触发自身连接的onicecandidate事件,获取candidate,用户地址等

  pc.onicecandidate = function(event) {
    if (event.candidate !== null) {
        socket.emit("_ice_candidate",JSON.stringify({
          type: '_candidate',
          data: {
            candidate: event.candidate
          }
        })
      )
    }
  };

2-3.对方在socket中收到offer时,将其设置为远端描述,offer对应的为answer,创建时会触发该用户的onicecandidate事件,能获得到其用户地址信息,此时将描述发给房主

 socket.on('offer', function(e) {
    getUserMedia(function (stream) {
    let vid1 = document.getElementById('vid1')
    vid1.srcObject = stream
    vid1.onloadedmetadata = function(e) {
      vid1.play();
    };
    pc.addStream(stream)
    var json = JSON.parse(e) 
    pc.setRemoteDescription(new RTCSessionDescription(json.data.sdp));
    pc.createAnswer(sendAnswer, function (error) {
      console.log('创建answer失败')
    })
    }, function (error) {
      console.log('摄像头获取失败', '接听视频失败');
    })
  })
  function sendAnswer(desc) {
    pc.setLocalDescription(desc);
    socket.emit('answer', JSON.stringify({
      type: '_answer',
      data: {
        sdp: desc
      }
    }))
  }

相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:
FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

  • 2-4.房主在接收answer的socket事件中将其设置为远端描述
  socket.on('answer', async function(e) {
    let data = e.message
    await peer.setRemoteDescription(data)
  })

外网实现点对点音视频聊天 ICE(结合stun,turn进行穿透获取音视频双方地址)

  • STUN解析
    • 但现实中我们的视频通话,不可能局限在内网,可能会在防火墙,NAT之后,点对点连接之前,我们需要检测是否能进行,该技术称为NAT穿透,通常基于UDP协议,如RFC3489。在新的RFC5389中支持了TCP穿透

  • TURN解析
    • TURN使用中继穿透NAT:STUN的扩展,跟STUN一样都是通过修改应用层中的私网地址达到NAT穿透的效果,异同点是TURN是通过两方通讯的“中间人”方式实现穿透。就有点像服务器转发音视频流的意思,在STUN失败时会走TURN

NAT作用是啥

  • 为了缓解全球ip不足,NAT可以将内网的私有地址转为外网的共有地址,从而可以进行internet访问
  • 防止外部主机攻击内部主机


当然前端开发是不熟悉这些的,阅读多篇RTC博客得知谷歌开源了stun,coturn相关的服务,只需要将依赖安装,账号密码加密设置即可使用参考文献
https://www.cnblogs.com/idignew/p/7440048.html

配置完毕coturn后测试地址,返回有relay属性为服务器地址证明成功
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/


easyRTC

  • 经过多次测试,自己的RTCdemo兼容性差,目前测试阶段就不手写了。采用了easyRTC,除了safari和古董ie不行,其他方面还是ok的。github.com/priologic/e…

注意采用beta分支,为最新的项目


原文 webrtc原理及相关api使用逻辑 - 掘金

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...