找回密码
 立即注册
首页 业界区 业界 实现鸿蒙(HarmonyOS)视频聊天、屏幕分享 ...

实现鸿蒙(HarmonyOS)视频聊天、屏幕分享

徙办 4 天前
 随着搭配原生鸿蒙(HarmonyOS)系统的电脑和手机越来越普及,之前实现的安卓版视频聊天屏幕分享的Demo,现在有必要实现一个鸿蒙版了,该鸿蒙版的Demo可以与之前的安卓版和PC版互通的。 
 现在,我们来看看具体的实现过程,文末有Demo源码可以下载。
一. 开发环境

开发工具:DevEco Studio 6.0
开发语言:ArkTS
测试手机:华为 Mate 60 Pro  
HarmonyOS:6.0.0
      
1.jpeg

二.功能介绍

      鸿蒙手机端登录成功后,运行的主界面如下图所示: 
      
2.jpeg

1. 视频聊天

(1)每个登录的用户都可向其他任意在线用户发送视频聊天请求。
(2)当收到来自其他在线用户的视频聊天邀请时,可接受或拒绝对方的请求。
(3)当接受其他在线用户的视频聊天邀请时,即可开启视频聊天。 
2. 屏幕分享

(1)每个登录的用户都可向其他任意在线用户发送屏幕分享请求;当对方未响应时,可主动取消屏幕分享请求。
(2)当收到来自其他在线用户请求屏幕分享时,可接受或拒绝对方的请求。
(3)当发送方收到其他在线用户同意屏幕分享时,即可观看对方的屏幕。
三.具体实现

      下面我们讲一下Demo中核心的代码实现,
1.自定义消息类型 InformationTypes
  1. export enum informationType{
  2. /**
  3. * 视频请求
  4. * */
  5.   VideoRequest = 0,
  6.   /**
  7.    *  对方同意连接摄像头
  8.    * */
  9.   VideoResult = 1,
  10.   /**
  11.    *  通知对方 挂断 视频连接
  12.    * */
  13.   CloseVideo = 2,
  14.   /**
  15.    *  通知好友 网络原因,导致 视频中断
  16.    * */
  17.    NetReasonCloseVideo = 3,
  18.   /**
  19.    * 通知对方(忙线中) 挂断 视频连接
  20.    * */
  21.   BusyLine = 4,
  22.   /**
  23.    * 远程桌面请求
  24.    * */
  25.   DesktopRequest = 5,
  26.   /**
  27.    *  回复远程桌面请求的结果
  28.    * */
  29.   DesktopResult = 6,
  30.   /**
  31.    * 主动取消远程桌面请求
  32.    * */
  33.   CancelDesktop = 7,
  34.   /**
  35.    * 对方(主人端)主动断开远程桌面
  36.    * */
  37.   OwnerCloseDesktop = 8,
  38.   /**
  39.    * 客人端断开远程桌面连接
  40.    * */
  41.   GuestCloseDesktop = 9
  42. }
复制代码
2. 发送视频请求

(1)当发起视频聊天时,将显示视频聊天窗口,并发送视频连接请求
  1. //获取到多媒体管理器
  2. @State multimediaManager: IMultimediaManager = MultimediaManagerFactory.GetSingleton();
  3. Button("请求视频会话").type(ButtonType.Normal).borderRadius(5).backgroundColor("#DBDCDE").fontColor(Color.Black).fontWeight(300)
  4. .onClick(()=>{
  5. if(!this.pathStack) return;
  6. //发送视频连接请求
  7. this.multimediaManager.sendCustomizedMessage(this.connectID,informationType.VideoRequest,[],'')
  8. //跳转到视频请求页面
  9. this.pathStack.pushPath({ name:"video" ,param:this.connectID})
  10. })
复制代码
 (2)连接自己的摄像头,预览自己的视频
  1. //只需要在模板层调用这个组件,就会连接到自己的摄像头
  2. CameraPreview()
复制代码
(3)当发送聊天邀请时,将显示视频邀请窗口   
         
3.jpeg
 
3. 回复对方视频请求

(1)当收到对方的视频聊天邀请时,将显示视频邀请窗口   
          

  (2)发送回复视频聊天请求消息
  1. //同意对方的视频邀请
  2. //connectID - 对方的ID
  3. this.multimediaManager.sendCustomizedMessage(this.connectID,informationType.VideoResult,[1],'')
  4. //拒绝对方的视频邀请
  5. this.multimediaManager.sendCustomizedMessage(this.connectID,informationType.CloseVideo,[],'')
复制代码
4. 收到对方视频请求的回复
  1. //设置收到来自服务器或其它客户端的自定义消息
  2. this.multimediaManager.setCustomizedMessageListener((srcUserID: string, msgType: number, msg: number[], tag: string)=>{
  3.                           //对方回复视频请求的结果
  4.                           if(msgType == informationType.VideoResult){
  5.                             const res = new Stream(msg)
  6.                             const bool = res.readBoolean()
  7.                             if(bool){
  8.                              //当对方回复同意时,将连接到对方的麦克风和摄像头,开始视频聊天会话
  9.                               this.isAnswer = true;
  10.                             }else{
  11.                              //否则直接挂断
  12.                               this.promptAction.showToast({
  13.                                 message: `对方挂断`,
  14.                                 duration: 1000
  15.                               })
  16.                               this.isAnswer = false;
  17.                               this.isOnVideo = false;
  18.                               this.connect2me = false;
  19.                               this.pageStack.removeByName("video")
  20.                             }
  21.                           }
  22. })   
复制代码
 当对方回复同意时,将连接到对方的麦克风和摄像头,开始视频聊天会话:
  1. if(this.isAnswer){
  2.       this.cameraConnector = new CameraConnector()
  3.       this.microphoneConnector = new MicrophoneConnector()
  4.       
  5.       //设置摄像头的索引
  6.         this.multimediaManager.setCameraDeviceIndex(this.switchCamera?1:0)
  7.       //开始连接对方摄像头
  8.         this.cameraConnector.beginConnect(this.connectID)
  9.       //开始连接对方麦克风
  10.         this.microphoneConnector.beginConnect(this.connectID)
  11.       //启动定时器计时
  12.         this.timer()
  13.     }
复制代码
5. 实现屏幕分享

         屏幕分享的请求/应答逻辑几乎与视频聊天请求/应答逻辑是一模一样的。这里就不再罗列响应的代码了。
    下面的截图是以Windows与鸿蒙互动为例:Windows端作为请求方,鸿蒙端作为应答方。(反过来也是一样的)
(1)PC端发起请求 
         
5.png

(2)鸿蒙端收到对方的屏幕分享请求时,将显示请求窗口。
         
6.jpeg

 (3)当鸿蒙端同意请求时,PC端就可以观看鸿蒙手机的屏幕了。
       
7.png

 四. 源码下载

 1. 鸿蒙端源码: VideoChatMini_HarmonyOS.rar 
 2. Android 端:VideoChatMini.Android.rar
 3. 服务端 + PC 端:VideoChatMini.rar 
在这里,我也给出了PC端的源码,PC端项目对应的目录是 VideoChatMini.ClientWPF。服务端和PC端都是 C# 开发的(开发环境是 VS2022),PC端UI使用的是WPF。
鸿蒙端、PC端、安卓端是可以互通的,也就是可以相互视频通话,以及观看屏幕/桌面。
在实现了该Demo的鸿蒙手机版后,接下来,我还会实现该Demo的鸿蒙PC版,到时再分享给大家!
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

昨天 04:58

举报

懂技术并乐意极积无私分享的人越来越少。珍惜
您需要登录后才可以回帖 登录 | 立即注册