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. ...
最新文章
- 一副耳机的钱,竟让我体验了「元宇宙」办公
- BL1551模拟开关,封装SC70-6
- POJ1207-The 3n + 1 problem
- MTCNN——基于级联模型的人脸关键点检测网络
- html5动画测试题,Html5+js测试题
- 为啥程序员下班后只关显示器从不关电脑?看看各大网站的答案
- [原创]基于EDFlib/C++实现脑电数据EDF标准格式读写
- Spring Boot系列 —(一)手把手搭建 SpringBoot 项目
- python seek(0)_seek() 方法
- 英语四级口语测试软件,2021年大学英语四级口语测试题
- 金针探底技术分析(下)
- iOS 自定义页面的切换动画与交互动画 By Swift
- 831数据结构与c语言试题,2018年广东工业大学计算机院831数据结构与C语言[专硕]之C程序设计考研核心题库...
- 使用vscode编辑vue模板
- 家用计算机相比工控机优点,具体分析工控机比一般的PC的优势
- SSM实现点餐系统(含源码)
- LINGO使用指南(转载)
- DT时代,企业要有“经营安全、安全经营”新思维
- html5 video audio currentTime 设定失效、重头开始播放
- SRT协议详解三 传输参数
热门文章
- 2.1.1 Abp vNext 地磅无人值守 接口服务创建
- 用ASP创建Microsoft Word 文件
- git文件上绿色红色图标不显示的问题
- 计算机电缆铠装电缆护套管,电缆护套管常用型号介绍
- 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】
- 【元胞自动机】激进策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1296期】
- 阿达帕拉肽AVSEHQLLHDKGKSIQDLRRRELLEKLL-Aib-KLHTA-NH2
- 千千静听声控精灵(语音识别)
- 免费提供各种网络创业项目资源给你们(wcceo.com)
- 【原创】让你的系统轻松预览AI,PSD,EPS,CDR缩略图!