由于Node.js是基于事件驱动的单线程异步IO,能够提高服务器的并发性能,且一直很火的视频直播软件也层出不穷,于是跟风来填个坑,学习学习。
最开始是看了一个教程,跟着学,实现一个既有视频通话功能,又有协同编码功能的web应用,但是无奈跟着教程用peerjs框架怎么都没调出来视频通话,最终没实现成功,于是网上一番百度,最终采用了网上的SkyRTC和PeerJS结合完成的视频通话,源码已上传git(不想看我下面啰里巴嗦乱七八糟博文的请直接去看代码,虽然代码也很乱?),因为涉及的内容很多,所以写的很省略,都是简单介绍。

github连接 https://github.com/ZeoSophia/VideoCall

项目整体目录图

Socket.io框架

WebRTC信令最流行的实现之一是使用Socket.io。Socket.io是一个JavaScript库,用于支持双向基于事件通信的实时web应用程序。Socket.io虽然使用了WebSocket协议,但它不仅仅是一个简单的WebSocket包装器,它还提供了许多其他功能,比如向多个socket广播,支持对大多数WebRTC来说至关重要的“房间”的概念。
在Node.js环境下可以直接安装Socket.io资源包,安装成功之后,首先需调用HTTP模块的createServer()方法将Socket.io与服务端的http.srver绑定。

var app = express();
var server = require('http').createServer(app);
var socketIO = require('socket.io');
var io = socketIO(server);

建立Socket连接,用户通过相同URL(Uniform Resource Locator)进入同一聊天室之后,通过调用io.emit()方法将消息发送给所有进入同一“房间”的用户,即可连接成功,进而实现即时通讯,实现监听连接双方的消息方式如下:

socket.on('chatMessage', function(data) {io.to(socket.room).emit('chatMessage', data);});
socket.on('disconnect', function() {socket.leave(socket.room);
});

视频通话实现

首先通过调用createStream()方法创建本地视频流,方便后期实时的视频流传递播放,同时设置video和audio的属性值,建立方法如下:

 rtc.on("connected", function(socket) {rtc.createStream({"video": true,"audio": true});});

通过接口MediaStream的调用,调用URL.createObjectURL()方法,将生成的媒体流绑定为前端页面”<video>”属性的src的值(实现代码如下),再通过网页对HTML代码解析,将媒体流以本地流的形式播放出来。

