Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >webRTC 初探

webRTC 初探

作者头像
frontoldman
发布于 2019-09-02 09:39:27
发布于 2019-09-02 09:39:27
1.8K00
代码可运行
举报
文章被收录于专栏:樯橹代码樯橹代码
运行总次数:0
代码可运行

webRTC介绍

webRTC是英文Web Real-Time Communication的缩写,中文翻译网页实时通信,是浏览器不需要服务器的中转,可以直接通信的技术

webRTC 应用

网上的很多教程都会包含实时视频的介绍,不过我感觉视频看起来很酷,不过却不是webRTC的使用难点,却明显增加webRTC的使用复杂度,可以略过

webRTC是客户端对客户端的单对单实时通信,但是还是需要服务器,就好比一个婚介所的作用

下面我们通过socket.io作为服务器端实现简单的聊天功能

实现步骤

  1. 发起方向服务器发出通知并初始化RTCPeerConnection
  2. 服务器接收到通知通知接收并初始化RTCPeerConnection
  3. 双方都监听onicecandidate事件,并在回调里面把event.candidate上传到服务器
  4. 双发都监听ondatachannel事件,并在回调里面给event.channel监听onmessage事件
  5. 发起方调用createOffer方法,并在这个方法的回调中给自己的RTCPeerConnection实例设置setLocalDescription,并向服务器发送自己的Description
  6. 接收方在服务器推送给自己的消息里面把5中的Description设置为自己的RTCPeerConnection实例的RemoteDescription,并调用createAnswer方法,在此方法的回调之中设置setLocalDescription,并把自己的Description上传到服务器
  7. 发起方接收到服务器推送给自己的Description,设置为LocalDescription,至此双方连接建立

双方可以调用自己的channel的send方法发送文本消息

至于调用视频和音频,我觉着这部分使用起来比较简单,不绕

步骤就是一方的开启视频,获取视频流,添加到RTCPeerConnection实例中,连接的另外一方监听onaddstream事件,获取视频流,OK

多人会话的话,同一个RTCPeerConnection实例是不能够多人会话的。如果要多人会话,就要单对单建立多个连接。同样的步骤执行多次就可以了

客户端代码

html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>


<table width="800px">
  <tr>
    <td>
      <video id="myVideo"></video>
    </td>
    <td>
      <div style="height: 200px;overflow: auto"></div>
    </td>
  </tr>
  <tr>
    <td></td>
    <td>
      <textarea style="height: 200px;width: 400px" id="textarea"></textarea>
    </td>
  </tr>
</table>


<button id="start">开始</button>
<button id="stop">结束</button>
<button id="send">发送</button>

<script src='/socket.io/socket.io.js'></script>
<script src="js/index.js"></script>


</body>
</html>

js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var video = document.getElementById('video')
var localPeerConnection, remotePeerConnection
var localChannel

var socket = io.connect('http://localhost:8181')

// 打开页面即开启等待模式
startWaiting()

function startWaiting() {
  
  var servers = {
    "iceServers": [{
      "url": "stun:stun.l.google.com:19302"
    }]
  }

  var pc_constraints = {
    optional: [{
      DtlsSrtpKeyAgreement: true
    }]
  }

  localPeerConnection = new RTCPeerConnection(servers, pc_constraints)

  localChannel = localPeerConnection.createDataChannel('sendDataChannel', { reliable: true })

  localPeerConnection.onicecandidate = function(event) {
    if (event.candidate) {
      socket.emit('onicecandidate', event.candidate)
    }
  }

  localChannel.onopen = function() {
    console.log('open')
  }

  localChannel.onclose = function() {
    console.log('close')
  }

  localPeerConnection.ondatachannel = function(event) {
    console.log(event.channel)

    event.channel.onmessage = function(msg) {
      console.log('event msg', msg)
    }
  }


  socket.on('offer', function(desc) {
    console.log('offer: ', desc)
    localPeerConnection.setRemoteDescription(desc)
    setRemote = true
    localPeerConnection.createAnswer(function(desc) {
       localPeerConnection.setLocalDescription(desc)
       socket.emit('answer', desc)
    }, function(error){console.log(error)})
  })

  socket.on('answer', function(desc) {
    console.log('answer: ', desc)
    localPeerConnection.setRemoteDescription(desc)
    console.log('answer end')
    setRemote = true
  })

  socket.on('onicecandidate', function(icecandidate) {
    localPeerConnection.addIceCandidate(icecandidate)
  })




}

