如何实现网页视频聊天?

article/2025/9/24 8:44:56

在网页里实现文字聊天是比较容易的,但若要实现视频聊天,就比较麻烦了。这里,我们将实现一个简单的网页版视频聊天Demo,可以支持所有类型的浏览器。

      本Demo除了视频聊天功能外,还包含以下功能:

1.上下线通知:假设所有用户都是好友,任何一个用户上线,都会出现在其他人的好友列表中,下线则会从好友列表中移除。

2.掉线后会自动进行断线重连。

3.当同名的用户登陆时,会把前面的用户挤掉。

4.所有在线用户之间进行文字聊天。

5.与在线好友进行视频聊天。 

一. Demo运行效果

    先来看看Demo的最终效果吧!

二. JS 实现过程

1.实现账号登录

    登录界面如下: 

   

打开视频聊天demo网页时,会出现登录界面,输入视频服务器IP、账号(使用随机生成的就可以),点击登录按钮就可以登录到视频聊天服务器。

调用ESFramework框架的RapidPassiveEngine()的initialize方法,以及OMCS框架的MultimediaManager的Initialize方法以完成登录。

登录成功后会自动进入用户主界面。

        //OMCS登录$('#Singin').bind("click", function () {this.multimediaManager = MultimediaManagerFactory.GetSingleton();var id = document.getElementById("userID").value;//用户idvar posw = document.getElementById("logonPassword").value;//用户密码var serverIP = document.getElementById("serverIP").value;//ip地址// var serverPort = document.getElementById("serverPort").value;//端口try {if (this.multimediaManager.Connected() == true) {this.multimediaManager.Initialize(id, posw, serverIP, 9900);             } else {alert("登录失败");console.log("多媒体webSocket还未连成功");}}catch (ex) {console.log(ex);}})//ESFramework登录$('#Singin').bind("click", function () {                       engine.initialize({serverIP: serverIP,//服务器IPserverPort: serverPort,//服务器端口userID: userID,//登录用户名useWss: false,logonPassword: hex_md5(logonPassword),//md5后的密码heartBeat: 5000,//心跳间隔时间(单位为ms)callBackTimeout: 5000,//回调方法超时时间(单位为ms)maxLengthOfUserID: 11,//设置用户名最大长度customizeHandler: new CustomizeHandler(),//用户自定义消息处理器loginResutCallBack: function (loginResult) {//登录结果回调方法if (loginResult.logonResult == 0) {//登录成功$("#chatBox").html("登录服务器成功");document.getElementById('loginid').innerHTML = '当前账号 '+userID;document.getElementById('login').style.display = 'none';document.getElementById('main').style.display = 'block'                      //esf登录engine.ContactsOutter.addEventListener(new contractsListener());//注册联系人事件engine.BasicOutter.addEventListener(new basicListener());//注册基础事件});};

2. 实现文字聊天

使用通信框架最基础的需求就是收发信息,ESFramework(WebSocket)底层已经为我们封装好了所有与信息收发相关的操作,  当RapidPassiveEngine被new出来以后,RapidPassiveEngine对象就实例化了CustomizeOutter 属性,在对象的initialize函数被调用后,即可调用CustomizeOutter 里面的相关函数来发送消息,以及实现customizeHandler后就可以处理收到的信息。

Web端可以收到来自其它客户端或服务端的信息、大数据块、以及同步调用。

(1)发送文字聊天消息

发送文字聊天信息可时通过调用CustomizeOutter中send()来进行操作,再发送前点击在线用户即可改变targetUser的值从而绑定你要发送信息的对象。

//选择聊天对象
function selectUser(userid) {var selfid = document.getElementById('userID').value;targetUser = userid;$("#chatBox").html("正在与" + userid + "对话中.....");var shows = document.getElementById('showfather').children;//console.log(shows);for (var i= 0; i < shows.length; i++) {if (shows[i].id != (userid + 'show')) {shows[i]. className='othershow'}document.getElementById(userid + 'show').className = 'shownow'}
}

