网页版直播和聊天室

序言

话说上一回,我说到了直播和聊天室,使用的是原生实现的。然而对我来说这太简单了,不足以体现我技术的优越性。下面开启我的装逼之旅。
这里写图片描述

效果

1.截图

这里写图片描述

2.视频

关键看游客模式,登录提醒,跳转登录,发送缓存消息这些功能

网页聊天室效果

这里写图片描述

直播实现

直播使用的是乐视的标准直播。为什么使用乐视标准直播呢,因为他提供了推流客户端,为什么要使用它的推流客户端呢,首先减少开发成本,其次也是最重要的我将在本文的最后揭晓谜底。

乐视云地址

乐视云

这里进入标准直播

这里写图片描述

选择直播活动管理,就可以下载云采集了。

这里写图片描述

Android和IOS都支持

这里写图片描述

接着大家可以在手机,或者在控制台创建活动

这里写图片描述

创建成功就是这样了

这里写图片描述

在操作选择分析活动,就可以拿到HTML代码了,然后网页直播的功能就实现了。

这里写图片描述

聊天室实现

聊天室的实现就比较有技术含量了,而基于的SDK是LeanCloud的网页聊天室
文档在这里实时通信开发指南 · JavaScript

我遇到的困难有几点

1.实现游客模式,在用户未登录的情况下可以看到聊天内容

2.如果用户有聊天,点击发送按钮必须判断用户是否登录,给出提示,并弹到相应的界面。

3.用户在游客模式下输入的内容,要保存起来,在登录以后发送出去

4.用户clientID与用户名的处理,clicendID必须唯一,但是用户昵称可以重复。

这里面涉及到JavaScript和Java的交互,我先把接口提供出来。

    //用于和JavaScript交互的接口class Mobile {//保存聊天信息@JavascriptInterfacepublic void saveMessage(String msg){Log.i("zzz","saveMessage() msg="+msg);isNeedSendMessage=true;needSendMessage=msg;}//是否需要发送缓存的聊天信息@JavascriptInterfacepublic boolean isNeedSendMessage(){//   Log.i("zzz","isNeedSendMessage() isNeedSendMessage="+isNeedSendMessage);return isNeedSendMessage;}//获取缓存的聊天信息@JavascriptInterfacepublic String getNeedSendMessage(){//   Log.i("zzz","getNeedSendMessage()");return needSendMessage;}//消失已经发送,重置状态@JavascriptInterfacepublic void  messageHaveSend(){//    Log.i("zzz","messageHaveSend()");isNeedSendMessage=false;needSendMessage="";}//是否是游客模式@JavascriptInterfacepublic boolean isTouristMode() {return !isLogin();}//获取游客ID@JavascriptInterfacepublic String getTouristID() {return TouristID;}//是否已经登录@JavascriptInterfacepublic boolean isLogin() {return isLogin;}//获取客户端ID@JavascriptInterfacepublic String getClientID() {return clientID;}//弹出警告@JavascriptInterfacepublic void alert(String msg) {Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();}//跳转到登录@JavascriptInterfacepublic void moveToLogin() {needLogin = true;startActivity(new Intent(MainActivity.this, LoginActivity.class));}}

这是和聊天相关的JavaScript代码