document.getElementById('start').onclick = function() {
  localPeerConnection.createOffer(function(desc) {
    localPeerConnection.setLocalDescription(desc)
    socket.emit('offer', desc)
  }, function(error){console.log(error)})
}

document.getElementById('send').onclick = function() {
  var value = document.getElementById('textarea').value
  localChannel.send(value)
}

服务端代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var static = require('node-static')

var http = require('http')

var file = new(static.Server)()

var app = http.createServer(function (req, res) {
  file.serve(req, res);
}).listen(8181);

var io = require('socket.io').listen(app)

io.sockets.on('connection', function(socket) {

  socket.on('offer',function(desc) {
    socket.broadcast.emit('offer', desc)
  })

  socket.on('answer',function(desc) {
    socket.broadcast.emit('answer', desc)
  })

  socket.on('onicecandidate', function(candidate) {
    socket.broadcast.emit('onicecandidate', candidate)
  })

  socket.on('message', function(message) {
    socket.broadcast.to(message.channel).emit('message', message.message)
  })


})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
解码陪玩系统连麦技术:从音频传输到实时交互
陪玩公众号 陪玩小程序陪玩app 陪玩平台源码 陪玩平台搭建 游戏陪玩源码 线上游戏陪玩源码 线上游戏平台搭建线上游戏代练系统 下线付费搭子源码 线下家政平台 线下家政源码线下预约服务源码 陪玩陪聊系统源码 陪玩平台搭建 游戏陪玩系统,线上游戏开黑陪玩
菜鸟指南
2025/04/24
1020
解码陪玩系统连麦技术:从音频传输到实时交互
【WebRTC】WebRTC学习总结
WebRTC 是一项「实时通讯技术」,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。本篇文章从自身实践出发,结合相关代码,总结WebRTC实现的基本流程。
pingan8787
2020/05/14
3.8K0
【WebRTC】WebRTC学习总结
【从头到脚】前端实现多人视频聊天— WebRTC 实战(多人篇)
这是 WebRTC 系列的第三篇文章,主要讲多人点对点连接。如果你对 WebRTC 还不太了解,推荐阅读我之前的文章。
陈大鱼头
2020/04/16
5.9K0
【从头到脚】前端实现多人视频聊天— WebRTC 实战(多人篇)
【教程】如何使用Javascript构建WebRTC视频直播?
WebRTC是一个免费的开源项目,它通过简单的API为浏览器和移动应用程序提供实时通信功能。本文将向你展示WebRTC的基本概念和功能,并指导你使用Node.js构建自己的WebRTC视频直播。
TSINGSEE青犀视频
2021/04/12
4.4K0
WebRTC:一个视频聊天的简单例子
在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议、会话描述协议、如何进行网络穿透等,剩下的就是WebRTC的API了。
猿哥
2019/08/06
3K0
实践:《从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战)》
请先阅读原文,链接:从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战(一),本文只涉及实践过程中的问题
申君健
2019/03/21
1.6K0
WebRTC学习笔记——建立连接
1.WebRTC简介 WebRTC是一个开源的项目,可以提供浏览器,手机应用之间实时通信能力。 同时,这一功能已经内置于现代浏览器中,所以它可以做到无须借助第三方软件或插件便可以在开发网络中传输高质量
IMWeb前端团队
2017/12/29
2.1K0
WebRTC学习笔记——建立连接
音视频通信加餐 —— WebRTC一肝到底
最近需要搭建一个在线课堂的直播平台,考虑到清晰度和延迟性,我们一致认为使用 WebRTC 最合适。
杨成功
2022/09/22
1.1K0
音视频通信加餐 —— WebRTC一肝到底
WebRTC实现p2p视频通话
简介 目的 帮助自己了解webrtc 实现端对端通信 # 使用流程 git clone https://gitee.com/wjj0720/webrtc.git cd ./webRTC npm i npm run dev # 访问 127.0.0.1:3003/test-1.html 演示h5媒体流捕获 # 访问 127.0.0.1:3003/local.html 演示rtc 本地传输 # 访问 127.0.0.1:3003/p2p.html 演示局域网端对端视屏
random_wang
2019/10/22
6.8K0
WebRTC实现p2p视频通话
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转。比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器、乙和服务器之间建立信道。甲给乙发送消息时,甲先将消息发送到服务器上,服务器对甲的消息进行中转,发送到乙处,反过来也是一样。这样甲与乙之间的一次消息要通过两段信道,通信的效率同时受制于这两段信道的带宽。同时这样的信道并不适合数据流的传输,如何建立浏览器之间的点对点传输,一直困扰着开发者。WebRTC应运而生 WebRTC是一个开源项目,旨在
李海彬
2018/03/27
7.5K0
抛弃websocket,前端直接打通信道,webRTC搭建音视频聊天
WebRTC中的信令和内网穿透技术 STUN / TURN
Translated from WebRTC in the real world: STUN, TURN and signaling. 最近刚接触到WebRTC,网上看到这篇介绍WebRTC的文章不错,仔细读了读还算有用,分享出来能帮到一些刚入门的人也挺好的,翻译不好的地方可以直接看原文。
全栈程序员站长
2022/09/13
6K0
WebRTC中的信令和内网穿透技术 STUN / TURN
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
在上一篇博文 【复】基于 WebRTC 的音视频在线监考模块的设计与实现(上) 中,主要介绍了关于 WebRTC 的基本理论,那么这篇文章我们将进入实战阶段,通过 WebRTC 框架,去实现 P2P 通话,以及延伸到一对多的音视频通话,从而实现在线监考功能;
sidiot
2023/08/31
4750
【项目实战】基于 WebRTC 的音视频在线监考模块的设计与实现(下)
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/23
4910
【开发日记】使用WebRTC实现类微信的实时音视频通话
webRtc实践总结
场景 业务上有这样的一个场景,这是一个游戏直播会场,需要把手机上面的游戏画面,投屏到大屏幕上面,不仅如此可能还需要加一些其他信息例如比赛信息或者logo赞助等等,只使用设备本身投屏就不能满足现在的述求,说白了在大屏之上我们需要一个自定义的游戏视频画面。 image.png 技术抽象 业务是这样的类似场景,具体实践是使用electron的客户端实现:主窗口采集的视频,投放大屏窗口中。 核心代码功能解析 需要实现两个窗口实例 需要实现视频传输 解决方案 electron是支持获取屏幕实例的api的,并且在不同
吴文周
2022/03/09
1.1K0
webRtc实践总结
【开发记录】网页实时音视频通话系统视频会议系统WebRTC中实现局域网视频连接的步骤说明介绍
去年TSINGSEE青犀视频研发团队基于WEBRTC架构开了网页音视频通话平台EasyRTC,EasyRTC支持微信小程序、H5页面、APP、PC客户端等接入方式之间互通,快速从零开始搭建实时音视频通信;支持多人至百万人视频通话,满足语音视频社交。
EasyNVR
2020/11/03
1.3K0
狸猫语音房跨房PK 系统开发现成案例原生开发源代码
语音房系统的开发涉及多个技术领域,包括音频处理、实时通信、用户界面设计、数据存储等。为了帮助你更好地理解开发流程和所需的技术组件,以下是一个语音房系统开发的简要框架:
l8l259l3365
2024/12/05
1460
狸猫语音房跨房PK 系统开发现成案例原生开发源代码
零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能
本文由微医云技术团队前端工程师张宇航分享,原题“从0到1打造一个 WebRTC 应用”,有修订和改动。
JackJiang
2021/08/24
3.8K0
【开发日记】使用WebRTC实现类微信的实时音视频通话
需要使用uni-app技术开发一个类似微信一样的实时音视频通话功能,经过大量的调研和尝试,最终有存在两个方案:第一个方案是使用WebRTC技术实现P2P点对点实时通信;第二个方案是使用现成的阿里、腾讯、声网等平台相关产品。
全栈开发日记
2024/11/14
4210
【开发日记】使用WebRTC实现类微信的实时音视频通话
html5使用webrtc例子
以上是 html5 使用 webrtc 的核心代码,其实代码并不复杂,可以运行示例例观察调用流程;但是自己需要实现一个信令服务器。
用户10777220
2024/01/17
2770
Web前端WebRTC攻略(一) 基础介绍
随着互联网高速发展,以及即将到来的5G时代,WebRTC作为前端互动直播和实时音视频的利器,也是将前端开发者们不可错过的学习领域。如果你现在只是听过而已,那你可能要好好学习一番。 01  什么是WebRTC? WebRTC 全称是(Web browsers with Real-Time Communications (RTC) 大概2011年,谷歌收购了 GIPS,它是一个为 RTC 开发出许多组件的公司,例如编解码和回声消除技术。Google 开源了 GIPS 开发的技术,并希望将其打造为行业标准。 收
用户1097444
2022/06/29
2.6K0
Web前端WebRTC攻略(一) 基础介绍
推荐阅读
相关推荐
解码陪玩系统连麦技术:从音频传输到实时交互
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验