发送信息时可以自定义不同的参数,从而判断出不同的消息类型。

//发送信息    $("#btn").bind("click", function () {if ($(".bottomtext").val() == "") {alert("不能发送空消息~");return;}else if (targetUser.length == 0) {alert("未选中目标用户~");return;}else {value = $(".bottomtext").val();var selfid=document.getElementById('userID').value;appendContent("自己", value,selfid);$(".bottomtext").val("");var time = [];var info = util.getbytes(value);//以下为与服务端定义的协议体var stream = new OStream(time);var bodyLen = 4 + 4 + info.length + 4;stream.writeInt32(bodyLen);stream.writeInt32(info.length);stream.write(info);stream.writeInt32(1);//发送时间  距离2016.01.01 00:00:00的总秒数engine.CustomizeOutter.send(0, stream.getBytesArray(), targetUser);}})

(2)处理文字聊天消息

当我们收到其他在线用户或者服务端发来的信息时,通过实现customizeHandler接口来获取和处理信息。

我们在用户登录时调用initialize方法时转入即可自动处理接收到的信息,接收到的信息我们通过判断信息类型来执行不同的操作。

function CustomizeHandler() {this.handleInformation = function (sourceUserID, informationType, info) {if (informationType == 0)//聊天消息{                  } else if (informationType == 1)//视频消息{                            } else if (informationType == 2) {                               } else if (informationType == 3) {}

(3)渲染显示文字聊天消息

通过appendOtherContent和appendContent函数将信息在页面中渲染出来通过传入的对象OppositeID不同将收到的信息渲染到不同的聊天窗口。并且通过selectUser来切换到发送信息的用户的窗口。

function appendContent(sendName, content, OppositeID) {Time = getTime();$("#" + OppositeID).append('<div class="selfstyle"><p class="selfname">' + sendName + ":" + Time + '</p><p>' + content + '</p></div>');$("#" + OppositeID).animate({ scrollTop: 99999 });}function appendOtherContent(sendName, content, OppositeID) {Time = getTime();selectUser(OppositeID);var showid = OppositeID + 'show'$("#" + showid).append('<div class="otherstyle"><p class="othername">' + sendName + ":" + Time + '</p><p>' + content + '</p></div>');$("#" + showid).animate({ scrollTop: 99999 });

3. 实现视频聊天

      视频聊天功能可以让你与服务器上的在线用户进行视频聊天,通过OMCS服务插件来实现摄像头和麦克风的连接,所以在使用前必须打开OMCS视频服务Web插件才能正常使用。

(1)点击视频聊天后先通过CustomizeOutter 的send向对方发送消息类型为1的视频连接请求数据,同时打开视频聊天的窗口并且打开自己的摄像头和麦克风连接

(2)视频连接对象收到数据类型为1的视频连接请求后出接受视频连接的聊天框,可以选择接受或拒绝.

         当视频连接对象选择接受视频聊天,则会同时连接自己和对方的摄像头麦克风;

         当对方拒绝时,则关闭视频连接的请求。

         选择过后将会发送一条消息类型为2的消息给视频的发起者。

(3)视频发起者收到数据为2的回复后,会进行判断对方的选择是接受还是拒绝,若是接受则开始连接对方的摄像头,拒绝则关闭自己的摄像头麦克风和视频连接窗口。

(4)当某一方关闭连接或者断开连接时会发送一条消息类型为3的消息发给另一方,收到类型为3的消息后会断开自己的摄像头和麦克风连接。

在连接过程中也可通过视频聊天窗口的控件,控制自己的摄像头麦克风的开启和关闭。

发送视频请求时间如下(接受拒绝和关闭同理)

$('#videomic').bind('click', function () {     if (targetUser.length == 0) {alert("未选中视频聊天用户~");return;} else {value = 'null';console.log(value);document.getElementById('VideoMic').style.display = 'block';document.getElementById('VideoHeardTxt').innerHTML = '连接中...';document.getElementById('VideoSelf').src = 'img/video.jpg'document.getElementById('VideoOther').src = 'img/head.jpg'ConnertVideoSelf(userID, 'VideoSelf')appendContent(selfid, "我发送了视频请求");var time = [];var info = util.getbytes(value);//以下为与服务端定义的协议体var stream = new OStream(time);var bodyLen = 4 + 4 + info.length + 4;stream.writeInt32(bodyLen);stream.writeInt32(info.length);stream.write(info);stream.writeInt32(1);//发送时间  距离2016.01.01 00:00:00的总秒数var userID = document.getElementById('userID').value;         engine.CustomizeOutter.send(1, null, targetUser);}})

视频麦克风连接事件如下

var microphoneConnector, dynamicCameraConnector;
var cameraArr = [];
var micArr = [];
function Connectvideo(destID, whichimg) {var a = document.getElementById(whichimg);this.dynamicCameraConnector = new DynamicCameraConnector();this.dynamicCameraConnector.ConnectEnded = connectEnded;  //连接成功监听this.dynamicCameraConnector.Disconnected = disconnected;  //连接关闭监听this.dynamicCameraConnector.OwnerOutputChanged = videoOutput;this.dynamicCameraConnector.SetAutoReconnect(true);this.dynamicCameraConnector.AutoReconnectSucceed = videocl;this.dynamicCameraConnector.SetViewer(a);this.dynamicCameraConnector.BeginConnect(destID);//开始摄像头的连接cameraArr.push(this.dynamicCameraConnector);this.microphoneConnector = new MicrophoneConnector();this.microphoneConnector.ConnectEnded = microphone;this.microphoneConnector.OwnerOutputChanged = micOutput;this.microphoneConnector.SetAutoReconnect(true);this.microphoneConnector.AutoReconnectSucceed = miccl;this.microphoneConnector.BeginConnect(destID);//开始麦克风的连接micArr.push(this.microphoneConnector);
}

视频聊天的几个特性:

(1)一方发起视频对话请求,对方同意后,即可开始视频对话。 

(2)在对话的过程中,任何一方都可以挂断,以终止对话。 

(3)在对话的过程中,任何一方掉线,都会自动终止对话。 

(4)点击右下角较小视频窗口,会放大该视频显示窗口。

(5)Web版的视频聊天可以与pc版视频聊天互通。

三. 网页视频聊天Demo源码下载

1. 视频聊天Demo Web端 源码(JavaScript)

2. 视频聊天Demo 服务端+PC端 源码

当运行本Demo的 Web端时,如果尚未安装OMCS视频服务Web插件,网页会自动提示下载安装。

完成安装后,刷新网页,会提示启动插件,点击同意启动后,再次刷新网页即可进行正常登录了。Web插件以托盘形式运行,如下图所示:   

      

如果不想自己编译服务端和PC客户端,可以直接下载我已经编译好的可直接运行的部署版本: VideoChat.Exe.rar

部署版本压缩包里的服务端可以放到公网的服务器上,双击exe即可运行。PC客户端修改VideoChat.exe.config配置文件中的IP为公网服务器的IP,即可运行PC客户端测试。

如此,PC客户端和Web端即可互通,以进行文字聊天和视频聊天。

四. 注意事项

1. 首先将服务端部署到服务器上,双击exe运行起来,然后再登录Web端和PC客户端测试。

2. 一台电脑只能运行一个Demo Web端。

3. 测试视频聊天时,两个用户最好在不同的房间,以防止声音相互干扰。

4. Web版与在线用户聊天时,聊天内容并不是保存在云端的所以用户下线后记录会被清空。     


http://chatgpt.dhexx.cn/article/hT6n5BPG.shtml

相关文章

qq不加好友实现网页在线聊天(qq在线客服)

需求 再网页中添加自己的qq&#xff0c;方便别人联系你&#xff0c;但是有的时候仅仅是询问一些问题&#xff0c;并不需要加好友&#xff0c;那么此时使用qq官方的推广工具就非常方便了。 官网地址&#xff1a;qq推广 开通免费推广功能后&#xff0c;就可以直接通过点击网页上…

php源码 网页聊天_php即时在线网页聊天源码-响应式设计自适应手机端

基于PHP WebSocket即时通讯开发的在线聊天源码&#xff0c;使用高效优雅的 Laravel 框架进行非通讯部分开发。前台与后台自适应PC与移动端&#xff0c;支持一对多交流&#xff0c;可以自由创建新的房间与解散创建的房间&#xff0c;集成签到功能&#xff0c;等级功能&#xff0…

【亲测可运营】PHP匿名在线聊天室/语音聊天室/多国语言版在线聊天室

简介 PHP匿名在线聊天室源码/自定义群组聊天系统/可设置密码支持自适应多端访问运营版&#xff0c;一款支持多国语言的在线群聊系统源码&#xff0c;可以新建一个群组&#xff0c;然后设置密码&#xff0c;或者公开访问都可以&#xff0c;聊天都是匿名的&#xff0c;方式还是不…

Java网页版仿QQ实现在线聊天功能

疫情期间&#xff0c;整天闷在家里又不能聚会&#xff0c;大把的空余时间差点让我发霉&#xff0c;后来有个客户发来新年祝贺&#xff0c;让我突然想起了一件事情&#xff0c;就是他曾经提起过&#xff0c;要是在后台管理系统里面整合个聊天功能该多好啊&#xff0c;有了这个念…

基于PHP的在线聊天室(网页版)

前言 此项目免费分享(群文件中获取) 交流群&#xff1a;758350964(已满) 交流群2&#xff1a;511496356 一 项目介绍 基于PHP的在线聊天室(网页版) 技术栈 phpmysqlbootstrap 可搭建在phpstudy下快速部署 二 主要功能 1 注册/登录 2 聊天功能 3 撤回功能 4 查看群成员 三…

网页版聊天服务器,网页版在线聊天室

引言 实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询、长连接+长轮询、基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSocket,当然HTML5目前在PC端并没有被所有浏览器支持,所以我的这个聊天室仍是基于长连接+…

网页版QQ、MSN等等聊天工具web版大全

首发地址 http://www.178good.cn/178/Html/?209.html 相关网址:聊天工具大全 http://www.178good.cn/178good/soft/liaotian.html MM是个十足的聊天迷,走到哪里聊到哪里。不光酷爱聊天,并且诸如MSN、Yahoo Messenger、Google Talk等即时通讯软件(IM)上都有很多的好友。…

网页版网络聊天室设计与实现(Java+SSH+MySQL)

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景及意义 1 1.2国内外研究现状 2 1.2.1 国内研究现状 2 1.2.2 国外研究现状 2 1.3主要研究成果与趋势 3 1.4研究主要内容 4 第2章 开发技术工具概述 5 2.1 JSP技术 5 2.2 SSH框架 6 2.3 Servlet技术 7 2.4 MyEclipse开发工具 …

贝叶斯法则(公式)

转自&#xff1a;MBA智库 侵权删 文章目录 概念贝叶斯法则&#xff08;公式&#xff09;原理贝叶斯法则实例 概念 什么是贝叶斯法则   贝叶斯的统计学中有一个基本的工具叫贝叶斯法则、也称为贝叶斯公式&#xff0c; 尽管它是一个数学公式&#xff0c;但其原理毋需数字也可…

贝叶斯公式的理解与推导(简单版本)

院子里面有条狗&#xff0c;过去几十年中&#xff0c;平均100天狗会叫50天&#xff0c;平均100天被偷盗一次&#xff0c;偷盗时有90%概率狗会叫&#xff0c;请问当狗叫的时候&#xff0c;是小偷入侵的概率有多大&#xff1f; 分析&#xff1a; 狗叫为独立事件A&#xff0c;偷盗…

贝叶斯公式简单解释及其运用

简介 贝叶斯定理是18世纪英国数学家托马斯贝叶斯&#xff08;Thomas Bayes&#xff09;提出得重要概率论理论。以下摘一段 wikipedia 上的简介&#xff1a; 所谓的贝叶斯定理源于他生前为解决一个“逆概”问题写的一篇文章&#xff0c;而这篇文章是在他死后才由他的一位朋友发…

贝叶斯公式推导及意义

条件概率公式 设A,B是两个事件&#xff0c;且P(B)>0,则在事件B发生的条件下&#xff0c;事件A发生的条件概率&#xff08;conditional probability)为&#xff1a; P(A|B)P(AB)/P(B)乘法公式 1.由条件概率公式得&#xff1a; P(AB)P(A|B)P(B)P(B|A)P(A) 上式即为乘法公…

浅谈全概率公式和贝叶斯公式

一、条件概率公式 举个例子&#xff0c;比如让你背对着一个人&#xff0c;让你猜猜背后这个人是女孩的概率是多少&#xff1f;直接猜测&#xff0c;肯定是只有&#xff15;&#xff10;&#xff05;的概率&#xff0c;假如现在告诉你背后这个人是个长头发&#xff0c;那么女的概…

贝叶斯公式基本推导

基础知识&#xff1a; ①条件概率 &#xff1a;P(B|A) P(AB) / P(A) 其中P(AB) P(A∩B) 即事件A 和事件B同时发生的概率 由上式变形可知 P(AB) P(A) * P(B|A)。 ②全概率公式 &#xff1a; 在计算一个比较复杂事件的概率时&#xff0c;我们总是希望从已知的简单地…

神奇的贝叶斯公式

引言 贝叶斯法则以托马斯.贝叶斯命名&#xff0c;他研究如何计算二项分布的概率参数的分布。贝叶斯法则被世界广泛认识&#xff0c;得益于Richard Price的推广和宣传。Price编辑了贝叶斯的主要著作《An Essay towards solving a Problem in the Doctrine of Chances》&#xf…

贝叶斯公式

1、贝叶斯要解决的问题 贝叶斯公式就是已知先验概率&#xff0c;估计后验概率。 2、贝叶斯公式 条件概率公式&#xff1a; 全概率公式&#xff1a; 贝叶斯公式&#xff1a; 其中&#xff1a;p(w)&#xff1a;为先验概率&#xff0c;表示每种类别分布的概率&#xff1b;&#…

教你如何理解贝叶斯公式

贝叶斯公式 定理贝叶斯的英文概率论中的一个定理&#xff0c;跟它随机变量的条件概率以及边缘概率分布有关。 下面是贝叶斯的公式&#xff1a; 其中P&#xff08;A | B&#xff09;。是指在事件乙发生的情况下事件甲发生的概率其中甲代表的是所属的类别&#xff08;Y&#xf…

贝叶斯公式与全概率公式的理解。

1.贝叶斯与全概率公式解释 1.全概率公式定义 即若在某个场景下&#xff0c;可找到一个完备事件组 Ai ( i 1,2,3…n)。 则对任一与该场景有关的事件 B&#xff0c;都可以分割成无数个小事件&#xff08;由不同因素引起的事件&#xff09; 有&#xff1a;   B B ∩ A1 ∪ A2…

条件概率、贝叶斯公式理解

1、条件概率 条件概率是指事件A在事件B发生的条件下发生的概率&#xff0c;记作&#xff1a;P&#xff08;A|B)。如下图所示&#xff1a;整个样本空间为Ω&#xff0c;事件A和事件B包含在Ω中。事件A和事件B同时发生的情况&#xff0c;即A、B交集记作AB。事件A的概率记作&…

简单理解贝叶斯公式

贝叶斯公式&#xff1a;给定一组所关心事件的先验概率&#xff0c;如果你收到新的信息&#xff0c;那么更新你对于事件发生概率的法则为&#xff1a; 某城市发生了一起汽车撞人逃跑事件&#xff0c;该城市只有两种颜色的车&#xff0c;蓝色15%&#xff0c;绿色85%&#xff0c;事…