赞
踩
uni-app webrtc 实现H5音视频通讯 实战项目详情
目前市场上音视频技术方案大致分为以下几类,WebRTC因其超低延时、集成音视频采集传输等优点,是在线教育、远程会议等领域首选技术。
方案 | 优势 | 劣势 | 应用场景 |
---|---|---|---|
基于浏览器插件的flash播放RTMP | 即将淘汰 | 即将淘汰 | 传统直播 |
跨平台的HLS/DASH 播放方案 | - 跨端广泛支持:苹果浏览器原生支持 - hls.js | - 延时高 - 碎片化 | 传统直播,如赛事直播、大型会议直播 |
基于HTML5 MSE 能力的flv播放技术 | - 格式简单 - 无需插件 | - 移动端MSE支持性差 - 一定延时 | 传统直播,同上 |
WebRTC实时通讯技术 | - 毫秒级的低延时 - 音视频采集上行传输 | - 相对复杂 - 支持度低 - 价格高 - 容量有限 | 在线教育、远程会议 |
WebRTC是 Google 在 2010 年收购 VoIP 软件开发商 GlobalIPSolutions 的 GIPS 引擎后,基于
GIPS 引擎实现的浏览器音视频和数据通信技术,在 2012 年集成到 chrome 浏览器,到目前为止,大部分主流现代浏览器都已经支持。
一个简单的音视频架构大致如下:
如果我们按照上面的架构实现一个音视频通信系统,相当于至少需要开发7个小模块,想想就费时费力。此时WebRTC就可以闪亮登场了,它内部标准化的实现上述架构,并在此基础上进行拓展,对外只暴露了相关的API,其架构图如下( 官网 的有点旧,重新画的):
WebRTC大体可以分为四层:接口层、Session层、引擎层、设备层:
一个正常音视频通信架构如上图所示,通信双方分别是 caller(主叫) 与 callee(被叫),两边的内部逻辑相似,下面以caller端为例,了解内部流程:
下面就是该过程对应的泳道图:
信令是实现音视频通信的重要一环,比如创建房间、离开房间、交换双端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
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。