搭建一个多对多的音视频通信服务
多方音视频通信三种架构方案
一、Mesh 方案
即多个终端之间两两进行连接,形成一个网状结构。这种方案是1v1 WebRTC 通信模型的扩展版,任何两个结点都可以看成一个1v1 WebRTC 通信模型。
优势:不需要服务器中转数据,STUN/TUTN 只是负责 NAT 穿越,这样利用现有 WebRTC 通信模型就可以实现,而不需要开发媒体服务器。
劣势:需要给每一个参与人都转发一份媒体流,这样对上行带宽的占用很大。参与人越多,占用的带宽就越大。客户端的机器资源的占用与参与人数成正比,当参与人数过多时,此方案就不可用了。通过实践来看,这种方案在超过 4 个人时,就会有非常大的问题。 另外,由于STUN/TUTN 只是负责 NAT 穿越,如果有部分人不能实现 NAT 穿越,就无法连接。
二、MCU(Multipoint Conferencing Unit)方案
该方案由一个服务器和多个终端组成一个星形结构。MCU 主要的处理逻辑是:接收每个共享端的音视频流,经过解码、与其他解码后的音视频进行混流、重新编码,之后再将混好的音视频流发送给房间里的所有人。
实际上服务器端就是一个音视频混合器,这种方案服务器的压力会非常大。MCU 技术在视频会议领域出现得非常早,目前技术也非常成熟,主要用在硬件视频会议领域。
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
三、SFU(Selective Forwarding Unit)方案
该方案也是由一个服务器和多个终端组成,但与 MCU 不同的是,SFU 不对音视频进行混流,收到某个终端共享的音视频流后,就直接将该音视频流转发给房间内的其他终端。
它实际上就是一个音视频路由转发器,并且它可以根据终端下行网络状况做一些流控,可以根据当前带宽情况、网络延时情况,选择性地丢弃一些媒体数据,保证通信的连续性。下面详细介绍一下。
总结
相比 Mesh方案,SFU 和 MCU 都需要中转服务器。由于 MCU 方案需要将多路视频混合成一路,需要大量的运算,对 CPU 资源的消耗很大,一般需要专门的硬件进行处理。而 SFU 方案由于不需要多路视频混编,所以对 CPU 的需求没有那么大,但它可能导致在多路视频的情况下,会有在同一时刻,不同的人看到的画面不一致的问题。
所以,如果你不想用中转服务器,就选择 Mesh方案;如果你对多路视频的一致性要求高,有专门硬件,建议选择 MCU 模式;其他情况建议使用 SFU 模式。
SFU方案
SFU 方案根据在网络延时时丢弃媒体数据的方式不同,分为 Simulcast 模式和 SVC 模式,
Simulcast 模式
所谓 Simulcast 模式就是指视频的共享者可以同时向 SFU 发送多路不同分辨率的视频流(一般为三路,如 1080P、720P、360P)。而 SFU 可以将接收到的三路流根据各终端的情况而选择其中某一路发送出去。
例如,由于 PC 端网络特别好,给 PC 端发送 1080P 分辨率的视频;而移动网络较差,就给 Phone 发送 360P 分辨率的视频。
SVC 模式
SVC 是可伸缩的视频编码模式。它在视频编码时将视频分成多层 —— 核心层、中间层和扩展层。上层依赖于底层,而且越上层越清晰,越底层越模糊。在带宽不好的情况下,可以只传输底层,即核心层,在带宽充足的情况下,可以将三层全部传输过去。
部署多方视频会议服务
基于上面的分析,我们实现一个基于SFU 方案的项目。开源项目包括 Licode、Janus-gateway、MediaSoup、Medooze。这儿我们部署基于 Medooze的 Demo 项目SFU。
运行环境准备
- 操作系统:Ubuntu 18.04
- 语言环境:NodeJS
apt-get update && apt-get install -y nodejs npm git-core
安装依赖
git clone https://github.com/medooze/sfu.git
cd sfu
npm install
生成证书
证书这块未来有时间集成整理一下。
启动服务
node index.js IP
Docker 服务
Dockerfile 文件
FROM ubuntu:18.04WORKDIR /
RUN apt-get update && apt-get upgrade && apt install -y nodejs npm git-core python3 wget curl && npm install -g n && n stable
RUN hash -r && npm install -g npm@8.5.5
RUN git clone https://github.com/medooze/sfuWORKDIR /sfu
RUN npm install
RUN openssl req -x509 -out ./server.cert -keyout ./server.key -newkey rsa:2048 -nodes -sha256 -subj '/CN=*'
ENTRYPOINT ["node" "index.js"]
Docker 镜像
// 可以用上面的 Dockerfile 文件自己打镜像,也可用用我已经打包好的镜像
docker pull zhaowg/sfu:v1
Docker 版使用方法
docker run -it --net=host zhaowg/sfu:v1 <IP>
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
搭建一个多对多的音视频通信服务相关推荐
- 李郁韬:短期爆发还是未来趋势?腾讯云海量音视频通信服务背后的技术发展
面临特殊时期,无论远程办公.还是学校"停课不停学"都成为时下的必然选择,众多视频会议平台也在特殊环境下开启了短期免费开放及功能服务.但与此同时不可避免会带来突发的大规模在线视频与协 ...
- 【免费活动】解析腾讯云音视频通信三大核心网络技术实战与创新
随着互联网的发展越来越成熟,移动终端成为我们人手必备的生活用品,云计算的普及与高速发展,4G.5G网络的瓜熟蒂落,我们真正的进入了全真互联网时代.2020年,一场突如其来的疫情,很多传统行业不得不将线 ...
- 解析腾讯云音视频通信三大核心网络技术实战与创新
随着互联网的发展越来越成熟,移动终端成为我们人手必备的生活用品,云计算的普及与高速发展,4G.5G网络的瓜熟蒂落,我们真正的进入了全真互联网时代.2020年,一场突如其来的疫情,很多传统行业不得不将线 ...
- 发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
1.HaaS RTC背景介绍 HaaS RTC是阿里云IoT联合视频云开发的IoT设备端上的实时通讯服务,主要面向直播,音视频通话等各种场景.HaaS700是我们HaaS家族新推出的多媒体开发板,它运 ...
- 如何零门槛搭建实时音视频通信平台
迅达云视频云产品全面更新,为用户带来全新的一站式服务体验. 迅达云全面拥抱下一代互联网音视频通信开放标准 WebRTC,依托团队多年行业经验积累,结合迅达云实时音视频通信 SDK,匠心打造了一站式实时 ...
- 即构科技:解决行业痛点,以MSDN为基础构建全球实时音视频通信云
点击上方"LiveVideoStack"关注我们 近日,LiveVideoStack很荣幸地采访到了即构科技RTC后台技术总监--肖潇.在访谈中我们了解到即构科技在构建全球实时音视 ...
- 进入全真互联网——音视频通信的技术变革
导 语 随着5G和下一代编解码.传输等技术持续演进,音视频通话技术从低延时到超低延时实时通信快速迭代,越来越多应用与服务迁移至线上,越来越真实无损地还原线下体验,新的互动方式和场景不断涌现,从高度数字 ...
- 视频教程-Android WebRTC 实现1V1实时音视频通信-Android
Android WebRTC 实现1V1实时音视频通信 从2012年开始从事移动互联网方面的开发工作,曾担任去哪儿网开发工程师,搜狗高级开发工程师,拥有多年一线实战开发经验. 擅长语言:Object- ...
- 音视频通信为什么要选择WebRTC?
在网上经常看到有人说:"在线教育直播是用WebRTC做的","音视频会议是用WebRTC做的"--:"声网.腾讯.阿里--都使用的WebRTC&quo ...
最新文章
- 大区块的BCH给智能合约更大的发展潜力
- idea python-IDEA里如何安装Python插件打造开发环境(图文详解)
- bzoj2091: [Poi2010]The Minima Game DP
- 新版微信小程序即将上线 新增微信支付功能
- PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
- 前端学习(2031)vue之电商管理系统电商系统之创建新分支
- python爬取网页上的特定链接_自学python爬虫二:如何正常操作urllib2通过指定的URL抓取网页内容...
- Android开发实践:Java层与Jni层的数组传递
- python机器学习案例系列教程——LightGBM算法
- Ext.grid.EditorGridPanel点击单元格改变数据,动态添加列
- web显示实时时间动态刷新
- ps教程完整版(来自百度网盘)
- 成功实现有线路由器和无线路由器连接上网
- win10自动更新后打开系统应用提示文件系统错误(-2147219196)
- java word转pdf 后通过 PdfReader 和 PdfStamper对pdf添加水印 通过poi等组件实现
- 【通讯原理】Ch.4:数字信号调制
- Java绘制正态分布统计图
- 美团酒店:如何收割新一代90后住宿需求? | 一点财经
- 网易 七鱼 面试 java_reactJs微信端接入网易七鱼客服
- 学习(Java Web)编程技术要点及方向; 完成项目的要决