首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TRTC学习之旅(四)-- 用electron实现视频聊天室

TRTC学习之旅(四)-- 用electron实现视频聊天室

原创
作者头像
黑眼圈云豆
修改2020-07-08 17:39:04
4.4K7
修改2020-07-08 17:39:04
举报

前言

前面我们已经学习过在web端用TRTC实时音视频SDK实现了多人会议室和互动直播模式,今天我们学习一下在桌面应用层用electron实现视频聊天。

web端的trtc sdk你可以理解成是被压缩过的,因为是基于webRTC进行开发的,有很多功能在web端没有办法体验到,比如说:主播跨房PK和视频美颜等,这些只有在应用端才能体验到,今天就带大家看看,如何简单的用electron实现吧。

文章是基于官方提供的demo进行讲解的,可以点demo源码下载

适用场景

electron TRTC 支持四种不同的进房模式,其中视频通话(VideoCall)和语音通话(VoiceCall)统称为通话模式,视频互动直播(Live)和语音互动直播(VoiceChatRoom)统称为直播模式

通话模式下的 TRTC,支持单个房间最多300人同时在线,支持最多50人同时发言。适合1对1视频通话、300人视频会议、在线问诊、远程面试、视频客服、在线狼人杀等应用场景。

实现步骤

第一步:集成SDK

一定要先装好node环境

官方有提供sdk集成的官方文档,这些文档描述的步骤也已经相对比较详细,大家如果是想从零开始搭建的话,可以多去看看。

使用一下指令即可在项目中使用:

npm install trtc-electron-sdk@latest --save

如果有人用vue框架进行开发的话,我这里可以推荐一个脚手架electron-vue,这个脚手架已经集成了electron和其它需要用到的插件,比如vue-router、vuex、axios等,如果是vue开发者,从零开始的话,还是推荐可以去使用一下,毕竟可以省去不少集成electron的时间。

在官方demo中,electron是已经集成好了的,所以下载完demo之后,使用以下指令安装好依赖包

npm install

待 npm 的依赖包都安装完成后,继续在命令行窗口执行以下命令,运行 Demo。

npm run start # 首次运行,稍等片刻后,窗口中才会出现 UI

官方demo中的主要命令

命令

说明

npm run start

以开发环境运行 Demo

npm run pack:mac

打包 Mac 的 .dmg 安装文件

npm run pack:win64

打包 Windows 64 位的 .exe 安装文件

开启开发者工具

在官方给的demo中,electron是默认没有打开开发者工具的,我们需要在main.electron.js中加入如下代码开启开发者工具

打开开发者工具
打开开发者工具

第二步:初始化 SDK 实例并监听事件回调

trtc通话模式的主要代码逻辑在trtc-room.vue中,大家可以直接移步到这个文件查看实现逻辑。

检测设备

在实例化sdk之前,先进行设备检测,如果没有输入输出设备,需要给用户做出相应的提示。

 // 没有摄像头,有麦克风,可以音频
    if (trtcState.isCameraReady() === false) {
      this.warn('找不到可用的摄像头,观众将无法看到您的画面。');
    }
    // 有摄像头,没有麦克风,可以视频
    if (trtcState.isMicReady() === false) {
      this.warn('找不到可用的麦克风,观众将无法听到您的声音。');
    }

计算签名

签名是通过userId和sdkAppId进行加密计算出来的,用于标识当前用户访问是否合法。具体加密方式和逻辑可以查看官方文档

在计算签名之前,需要先在src\debug\gen-test-user-sig.js设置好自己应用的sdkAppId和秘钥

设置秘钥和appId
设置秘钥和appId

设置好之后,通过调用ge-test-user-sig.js提供的方法生成签名

// 2. 计算签名
this.sdkInfo = genTestUserSig(this.userId);

实例化SDK

// 3. 实例化一个 trtc-electron-sdk
    trtcCloud = new TRTCCloud();
    logger.warn(`sdk version: ${trtcCloud.getSDKVersion()}`);

设置事件监听

全局变量视频填充模式TRTCVideoFillMode有两个属性:

  • TRTCVideoFillMode_Fill:图像铺满屏幕,超出显示视窗的视频部分将被截掉
  • TRTCVideoFillMode_Fit:图像长边填满屏幕,短边区域会被填充黑色
