TRTC 支持四种不同的进房模式,其中视频通话(VideoCall)和语音通话(VoiceCall)统称为通话模式,视频互动直播(Live)和语音互动直播(VoiceChatRoom)统称为 直播模式。
通话模式下的 TRTC,支持单个房间最多300人同时在线,支持最多50人同时发言。适合1对1视频通话、300人视频会议、在线问诊、远程面试、视频客服、在线狼人杀等应用场景。
TRTC 云服务由两种不同类型的服务器节点组成,分别是“接口机”和“代理机”:
在通话模式下,TRTC 房间中的所有用户都会被分配到接口机上,相当于每个用户都是“主播”,每个用户随时都可以发言(最高的上行并发限制为50路),因此适合在线会议等场景,但单个房间的人数限制为300人。
您可以登录 Github 获取本文档相关的示例代码。
建议您先阅读文档 跑通 SimpleDemo(Electron),并按照文档的指引,跑通我们为您提供的官方 SimpleDemo。
如果 步骤1 正常执行并且效果符合预期,说明您已经掌握了 Electron 环境的安装方法。
trtc-electron-sdk
安装到您现有的项目中:npm install trtc-electron-sdk --save
创建 trtc-electron-sdk
实例:
import TRTCCloud from 'trtc-electron-sdk';
let trtcCloud = new TRTCCloud();
监听 onError
事件:
// 错误通知是要监听的,需要捕获并通知用户
let onError = function(err) {
console.error(err);
};
trtcCloud.on('onError',onError);
在调用 enterRoom() 接口时需要填写一个关键参数 TRTCParams,该参数包含的必填字段如下表所示。
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
sdkAppId | 数字 | 应用 ID,您可以在 控制台 >【应用管理】>【应用信息】中查找到。 | 1400000123 |
userId | 字符串 | 只允许包含大小写英文字母(a-z、A-Z)、数字(0-9)及下划线和连词符。建议结合业务实际账号体系自行设置。 | test_user_001 |
userSig | 字符串 | 基于 userId 可以计算出 userSig,计算方法请参见 如何计算及使用 UserSig 。 | eJyrVareCeYrSy1SslI... |
roomId | 数字 | 数字类型的房间号。如果您想使用字符串形式的房间号,请使用 TRTCParams 中的 strRoomId。 | 29834 |
import {
TRTCParams,
TRTCRoleType
} from "trtc-electron-sdk/liteav/trtc_define";
let param = new TRTCParams();
param.sdkAppId = 1400000123;
param.roomId = 29834;
param.userId = 'test_user_001';
param.userSig = 'eJyrVareCeYrSy1SslI...';
注意:
- TRTC 同一时间不支持两个相同的 userId 进入房间,否则会相互干扰。
- 每个端在应用场景 appScene 上必须要进行统一,否则会出现一些不可预料的问题。
TRTCParams
参数中 roomId
代指的音视频房间。如果该房间不存在,SDK 会自动创建一个以字段 roomId
的值为房间号的新房间。appScene
参数,使用错误可能会导致卡顿率或画面清晰度不达预期。TRTCAppScene.TRTCAppSceneVideoCall
。TRTCAppScene.TRTCAppSceneAudioCall
。
说明:关于
TRTCAppScene
的详细介绍,请参见 TRTCAppScene 。
result
大于0时表示进房成功,具体数值为加入房间所消耗的时间,单位为毫秒(ms);当 result
小于0时表示进房失败,具体数值为进房失败的错误码。import TRTCCloud from 'trtc-electron-sdk';
import { TRTCParams, TRTCAppScene } from "trtc-electron-sdk/liteav/trtc_define";
let trtcCloud = new TRTCCloud();
let onEnterRoom = function (result) {
if (result > 0) {
console.log(`onEnterRoom,进房成功,使用了 ${result} 秒`);
} else {
console.warn(`onEnterRoom: 进房失败 ${result}`);
}
};
// 订阅进房成功事件
trtcCloud.on('onEnterRoom', onEnterRoom);
// 进房,如果房间不存在,TRTC 后台会自动创建一个新房间
let param = new TRTCParams();
param.sdkAppId = 1400000123;
param.roomId = 29834;
param.userId = 'test_user_001';
param.userSig = 'eJyrVareCeYrSy1SslI...';
trtcCloud.enterRoom(param, TRTCAppScene.TRTCAppSceneVideoCall);
SDK 支持自动订阅和手动订阅两种模式,自动订阅追求秒开速度,适合于人数少的通话场景;手动订阅追求流量节约,适合人数较多的会议场景。
进入某个房间之后,SDK 会自动接收房间中其他用户的音频流,从而达到最佳的“秒开”效果:
view
关联起来。TRTCVideoFillMode.TRTCVideoFillMode_Fill
模式:表示填充,画面可能会等比放大和裁剪,但不会有黑边。TRTCVideoFillMode.TRTCVideoFillMode_Fit
模式:表示适应,画面可能会等比缩小以完全显示其内容,可能会有黑边。<div id="video-container"></div>
<script>
import TRTCCloud from 'trtc-electron-sdk';
const trtcCloud = new TRTCCloud();
const videoContainer = document.querySelector('#video-container');
const roomId = 29834;
/**
* 用户是否开启摄像头视频
* @param {number} uid - 用户标识
* @param {boolean} available - 画面是否开启
**/
let onUserVideoAvailable = function (uid, available) {
console.log(`onUserVideoAvailable: uid: ${uid}, available: ${available}`);
if (available === 1) {
let id = `${uid}-${roomId}-${TRTCVideoStreamType.TRTCVideoStreamTypeBig}`;
let view = document.getElementById(id);
if (!view) {
view = document.createElement('div');
view.id = id;
videoContainer.appendChild(view);
}
trtcCloud.startRemoteView(uid, view);
trtcCloud.setRemoteViewFillMode(uid, TRTCVideoFillMode.TRTCVideoFillMode_Fill);
} else {
let id = `${uid}-${roomId}-${TRTCVideoStreamType.TRTCVideoStreamTypeBig}`;
let view = document.getElementById(id);
if (view) {
videoContainer.removeChild(view);
}
}
};
// 实例代码:根据通知订阅(或取消订阅)远端用户的视频画面
trtcCloud.on('onUserVideoAvailable', onUserVideoAvailable);
</script>
说明:如果您在收到
onUserVideoAvailable()
事件回调后没有立即调用startRemoteView()
订阅视频流,SDK 将会在5s内停止接收来自远端的视频数据。
您可以通过 setDefaultStreamRecvMode(autoRecvAudio, autoRecvVideo) 接口将 SDK 指定为手动订阅模式。在手动订阅模式下,SDK 不会自动接收房间中其他用户的音视频数据,需要您手动通过 API 函数触发。
TRTCVideoFillMode.TRTCVideoFillMode_Fill
:模式表示填充,画面可能会被等比放大和裁剪,但不会有黑边。TRTCVideoFillMode.TRTCVideoFillMode_Fit
:模式表示适应,画面可能会等比缩小以完全显示其内容,可能会有黑边。//示例代码:发布本地的音视频流
trtcCloud.startLocalPreview(view);
trtcCloud.setLocalViewFillMode(TRTCVideoFillMode.TRTCVideoFillMode_Fill);
trtcCloud.startLocalAudio();
//设置本地视频编码参数
let encParam = new TRTCVideoEncParam();
encParam.videoResolution = TRTCVideoResolution.TRTCVideoResolution_640_360;
encParam.resMode = TRTCVideoResolutionMode.TRTCVideoResolutionModeLandscape;
encParam.videoFps = 25;
encParam.videoBitrate = 600;
encParam.enableAdjustRes = true;
trtcCloud.setVideoEncoderParam(encParam);
注意:SDK 默认会使用当前系统默认的摄像头和麦克风。您可以通过调用 setCurrentCameraDevice() 和 setCurrentMicDevice() 选择其他摄像头和麦克风。
调用 exitRoom() 方法退出房间,SDK 在退房时需要关闭和释放摄像头、麦克风等硬件设备,因此退房动作并非瞬间完成的,需收到 onExitRoom() 回调后才算真正完成退房操作。
// 调用退房后请等待 onExitRoom 事件回调
let onExitRoom = function (reason) {
console.log(`onExitRoom, reason: ${reason}`);
};
trtcCloud.exitRoom();
trtcCloud.on('onExitRoom', onExitRoom);
注意:如果您的 Electron 程序中同时集成了多个音视频 SDK,请在收到
onExitRoom
回调后再启动其它音视频 SDK,否则可能会遇到硬件占用问题。
本页内容是否解决了您的问题?