rtc.on("stream_created", function(stream) {//成功document.getElementById('me').srcObject=stream;document.getElementById('me').play();});rtc.on("stream_create_error", function() {//失败alert("failed!");});

调用RTCPeerConnection接口后,通过调用RTCPeerConnection(iceServer)方法创建一个新对象,并且通过参数创建一个对象,同时会将此对象和一个ICE(Internet Communications Engine)代理对象以及其状态相关联,并且在创建对象时同时被初始化。

var iceServer = {"iceServers": [{"url": "stun:stun.l.google.com:19302"}]
};
var pc = new PeerConnection(iceServer);

WebRTC浏览器兼容问题

WebRTC API的核心是MediaStream处理API,通常称为媒体流API或流API。MediaStream接口可实现从设备摄像头或话筒获取视频、音频数据流的功能,通过调用getUserMedia()方法获取,采用此接口的方法解决由于浏览器版本不同,导致内核版本不同的问题。

var getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);

协同编程

由于Socket.io作为一个应用层不仅能够传递视频、音频等多媒体流,同时也可以传输其他类似文档型的二进制流。前端部分通过’<textarea>’标签存放,服务段部分发现是该页面之后,先检测是否有前端页面数据传入,通过调用res.render()的方法将数据动态渲染出来。

<textarea id="code-screen">{{content}}</textarea>
<script>
var code = $('#code-screen').val();var cmClient;function init(str, revision, clients, serverAdapter) {if (!code) {editor.setValue(str);}
cmClient = window.cmClient = new EditorClient(revision, clients, serverAdapter, new CodeMirrorAdapter(editor))};socket.on('doc', function(obj) {init(obj.str,obj.revision,obj.clients,new SocketIOAdapter(socket));});
</script>

当两用户成功建立连接时,从数据库通过查找获取代码编辑区实时的内容,前端页面并进行回显,实现用户体验感上的“协同编程”。

if (data) {res.render('task', {content: data.content, roomId: data.id});
} else {res.render('error');
}Task.findByIdAndUpdate(data.room,{content: self.document}, function(err) {if (err) return cb(false);cb(true);});
  • 运行代码前一定要先给peer分配端口

Nodejs+MongoDB+WebRTC搭建视频通话协同应用相关推荐

  1. 从入门到进阶|如何基于WebRTC搭建一个视频会议

    文|网易智慧企业流媒体服务器天团 导读:疫情期间,视频会议等远程办公产品备受青睐,众多互联网玩家切入视频会议市场,加剧市场竞争.但是,产品虽多,能够带来稳定可靠体验的产品却凤毛麟角,它的难点在哪里?视 ...

  2. 如何基于WebRTC搭建一个简单的视频会议

    前言 WebRTC,它是由谷歌推广的实时音视频技术栈,是音视频领域搜索热度最高的技术.它有多重身份,既是W3C的标准,也是一个开源项目,还有一个对应的IETF工作组(RTCWEB).在WebRTC出现 ...

  3. nodejs web应用服务器搭建(一):跑起你的服务器

    前言 本章会分四部分来讲,在开始教程之前请准备好相关基础知识 & 文档 JavaScript基础:AMD概念:ES5 | ES6语法:(这些没弄清楚估计往下看也看不下去) nodejs 环境搭 ...

  4. Android WebRTC语音视频通话demo

    Android WebRTC简介 https://blog.csdn.net/Charon_Chui/article/details/80510945?utm_term=%E6%89%8B%E6%9C ...

  5. iOS下WebRTC音视频通话(一)

    在iOS下做IM功能时,难免都会涉及到音频通话和视频通话.QQ中的QQ电话和视频通话效果就非常好,但是如果你没有非常深厚的技术,也没有那么大的团队,很难做到QQ那么快速和稳定的通话效果. 但是利用We ...

  6. android 使用WebRTC搭建视频聊天室

    使用WebRTC搭建前端视频聊天室--入门篇 https://www.jianshu.com/p/b54b27970534 android webrtc 两个手机 P2P 视频聊天 https://w ...

  7. 基于WebRTC搭建直播平台

    基于WebRTC搭建直播平台 直播可以说是近年来最火的互联网项目,各大直播平台如雨后春笋般先后兴起,转眼间主播这一行业也成为最赚钱的代名词.那我们就来从0开始搭建一个直播平台吧. WebRTC Web ...

  8. NodeJS入门--环境搭建 IntelliJ IDEA

    NodeJS入门–环境搭建 IntelliJ IDEA 本人也刚开始学习NodeJS,所以以此做个笔记,欢迎大家提出意见. 1.首先 下载安装NodeJS,下载安装IntelliJ IDEA 2.接下 ...

  9. 使用WebRTC搭建前端视频聊天室——数据通道篇

    转自 使用WebRTC搭建前端视频聊天室--数据通道篇 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩 ...

  10. Mongodb安装搭建Replica Set+Sharding集群

    2019独角兽企业重金招聘Python工程师标准>>> Mongodb安装搭建Replica Set+Sharding集群 一.简介 Replica Set:复制在为数据提供了冗余同 ...

最新文章

  1. jupyterlab debugger+显示图片
  2. mysql中关于count(*) count(id)的误区
  3. Spring MVC handler interceptors example--转载
  4. 为何说国内云桌面已经步入成熟期
  5. 男朋友让我纹他的名字,但我不想纹怎么办?
  6. unity 陀螺仪控制节点旋转
  7. php 2个时间查询差几天,PHP怎么计算2个日期差
  8. [RK3399]移植工具i2c-tools
  9. 一个医院内的计算机网络系统属于,医院信息管理系统
  10. Command not found 解决
  11. 信息系统项目管理师考试怎么复习最有效?
  12. Python的mpl_finance模块从2020年已经提醒弃用,新mplfinance模块详解(二)
  13. find与ls命令合体坑总结
  14. pythontext函数用法汇总_Python - Text Summarization
  15. 真相(truth)最可怕的敌人不是谎言(lie),而是神话(myth)
  16. 软件公司要咨询顾问干什么?
  17. 学1个月爬虫就月赚6000?别被骗了,老师傅告诉你爬虫的真实情况
  18. [经验] PROTEUS仿真学习笔记05 (SPI 协议 外设)——2014_7_15
  19. 《Android入门之旅》
  20. Trait 是什么?

热门文章

  1. bzoj 1941 kd-tree求最大最小曼哈顿距离
  2. App进行内测麻烦吗?如何进行App内测?
  3. linux设置硬盘启动顺序,电脑双硬盘双系统启动的顺序调整及设置方法
  4. SQL Server卸载不干净和重新安装问题
  5. 链路(link)与数据链路(data link)
  6. 基于嵌入式技术的智能灌溉系统设计与实现
  7. 本人github网址:https://github.com/HuaAndLi
  8. 【设计模式】设计模式总览-----程序员的九阳神功
  9. 会员积分兑换系统的基础运营
  10. iNode 校园网登录一直处于“获取 IP 地址”状态