// 4. 配置基本的事件订阅

    //技术指标统计回调,每2秒回调一次
    trtcCloud.on('onStatistics', (statis)=>{logger.log('onStatistics', statis);});
    
    //加入房间的回调
    trtcCloud.on('onEnterRoom', this.onEnterRoom.bind(this));
    
    //退出房间的回调
    trtcCloud.on('onExitRoom', this.onExitRoom.bind(this));
    
    // 用户是否开启摄像头视频
    trtcCloud.on('onUserVideoAvailable', this.onUserVideoAvailable.bind(this));
    
    //有用户加入当前房间,直播模式下只有主播进入房间才会触发
    trtcCloud.on('onRemoteUserEnterRoom', this.onRemoteUserEnterRoom.bind(this));
    
    //有用户离开当前房间,直播模式下只有主播退出房间才会触发
    trtcCloud.on('onRemoteUserLeaveRoom', this.onRemoteUserLeaveRoom.bind(this));
    
    //用户是否开启屏幕分享
    trtcCloud.on('onUserSubStreamAvailable', this.onUserSubStreamAvailable.bind(this));

播放本地流

/**
    * 当进入房间时触发的回调
    * @param {number} result - 进房结果, 大于 0 时,为进房间消耗的时间,这表示进进房成功。如果为 -1 ,则表示进房失败。
    **/
    onEnterRoom(result) {
      if ( result > 0 ) {
        // 显示摄像头,开房麦克风,开始推流
        const view = document.getElementById('**');
        trtcCloud.startLocalPreview(view);
        trtcCloud.startLocalAudio();
        trtcCloud.setLocalViewFillMode(TRTCVideoFillMode.TRTCVideoFillMode_Fill);
      } else {
        logger.warn(`onEnterRoom: 进房失败 ${result}`);
      }
    },

播放远端流

/**
    * 远程用户视频流的状态发生变更时触发。
    * @param {number} uid - 用户标识
    * @param {boolean} available - 画面是否开启
    **/
    onUserVideoAvailable(uid, available) {
      if (available === 1) {
         const view = document.getElementById('**');
         this.remoteVideos[id] = view;
         //显示远端视频
         trtcCloud.startRemoteView(uid, view);  //通过ui,在设置好的DOM容器上播放远端流
         //设置远端流视频的填充模式
         trtcCloud.setRemoteViewFillMode(uid, TRTCVideoFillMode.TRTCVideoFillMode_Fill); 
      } else {
        let id = `**`;
        let view = document.getElementById(id);
     
        delete this.remoteVideos[id];
      }
    },

第三步:设置编码参数

全局变量TRTCVideoResolutionMode有两个属性:

  • TRTCVideoResolutionModeLandscape:横屏分辨率
  • TRTCVideoResolutionModePortrait:竖屏分辨率
// 5. 设置编码参数
// TRTCVideoEncParam 的详细说明,请参考: https://trtc-1252463788.file.myqcloud.com/electron_sdk/docs/TRTCVideoEncParam.html
let encParam = new TRTCVideoEncParam();

/**
 *  videoResolution
 * 【字段含义】 视频分辨率
 * 【推荐取值】 : Window 和 iMac 建议选择 640 × 360 及以上分辨率,resMode 选择 TRTCVideoResolutionModeLandscape
 * 【特别说明】 TRTCVideoResolution 默认只能横屏模式的分辨率,例如640 × 360。
 */
encParam.videoResolution = TRTCVideoResolution.TRTCVideoResolution_640_360;

/**
 * TRTCVideoResolutionMode
 *【字段含义】分辨率模式(横屏分辨率 - 竖屏分辨率)
  *【推荐取值】Window 和 Mac 建议选择 TRTCVideoResolutionModeLandscape
  *【特别说明】如果 videoResolution 指定分辨率 640 × 360,resMode 指定模式为 Portrait,则最终编码出的分辨率为360 × 640。
  */

//TRTCVideoResolutionMode是trtc提供的全局属性
//TRTCVideoResolutionModeLandscape  横屏分辨率
//TRTCVideoResolutionModePortrait  竖屏分辨率
encParam.resMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape;
encParam.videoFps = 25;  //帧率
encParam.videoBitrate = 600;  //上行码率
encParam.enableAdjustRes = true; //是否允许调整分辨率  手机直播建议设置为no
trtcCloud.setVideoEncoderParam(encParam)  //设置编码

第四步:设置美颜

全局变量TRTCBeautyStyle有两个属性:

  • TRTCBeautyStyleSmooth: 光滑,适用于美女秀场,效果比较明显。
  • TRTCBeautyStyleNature: 自然,磨皮算法更多地保留了面部细节,主观感受上会更加自然。