//判断是否是游客模式
if(moblie.isTouristMode()){//如果是游客模式的话,获取游客ID并登陆initChatroom(moblie.getTouristID());
}else{//如果不是游客模式,则判断是否登录
if(moblie.isLogin()){//如果已经登录,则获取clientIDinitChatroom(moblie.getClientID());}else{//否则弹出提示moblie.alert("请登录");//跳转到登录界面moblie.moveToLogin();}}//初始化聊天室
function initChatroom(clientID){
angular.module('realTimeModule', []).controller('realTimeCtrl', ['$scope', '$timeout', function($scope, $timeout) {initStatus();initData();function initStatus() {$scope.status = {Realtime: AV.Realtime,appId: "jPbaegow8uVUDUDw1XS7LCv0-gzGzoHsz",region: ['cn', 'us'],//用户名IDclientId:clientID,roomId: "57fcac8ea22b9d005b0e9884",client: "",isLinkSuccess: false,isLinkFailed: false,isLinking: false,messageIterator: "",msg: "",room: "",myMsgs: [],members: [],historys: []};}function initData() {$scope.data = {realtime: new $scope.status.Realtime({appId: $scope.status.appId,region: $scope.status.region[0],}),};initChatroom();setVideoScale();setChatroomHeight();}/*** [initChatroom description] 初始化聊天室* @return {[type]} [description]*/function initChatroom() {$scope.status.isLinking = true;$scope.data.realtime.createIMClient($scope.status.clientId).then(function(client) {$timeout(function() {$scope.status.isLinkSuccess = true;$scope.status.client = client;}, 500);client.on('disconnect', function() {$scope.status.isLinkFailed = true;});return client.getConversation($scope.status.roomId);}).then(function(conversation) {if (conversation) {return conversation;} else {return $scope.status.client.createConversation({name: "chatRoom",members: [],});}}).then(function(conversation) {$scope.status.roomId = conversation.id;return conversation;}).then(function(conversation) {$scope.status.members = conversation.members;return conversation;}).then(function(conversation) {return conversation.join();}).then(function(conversation) {// 获取聊天历史$scope.status.room = conversation;conversation.queryMessages({limit: 50,}).then(function(messages) {var newMessages=new Array();for(var i=0, len=messages.length; i<len; i++){var message=messages[i];handleName(message);newMessages.unshift(message);}$scope.status.historys = newMessages;});conversation.on('message', function(message) {$timeout(function() {handleName(message);$scope.status.historys.unshift(message);});});//发送游客登录时未发送的消息if(moblie.isNeedSendMessage()){var msg= moblie.getNeedSendMessage();$scope.status.msg=msg;//sendMessage();sendMsg();moblie.messageHaveSend();moblie.alert("评论成功");}});}function handleName(message){var from=message.from;var index=from.indexOf("#");if(index!=-1){from=from.substr(index+1);}message.from=from;//  return message;}/*** [sendMsg description] 发送消息* @return {[type]} [description]*/function sendMsg() {if(!moblie.isLogin()){moblie.saveMessage($scope.status.msg);moblie.alert("请登录");moblie.moveToLogin();return;}$scope.status.room.send(new AV.TextMessage($scope.status.msg)).then(function(message) {$timeout(function() {message.from="自己";$scope.status.historys.unshift(message);});$scope.status.msg = '';});}/*** [linkToServer description] 连接到服务器* @return {[type]} [description]*/$scope.linkToServer = function() {initChatroom();};/*** [sendMessage description] 发送消息* @return {[type]} [description]*/$scope.sendMessage = function(e) {if ((angular.isDefined(e) && e.keyCode == 13) || angular.isUndefined(e)) {sendMsg();}};/*** [setVideoScale description] 根据16/9的比例设置视频高度*/function setVideoScale() {var cw = document.documentElement.clientWidth;var scale = 16 / 9;var vh = cw / scale;var video = document.getElementById("player");video.style.height = vh + "px";}/*** [setChatroomHeight description] 设置聊天室的高度(为了移动端一屏展示)*/function setChatroomHeight() {var video = document.getElementById("player");var chatroomHeader = document.getElementById("chatroomHeader");var chatroom = document.getElementById("chatroom");var sendBox = document.getElementById("sendBox");var ch = document.documentElement.clientHeight;var vh = getStyle(video).height;var crheader = getStyle(chatroomHeader).height;var sbh = getStyle(sendBox).height;var crh = parseInt(ch) - parseInt(vh) - parseInt(crheader) - parseInt(sbh);if (crh < 1) {crh = crh + 500;}console.log(crh);chatroom.style.height = crh + "px";chatroom.style.marginBottom = sbh;}function getStyle(ele) {var style = null;if (window.getComputedStyle) {style = window.getComputedStyle(ele, null);} else {style = ele.currentStyle;}return style;}window.onresize = function() {setVideoScale();setChatroomHeight();};}]);}

1.游客模式

实现游客模式的逻辑如下,这是聊天室相关的JavaScript代码。

这里写图片描述

而游客ID的获取如下,通过拼接两个随机数来实现。

这里写图片描述

2.登录判断

看关键的JS代码,主要就是在发送消息的时候判断登录状态。

 /*** [sendMsg description] 发送消息* @return {[type]} [description]*/function sendMsg() {//判断是否登录if(!moblie.isLogin()){//未登录,则保存输入框中的消息moblie.saveMessage($scope.status.msg);//弹出提示moblie.alert("请登录");//跳转到登录界面moblie.moveToLogin();return;}$scope.status.room.send(new AV.TextMessage($scope.status.msg)).then(function(message) {$timeout(function() {message.from="自己";$scope.status.historys.unshift(message);});$scope.status.msg = '';});}

如果需要登录则跳转到登录界面

   //跳转到登录@JavascriptInterfacepublic void moveToLogin() {//表示需要登录needLogin = true;startActivity(new Intent(MainActivity.this, LoginActivity.class));}

LoginActivity如下

public class LoginActivity extends AppCompatActivity {EditText et_name;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);et_name = (EditText) findViewById(R.id.et_name);}public void login(View view) {String name = et_name.getText().toString();MainActivity.isLogin = true;MainActivity.clientID = name;Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();finish();}
}

回来以后在聊天室界面的onResume方法中判断是否需要登录,如果需要通过 webView.reload()重新加载网页。

    @Overrideprotected void onResume() {super.onResume();if (needLogin) {webView.reload();needLogin = false;}}

网页每次加载都会执行这个方法,这里就会进入到登录的逻辑了。

//判断是否是游客模式
if(moblie.isTouristMode()){//如果是游客模式的话,获取游客ID并登陆initChatroom(moblie.getTouristID());
}else{//如果不是游客模式,则判断是否登录
if(moblie.isLogin()){//如果已经登录,则获取clientIDinitChatroom(moblie.getClientID());}else{//否则弹出提示moblie.alert("请登录");//跳转到登录界面moblie.moveToLogin();}}

3.保存未发送信息

1.在发送消息的时候,如果没有登录,则通过Java接口保存消息

 /*** [sendMsg description] 发送消息* @return {[type]} [description]*/function sendMsg() {//判断是否登录if(!moblie.isLogin()){//未登录,则保存输入框中的消息moblie.saveMessage($scope.status.msg);//弹出提示moblie.alert("请登录");//跳转到登录界面moblie.moveToLogin();return;}$scope.status.room.send(new AV.TextMessage($scope.status.msg)).then(function(message) {$timeout(function() {message.from="自己";$scope.status.historys.unshift(message);});$scope.status.msg = '';});}

在登录聊天室成功以后,发送保存的信息

                      //发送游客登录时未发送的消息if(moblie.isNeedSendMessage()){//获取保存的消息var msg= moblie.getNeedSendMessage();$scope.status.msg=msg;//发送消息sendMsg();//重置状态moblie.messageHaveSend();//提示用户moblie.alert("评论成功");}

4.用户ID

这个处理我用在实际的项目中了,这Demo没有,大致的说一样原理
为了实现ClientID唯一,我选择了使用LeanCloud的ObjectID做ClientID但是现实的效果是
一大堆的数字字母串,聊天的时候就这这样了,没有显示用户昵称,效果和差。

aojogo80900nfjf3883949:我是李四
oiigjiooiijglle9939948:我是张三,你的名字好奇怪

于是我使用了ObjectID:昵称 这种形式。比如

aogoijsojgoij5651211sdjk:李四

在获取到消息以后就只截取后面的昵称用来显示

李四:我是李四
张三:我是张三

效果很不错,而且解决了唯一性和易用性的问题,我在真实项目中已经实现了,所以大家也不要怀疑是实用性了。

源码

结构

realtime.html是聊天室界面
realtime.js是聊天室逻辑

这里写图片描述

大家只需要替换,AppID,和roomID为你们自己的就可以用在自己的项目中了

关于弹幕,在获取到消息以后实用JavaScript以弹幕的方式显示就行了。

这里写图片描述

下载

下载地址

总结

这个项目主要的难度是考察了我Java和JavaScript的交互能力,和我的JavaScript的水平。realtime.js中的所有和客户端交互的逻辑都是我自己写的,这里需要重点表扬一下。还有一点可以说明一下,通过这种方式,我们的IOS也可以实现一样的效果,所有小伙伴们不要害怕,如果你们的IOS端做不出来,只能说明水平太菜,一个小插曲就是我的Mobile这个单词写错了,已改是mobile,不过无关大雅。然后说说我们会什么要使用网页实现直播和聊天室,为什么我要在这儿装逼,全都是被逼的,在上一篇博客结束以后,我们告诉客户我们准备用百度云SDK,客户说:”什么!我们乐视云都已经付费了,必须用乐视“。在上一篇文章我就说过乐视云根本不能用,客户不信,于是就有了下面这个。

这里写图片描述

还有这个

这里写图片描述

由于移动直播根本不能用,于是改用标准直播,还有他们官方的推流工具,但是官方的推流工具在Android端依然有兼容性问题。

奉劝大家,真心不要用乐视,这是我曾经的一些坑,如果能帮到你,那我这个逼也就没有白装了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60182.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python打开总闪退怎么办

Python打开总闪退怎么办 如果你从事或者熟悉Python编程&#xff0c;那么你肯定有遇到过打开Python总是闪退的情况&#xff0c;这让你倍感烦恼&#xff0c;不知道该怎么办。在这篇文章中&#xff0c;我们将会讨论Python打开总闪退的原因和一些修复方法。 问题原因 Python打开…

chatgpt赋能python:如何升级你的Python到最新版本

如何升级你的Python到最新版本 Python作为一种强大的编程语言&#xff0c;拥有广泛的用途&#xff0c;从网站开发到数据科学&#xff0c;都可以使用它来实现。然而&#xff0c;Python不断更新&#xff0c;每个新版本都带来了新的功能和改进&#xff0c;因此升级Python到最新版…

人工智能发展到GPT4经历了什么,从专家系统到机器学习再到深度学习,从大模型到现在的GPT4

大家好&#xff0c;我是微学AI&#xff0c;今天给大家讲一下人工智能的发展&#xff0c;从专家系统到机器学习再到深度学习&#xff0c;从大模型到现在的GPT4&#xff0c;讲这个的目的是让每个人都懂得人工智能&#xff0c;每个人都懂得人工智能的发展&#xff0c;未来人工智能…

调用百度文心AI作画API实现中文-图像跨模态生成

作者介绍 乔冠华&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2020级硕士研究生&#xff0c;张宏伟人工智能课题组。 研究方向&#xff1a;机器视觉与人工智能。 电子邮件&#xff1a;1078914066qq.com 一&#xff0e;文心AI作画API介绍 1. 文心AI作画 文…

AI绘画调用OpenAI-api接口【人工智能里的未来之城】:4 座未来派塔楼,天桥上覆盖着茂密的树叶,数字艺术

OpenAI绘画数字艺术是一种利用人工智能算法生成数字艺术的技术。该技术使用了一种称为GAN(Generative Adversarial Networks,生成对抗网络)的深度学习模型,这种模型由两个神经网络组成:生成器和判别器。 生成器的作用是生成新的数字艺术作品,它从随机噪声中生成图像,并…

集多个AI绘画开源模型于一体的工作台#invokeAI使用测评

原文&#xff1a;集多个AI绘画开源模型于一体的工作台#invokeAI使用测评-技术圈 当AI绘画模型和平台越来越多&#xff0c;你是否想使用统一美观的界面来使用你所有的AI绘画模型&#xff1f;invokeAI——这个精致的WebUI工具可以帮助你创建一个统一美观的工作环境&#xff1a; …

AI绘画升温、AI写作降温,AIGC玩“变脸”

配图来自Canva可画 自柯洁在“围棋人机大战”中惜败AlphaGo后&#xff0c;AI再次上演打败艺术家的戏码&#xff0c;AIGC&#xff08;人工智能自主生成内容&#xff09;时代真的要来了吗&#xff1f; 据了解&#xff0c;在今年科罗拉多州博览会艺术竞赛中&#xff0c;一名叫艾…

我迟早被这些AI绘画笑死...

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>CV微信技术交流群 詹士 发自 凹非寺转载自&#xff1a;量子位&#xff08;QbitAI&#xff09; AI绘画&#xff0c;你没事吧&#xff1f; 狗主人直接变身狗爸爸&#xff0c;被…

今年很火的AI绘画怎么玩

1.前言 2022年绝对可以说是AIGC元年&#xff0c;从google搜索的趋势来看&#xff0c;在2022年AI绘画及AI生成艺术的搜索量激增。 AI绘画在这一年的爆发一个很重要的原因就是 Stable Diffusion 的开源&#xff0c;这也来不开这几年 Diffusion Model 扩散模型在这几年里的迅猛发…

国产AI作画神器火了,更懂中文,竟然还能做周边!

金磊 萧箫 发自 凹非寺量子位 | 公众号 QbitAI 家人们&#xff0c;听说了吗&#xff1f; 最近在“一句话生成画作”这个圈子里&#xff0c;又一个AI工具悄然火起来了。 不是你以为的Disco Diffusion、DALLE&#xff0c;再或者Imagen…… 而是全圈子都在讲中国话的那种。 瞧&…

争议不断的AI绘画,靠这个成为了顶流?

今年以来&#xff0c;AIGC迅速崛起。 所谓AIGC&#xff0c;即AI-Generated Content&#xff0c;指的是利用人工智能来生成内容&#xff0c;被认为是继专业产出内容&#xff08;PGC&#xff09;、用户产出内容&#xff08;UGC&#xff09;后的新型内容创作方式。不久前掀起热议的…

最时髦的AI画画,一文包教包会

最时髦的AI画画&#xff0c;一文包教包会 大概半年前&#xff0c;AI 绘画工具 Disco Diffusion 从 Text-to-Image 开发社区和设计行业&#xff0c;火到了普通用户的视野中。即便它界面简陋&#xff0c;满屏英文和代码&#xff0c;也“劝退”不了人们。因为对那些没有任何美术功…

有了AI智能绘画,我也可以成为绘画大师——全球最大规模中文跨模态生成模型ERNIE-ViLG

对于绘画一窍不通的我&#xff0c;也喜欢看动漫&#xff0c;看到一些绝美的画&#xff0c;何尝不会感叹&#xff0c;要是我也会画画就好了&#xff0c;现在终于有机会帮我实现这个想法了&#xff0c;无意间看到了AI的一个新应用&#xff0c;最近热度还挺高的AI绘画&#xff0c;…

我迟早被这些AI绘画笑死

詹士 发自 凹非寺量子位 | 公众号 QbitAI AI绘画&#xff0c;你没事吧&#xff1f; 狗主人直接变身狗爸爸&#xff0c;被顶上APP首页&#xff1a; 纯欲风女孩变成了纯欲风猴子…… 下方网友评价「当真是二次猿模型」&#xff1a; 甚至&#xff0c;还有结婚照男主角变成墙上大头…

AI绘画是什么?人工智能到底会不会代替真人

随着科技的不断进步以及人工智能的飞速发展&#xff0c;AI渗透各行各业的方方面面&#xff0c;甚至经常会出现这样一个话题&#xff1a;人工智能到底会不会代替真人&#xff1f;那么&#xff0c;今天我们就来聊一聊ai绘画领域的那些事。 首先我们来说一说什么是AI绘画。AI绘画&…

AI绘画是艺术还是技术?AI绘画会让插画师集体失业?

今年以来&#xff0c;AI绘画的讨论热潮此起彼伏&#xff0c;过一段时间就会引起争议和恐慌。 就在近日&#xff0c;日本推出一款名为mimic的AI绘画软件&#xff0c;被日本绘画圈集体声讨&#xff0c;许多画师公开禁止AI绘画&#xff1b;恰巧最近美国艺术圈里关于AI绘画也发生了…

AI绘画神器Stable Diffusion的疯狂与危险

本文来源 AI前线 作者 | JAMES VINCENT 译者 | 核子可乐 策划 | 刘燕 最近几周&#xff0c;一款名为 Stable Diffusion 的文本到图像程序横空出世&#xff0c;瞬间颠覆了一切。Stable Diffusion 将无过滤图像生成的门槛下放到历史最低。它一边被 AI 艺术界所称道&#xff0c…

AI绘画爆火,人工智能会取代艺术吗

我们都知道&#xff0c;人工智能正在给艺术领域带来一场革命。从AI自动绘画到AI插画&#xff0c;再到AI创作&#xff0c;越来越多的人在感受着人工智能技术的进步。但是我们也发现了一个问题&#xff0c;就是人们担心人工智能会取代人类的工作。那么&#xff0c;我们到底该如何…

AI绘画火爆,到现在还只是冰山一角?AIGC掀起当代新艺术浪潮

前言&#xff1a; hello&#xff0c;大家好我是Dream。近日&#xff0c;各大社交平台掀起了一股“AI绘图”风潮&#xff0c;很多同学朋友纷纷在社交平台上晒出了属于自己的AI照片&#xff0c;一时间AI相关话题热度高涨。那对于AI绘画以及开启AI内容创作新时代的昆仑万维你究竟了…

AI(Adobe illustrator)绘制人物插画教程

如何在Adobe illustrator绘制多角色插画&#xff1f;2022年中国将接任金砖国家主席国&#xff0c;主办金砖国家领导人第十四次会晤&#xff0c;为了纪念这一事件&#xff0c;我们来使用Adobe illustrator绘制一副表达金砖国朋友们之间友谊的插画吧&#xff5e; 一、如何绘制白人…