WebRTC 详解信令服务器媒体协商及实战(及通讯过程)
文章目录
- 1. 前言
- 2. WebRTC架构
- 3. WebRTC音视频通信过程
- 4. 信令服务器(重要)
- 5. 媒体协商(重要)
- 5.1 会话描述协议SDP
- 5.2 协商流程
- 5.3 交互式连接建立 ICE
- 5.1 网络地址转换NAT
- 6. 实战
uni-app webrtc 实现H5音视频通讯 实战项目详情
1. 前言
目前市场上音视频技术方案大致分为以下几类,WebRTC因其超低延时、集成音视频采集传输等优点,是在线教育、远程会议等领域首选技术。
方案 | 优势 | 劣势 | 应用场景 |
---|---|---|---|
基于浏览器插件的flash播放RTMP | 即将淘汰 | 即将淘汰 | 传统直播 |
跨平台的HLS/DASH 播放方案 | - 跨端广泛支持:苹果浏览器原生支持 - hls.js | - 延时高 - 碎片化 | 传统直播,如赛事直播、大型会议直播 |
基于HTML5 MSE 能力的flv播放技术 | - 格式简单 - 无需插件 | - 移动端MSE支持性差 - 一定延时 | 传统直播,同上 |
WebRTC实时通讯技术 | - 毫秒级的低延时 - 音视频采集上行传输 | - 相对复杂 - 支持度低 - 价格高 - 容量有限 | 在线教育、远程会议 |
WebRTC是 Google 在 2010 年收购 VoIP 软件开发商 GlobalIPSolutions 的 GIPS 引擎后,基于
GIPS 引擎实现的浏览器音视频和数据通信技术,在 2012 年集成到 chrome 浏览器,到目前为止,大部分主流现代浏览器都已经支持。
2. WebRTC架构
一个简单的音视频架构大致如下:
- 音视频采集模块:调用系统API,从系统麦克风和摄像头读取设备并采集音视频数据。音频是PCM数据,视频是YUV数据
- 音视频编码模块:根据不同类型数据使用不同编码方式,将原始PCM、YUV数据压缩编码
- 网络传输模块:将压缩编码后的数据封装成RTP包,通过网络传输至对端,同时对端接收RTP数据
- 音视频解码模块:将接收到的压缩编码数据还原成原始的PCM、YUV/RGB数据
- 音视频渲染模块:拿到原始数据后,音频数据输出到扬声器,视频数据输出到显示器
如果我们按照上面的架构实现一个音视频通信系统,相当于至少需要开发7个小模块,想想就费时费力。此时WebRTC就可以闪亮登场了,它内部标准化的实现上述架构,并在此基础上进行拓展,对外只暴露了相关的API,其架构图如下( 官网 的有点旧,重新画的):
WebRTC大体可以分为四层:接口层、Session层、引擎层、设备层:
- 接口层:暴露给业务侧,业务侧可以使用原生的 C++ API 接口或者 Web API 开发音视频实时通信。核心是 RTCPeerConnection
- Session层:用于控制业务逻辑,比如媒体协商、收集 Candidate 等
- 引擎层:包括音频引擎、视频引擎和网络传输
- 设备层:主要和硬件交互,负责音频的采集和播放,视频的采集,物理网络等
3. WebRTC音视频通信过程
一个正常音视频通信架构如上图所示,通信双方分别是 caller(主叫) 与 callee(被叫),两边的内部逻辑相似,下面以caller端为例,了解内部流程:
- 调用音视频检测模块,检测终端是否有可用的音视频设备
- 调用音视频采集模块,采集用户音视频数据
- 根据用户选择,是否开启录制(授权)
- 通过信令模块交换SDP
- 创建WebRTC的核心对象RTCPeerConnection,之后添加采集到的音视频数据
- RTCPeerConnection向STUN(SessionTraversal Utilities forNAT)/TURN(Traversal Using Relays aroundNAT)服务器发送请求,返回caller的外网ip地址和端口号
- 通过信令服务器,caller和callee互相传递对方的外网ip地址和端口(媒体协商)
- 最终P2P链接建立完成,后面就会源源不断的发送音视频数据到对端
下面就是该过程对应的泳道图:
4. 信令服务器(重要)
信令是实现音视频通信的重要一环,比如创建房间、离开房间、交换双端offer/answer以及candidate信息等。但WebRTC规范文档中并未定义信令相关的内容,因为不同业务,逻辑不同,信令也会千差万别,所以需要各个业务自己实现一套信令服务。
下面以socket.io为例,实现一套信令服务:
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');const USER_LIMITS = 3;const app = express();
const httpServer = http.createServer(app);
const io = new Server(httpServer);const getRoomUsers = room => {const myRoom = io.sockets.adapter.rooms[room];return myRoom || [];
};const getRoomUsersCount = room => {return getRoomUsers(room).length;
};// 连接事件
io.sockets.on('connection', socket => {// 转发消息socket.on('message', (room, data) => {console.log(`message, room: ${room}, data type: ${data.type}`);socket.to(room).emit('message', room, data);});// 加入房间socket.on('join', room => {socket.join(room);const userCount = getRoomUsersCount(room);console.log(`user join, room number ${userCount}`);// 房间未满员if (userCount < USER_LIMITS) {// 广播用户加入房间socket.emit('joined', room, socket.id);if (userCount > 1) {// 广播其他用户加入房间socket.to(room).emit('otherJoin', room, socket.id);}}// 房间满员else {socket.leave(room);socket.emit('full', room, socket.id);}});socket.on('leave', room => {socket.leave(room);const userCount = getRoomUsersCount(room);console.log(`user leave, room number ${userCount}`);// 广播有用户退出房间socket.to(room).emit('exit', room, socket.id);socket.emit('leaved', room, socket.id);});
});httpServer.listen('80');
常用API
WebRTC 详解信令服务器媒体协商及实战(及通讯过程)相关推荐
- 服务器给站点读写权限,IIS7目录权限设置的问题详解Windows服务器操作系统 -电脑资料...
今天自己把服务器安装了windows 2008同时也是iis7了,但是在设置权限时有些小问题不了解后来百度了才知道解决办法, 前段时间在windows server 2008 r2 (x64)服务器上 ...
- xp系统本地服务器环境配置,Windows XP安装Apache环境图文详解Windows服务器操作系统 -电脑资料...
本文章来简单的介绍Windows XP安装Apache环境图文方法,有需要了解的朋友可参考参考, 双击 apache_2.2.8-win32-x86-no_ssl.msi 文件,开始安装 Apache ...
- #史上最详解# IIS服务器查看log日志
windows IIS 目前有两个版本 IIS6.0,与IIS7.5,不同版本默认的日志位置与日志设置均有差别 https://blog.csdn.net/mystonelxj/article/det ...
- 刀片服务器改台式电脑_详解刀片服务器如何走向融合
刀片服务器已经在数据中心固定了很久了,但目前的情况已经发生了巨大的变化,现在许多企业使用机架式服务器而不是刀片式服务器,下文是我给出的专业解析,一起去看看吧. 新趋势下的企业业务需要更低成本.更高效率 ...
- Git详解之四 服务器上的Git
Git详解之四 服务器上的Git 服务器上的 Git 到目前为止,你应该已经学会了使用 Git来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git仓库.尽管技术上可以从个人的仓库里推送和拉 ...
- 详解nginx服务器绑定域名和设置根目录的方法
主要介绍了详解nginx服务器绑定域名和设置根目录的方法,nginx服务器绑定域名以及设置根目录非常方便,小 编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 nginx服务器 ...
- 详解Shell编程之if语句实战(小结)
本篇文章主要介绍了详解Shell编程之if语句实战(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 对于if语句,其实很多人都肯定的听说过,那么if语句到底是什么, ...
- linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程
LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...
- 『矩阵论笔记』详解最小二乘法(矩阵形式求导)+Python实战
详解最小二乘法(矩阵形式求导)+Python实战! 文章目录 一. 矩阵的迹 1.1. 转置矩阵 1.2. 迹的定义 1.3. 七大定理 二. 最小二乘法 2.1. 求解介绍 2.2. 另一角度 2. ...
最新文章
- django里static配置静态文件的引入
- 浅谈地方门户网站运营思路
- 并发编程面试题(2021最新版)
- 操作系统笔记(六)调度
- 创建一个学生信息表,与页面分离
- mongodb 创建数据库权限账号,增删改查(基本操作)
- 整理了一个带语法高亮显示,及到处html功能的richtextbox控件
- 软件开发高手须掌握的4大SQL精髓语句(综合篇)
- Spring MVC 中的REST支持
- 【吾日三省吾身】2015.6.07-涅槃行动第二十天
- 基于SSM+Layui图书借阅管理系统设计
- 项目实战之微信、微信公众号登陆和支付调起
- 如何用C语言在控制台输出437代码页编码下的ASCII字符
- 计算机启动太慢的原因是,电脑启动慢的原因分析
- 计算机培训有假期吗,教师假期计算机培训心得体会
- 谈iphone电话短信增强工具kuaidail软件的实现
- Voyager如何使用Compass
- 计算机系教师评学总结,信息技术教学心得3篇
- spring框架学习 - Data Access之 事务管理 - 声明式事务管理
- OpenCV学习(二)---树莓派上安装opencv
热门文章
- CORS连续运行参考站
- Win10黑色白色主题切换
- 从远程仓库拉取最新代码合并到本地分支
- 电商产品设计实战(二):电商整体产品架构
- Arduino 四位数码管控制
- 如何设计一个高性能的秒杀系统
- Axure电子投标、应标交易平台高保真原型+采购计划评标系统物料管理采购立项任务分配项目策划标准寻源(开标、发标、招标、应标、中标、竞价、标书管理)订单管理拟标小组配置
- Z-Wave Zniffer抓包工具使用指南
- R语言ggpubr包的ggscatter函数可视化散点图(scatter plot)、cor.coef为散点图添加相关性系数及其显著性、cor.coeff.args参数指定相关性计算方法及显示格式
- cad lisp 管道截面_CAD中LISP程序自动画管线图