后面三个参数分别代表了beauty美颜级别、white美白级别、rudiness红润级别

trtcCloud.setBeautyStyle(TRTCBeautyStyle.TRTCBeautyStyleNature, 5, 5, 5);

第五步:进入房间

全局变量TRTCAppScene有四个属性,用于设置进入房间的通话类型:

  • TRTCAppSceneVideoCall:视频通话场景,支持720P、1080P高清画质,单个房间最多支持300人同时在线,最高支持50人同时发言。适合:[视频低延时直播]、[十万人互动课堂]、[视频直播 PK]、[视频相亲房]、[互动课堂]、[远程培训]、[超大型会议]等。注意:此场景下,您必须通过 TRTCParams 中的 role 字段指定当前用户的角色。
  • TRTCAppSceneLIVE:视频互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。在线直播场景,内部编码器和网络协议优化侧重性能和兼容性,性能和清晰度表现更佳。
  • TRTCAppSceneAudioCall:语音通话场景,支持 48kHz,支持双声道。单个房间最多支持300人同时在线,最高支持50人同时发言。适合:[1对1语音通话]、[300人语音会议]、[语音聊天]、[语音会议]、[在线狼人杀]等。
  • TRTCAppSceneVoiceChatRoom:语音互动直播,支持平滑上下麦,切换过程无需等待,主播延时小于300ms;支持十万级别观众同时播放,播放延时低至1000ms。适合:[语音低延时直播]、[语音直播连麦]、[语聊房]、[K 歌房]、[FM 电台]等。注意:此场景下,您必须通过 TRTCParams 中的 role 字段指定当前用户的角色。
// 7. 进入房间
// TRTCParams 详细说明,请查看文档:https://trtc-1252463788.file.myqcloud.com/electron_sdk/docs/TRTCParams.html
let param = new TRTCParams();
param.sdkAppId = this.sdkInfo.sdkappid;
param.userSig = this.sdkInfo.userSig;
param.roomId = this.roomId;
param.userId = this.userId;
param.privateMapKey = ''; // 房间签名(非必填),7.1.157 版本以上(含),可以忽略此参数,7.1.157 之前的版本建议赋值为空字符串
param.businessInfo = '';  // 业务数据(非必填),7.1.157 版本以上(含),可以忽略此参数,7.1.157 之前的版本建议赋值为空字符串

/**
 * TRTCAppScene.TRTCAppSceneVideoCall: 视频通话场景,适合[1对1视频通话]、[300人视频会议]、[在线问诊]、[视频聊天]、[远程面试]等。
 */
trtcCloud.enterRoom(param, TRTCAppScene.TRTCAppSceneVideoCall);

第六步:退出房间

调用 exitRoom() 接口会执行退出房间的相关逻辑,例如释放音视频设备资源和编解码器资源。 待资源释放完毕,SDK 会通过 TRTCCallback 中的 onExitRoom() 回调通知。

如果再次调用 enterRoom() 或者切换到其它的音视频 SDK,请等待 onExitRoom() 回调到来后再执行相关操作, 否则可能会遇到如摄像头、麦克风设备被强占等各种异常问题。

trtcCloud.exitRoom();

总结

从基本实现过程来看,electron版本和web版本的流程基本没差,从demo上看,electron版本在流程上是有些精简的,比如:

1.electron版本整合了播放、推/流方法,在调用startLocalPreview方法的时候,已经实现了本地播放和本地视频推流工作,调用

startRemoteSubStreamView方法的时候,就实现了远端视频播放和订阅的操作;

2.exitRoom退出房间已经完成了释放资源的操作了,在web端需要调用stop和close方法关闭画面和释放资源。

electron版本在功能上比web版本强大很多,而且更加稳定,推荐大家多看看多学习。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 适用场景
  • 实现步骤
    • 第一步:集成SDK
      • 官方demo中的主要命令
      • 开启开发者工具
    • 第二步:初始化 SDK 实例并监听事件回调
      • 检测设备
      • 计算签名
      • 实例化SDK
      • 设置事件监听
      • 播放本地流
      • 播放远端流
    • 第三步:设置编码参数
      • 第四步:设置美颜
        • 第五步:进入房间
          • 第六步:退出房间
          • 总结
          相关产品与服务
          实时音视频
          实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度积累,以多人音视频通话和低延时互动直播两大场景化方案,通过腾讯云服务向开发者开放,致力于帮助开发者快速搭建低成本、低延时、高品质的音视频互动解决方案。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档