tencent cloud

实时音视频

动态与公告
产品动态
产品近期公告
关于 TRTC Live 正式上线的公告
关于TRTC Conference 正式版上线的公告
Conference 商业化版本即将推出
关于多人音视频 Conference 开启内测公告
关于音视频通话 Call 正式版上线的公告
关于腾讯云音视频终端 SDK 播放升级及新增授权校验的公告
关于 TRTC 应用订阅套餐服务上线的相关说明
产品简介
产品概述
基本概念
产品功能
产品优势
应用场景
性能数据
购买指南
计费概述
免费时长说明
月订阅
现收现付
TRTC 逾期与暂停政策
常见问题解答
退款说明
新手指引
Demo 体验
视频通话 SDK
组件介绍
开通服务
跑通 Demo
快速接入
离线唤醒
会话聊天
云端录制
AI 降噪
界面定制
Chat 集成通话能力
更多特性
无 UI 集成
服务端 API
客户端 API
解决方案
错误码表
发布日志
常见问题
视频会议 SDK
组件介绍(TUIRoomKit)
开通服务(TUIRoomKit)
跑通 Demo(TUIRoomKit)
快速接入(TUIRoomKit)
屏幕共享(TUIRoomKit)
预定会议(TUIRoomKit)
会中呼叫(TUIRoomKit)
界面定制(TUIRoomKit)
虚拟背景(TUIRoomKit)
会议控制(TUIRoomKit)
云端录制(TUIRoomKit)
AI 降噪(TUIRoomKit)
会中聊天(TUIRoomKit)
机器人推流(TUIRoomKit)
更多特性(TUIRoomKit)
客户端 API(TUIRoomKit)
服务端 API(TUIRoomKit)
常见问题(TUIRoomKit)
错误码 (TUIRoomKit)
SDK更新日志(TUIRoomKit)
直播与语聊 SDK
Live 视频直播计费说明
组件介绍
开通服务(TUILiveKit)
跑通 Demo
无 UI 集成
UI 自定义
直播监播
视频直播
语聊房
高级功能
客户端 API
服务端 API
错误码
发布日志
常见问题
RTC Engine
开通服务
SDK 下载
API-Example
接入指引
API-参考手册
高级功能
AI 集成
概述
MCP 配置
Skills 配置
集成指南
常见问题
RTC RESTFUL API
History
Introduction
API Category
Room Management APIs
Stream mixing and relay APIs
On-cloud recording APIs
Data Monitoring APIs
Pull stream Relay Related interface
Web Record APIs
AI Service APIs
Cloud Slicing APIs
Cloud Moderation APIs
Making API Requests
Call Quality Monitoring APIs
Usage Statistics APIs
Data Types
Appendix
Error Codes
控制台指南
应用管理
套餐包管理
用量统计
监控仪表盘
开发辅助
解决方案
实时合唱
常见问题
迁移指南
计费相关
功能相关
UserSig 相关
应对防火墙限制相关
缩减安装包体积相关
Andriod 与 iOS 相关
Web 端相关
Flutter 相关
Electron 相关
TRTCCalling Web 相关
音视频质量相关
其他问题
旧版文档
RTC RoomEngine SDK(旧)
集成 TUIRoom (Web)
集成 TUIRoom (Android)
集成 TUIRoom (iOS)
集成 TUIRoom (Flutter)
集成 TUIRoom (Electron)
TUIRoom API 查询
实现云端录制与回放(旧)
监控仪表盘计费(旧)
协议与策略
安全合规认证
安全白皮书
信息安全说明
服务等级协议
苹果隐私策略:PrivacyInfo.xcprivacy
TRTC 政策
隐私协议
数据处理和安全协议
词汇表

Web

PDF
聚焦模式
字号
最后更新时间: 2026-03-13 16:42:37
欢迎阅读 Tencent RTC Engine SDK 迁移指南。本文旨在协助开发者将基于 Twilio Video SDK 的实施方案高效迁移到 Tencent RTC Engine SDK。我们将通过详细的技术架构差异分析、迁移准备指引、核心功能迁移示例以及进阶功能对比,帮助您实现快速且无缝的迁移。如果您计划为新项目接入 Tencent RTC Engine SDK,我们建议您从 接入指南 开始学习;如果您想了解 Tencent RTC Engine 的更多信息,我们建议您访问 产品概述

基本概念与技术架构差异

基本概念对比

本节对 Tencent RTC Engine 和 Twilio Video 服务过程中可能涉及到的一些基本概念进行了对比。要了解更多关于 Tencent RTC Engine 的概念信息,请访问 基本概念
概念
Tencent RTC Engine
Twilio Video
说明
房间
Room
Room
将 RTC 参与者联系在一起的会话空间。Tencent RTC 使用 roomId(数字),或 strRoomId(字符串),Twilio 使用 name(字符串)。
用户
User
Participant
参与音视频通话的所有用户。
主播
Anchor
-
拥有推流权限的用户类型,可向服务端推送和接收音视频流。
观众
Audience
-
只能接收音视频流的用户类型。
应用标识
SDKAppID
Account SID
应用唯一标识。
鉴权凭证
UserSig
Access Token
客户端鉴权凭证。
用户标识
userId
Identity
用户唯一标识。

技术架构差异

Twilio Video 架构

Twilio Video 采用 Track-based(基于轨道) 架构:
开发者需要显式创建 LocalAudioTrackLocalVideoTrack
通过 connect(token, { tracks }) 传入本地轨道来采集并发布本地音视频流
通过 room.on('participantConnected')TrackPublication.on('subscribed')中的回调来订阅远端音视频流
使用 MediaTrack.attach(someHtmlElement)来在网页上渲染视频

Tencent RTC Engine 架构

Tencent RTC Engine 采用 API-driven(API 驱动) 架构:
通过 TRTC.create() 生成的单例,直接调用 startLocalVideo()startLocalAudio() 来采集并发布本地音视频流
远端流的订阅通过 on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE) 的回调 + startRemoteVideo() 来完成
不需要显式创建和管理轨道对象,但SDK中提供了 getAudioTrack()getVideoTrack() 来获取当前音视频轨道对象以供高级使用
这意味着 Tencent RTC Engine 的 API 更加简洁,但同时也保留了对底层轨道对象的访问能力以满足您的高级开发需求。

迁移准备

步骤1. 开通服务

要访问 Tencent RTC Engine 服务,需要创建一个 Tencent RTC Engine 应用程序及其凭据。您可以按照以下步骤在 Tencent RTC 控制台中创建新的 Tencent RTC Engine 应用程序:
1. 注册或登录您的 Tencent RTC 账号,并登录到 Tencent RTC 控制台
2. 点击 Create Application
3. 在创建弹窗中,输入您的应用程序名称,选择 RTC Engine,点击 Create

4. 应用程序创建后,可在 Basic Information 获取以下凭证:
SDKAppID:自动生成的应用 ID,用于唯一标识您的 Tencent RTC 应用程序。
SDKSecretKey:用于生成安全签名 UserSig 的关键参数,用于保障 Tencent RTC 服务的安全访问。

说明:
关于鉴权对比:Twilio Video 使用 Access Token 进行身份验证,而 Tencent RTC 使用 UserSig。两者都是由服务端生成的时效性签名凭证,但生成方式不同。详见 UserSig 鉴权文档

步骤2. 安装 SDK

Twilio Video SDK (原依赖)

// npm
npm install twilio-video --save

Tencent RTC Engine SDK (新依赖)

使用npm或yarn在您的项目中安装 trtc-sdk-v5
// npm
npm install trtc-sdk-v5 --save

// yarn
yarn add trtc-sdk-v5
同时,您也可以手动下载 trtc-sdk-v5,在解压后将 trtc-sdk-v5 目录复制到您的项目的 node_modules 中。

步骤3. 导入 SDK

Twilio Video SDK (原依赖)

import * as TwilioVideo from 'twilio-video';

Tencent RTC Engine SDK (新依赖)

import TRTC from 'trtc-sdk-v5'
说明:
如果您需要手动引入js文件,请下载 trtc.js 并手动使用<script>标签导入TRTC SDK:
<script src="/your_path/trtc.js"></script>

迁移指引

步骤4. 创建SDK实例

Twilio Video

// Twilio Video 不需要显式创建SDK实例
// 直接通过 connect() 静态方法连接房间
// 可选:设置日志级别
TwilioVideo.Logger.setLevel('debug');

Tencent RTC Engine

通过 TRTC.create() 创建一个 TRTC 对象:
const trtc = TRTC.create();

步骤5. 设置事件监听器

Twilio Video

// 当远端用户进入房间...
twilioRoom.on('participantConnected', participant => {
console.log(`Remote participant ${participant.identity} has connected.`);
});

// 当远端用户离开房间...
twilioRoom.on('participantDisconnected', participant => {
console.log(`Remote participant ${participant.identity} has disconnected.`);
});

Tencent RTC Engine

使用 trtc.on() 来监听各类 TRTC事件
// 当远端用户进入房间...
trtc.on(TRTC.EVENT.REMOTE_USER_ENTER, event => {
console.log(`Remote user ${event.userId} has joined the room.`);
});

// 当远端用户离开房间...
trtc.on(TRTC.EVENT.REMOTE_USER_EXIT, event => {
console.log(`Remote user ${event.userId} has left the room.`);
});

步骤6. 进入房间/连接到房间

Twilio Video

// 您的Twilio鉴权凭证
const accessToken = 'your_twilio_access_token';

// 进入房间时设置的参数
const connectOptions = {
name: 'my_twilio_room'
};

const twilioRoom = await TwilioVideo.connect(accessToken, connectOptions);

Tencent RTC Engine

使用 trtc.enterRoom() 来创建并进入房间,支持以下两种应用场景:
实时音视频场景(默认)
互动直播场景
进房参数设置 sceneTRTC.TYPE.SCENE_RTC 或不提供 scene 参数时会默认创建该类型房间。
该模式适合1对1的音视频通话,或者参会人数在 300 人以内的在线会议,支持最大50人开麦。
// 配置进房参数
const options = {
sdkAppId: 2000000000, // 您应用的SDKAPPID
userId: 'your_user_id', // 用户ID
userSig: 'your_usersig', // 基于您应用的SDKSECRETKEY与该用户的userId计算出的用户签名
strRoomId: 'room_id', // 房间ID (字符串类型)
// 默认为实时音视频场景,无需显式声明
// scene: TRTC.TYPE.SCENE_RTC
};
// 如果要使用数字类型的房间ID, 则可以使用roomId; 当strRoomId与roomId都存在时, roomId优先级高于strRoomId:
// options.roomId = 123456;

try {
await trtc.enterRoom(options);
console.log('Join rtc room successfully.');
} catch (err) {
console.error('Fail to join rtc room, err=' + err);
}
进房参数设置 sceneTRTC.TYPE.SCENE_LIVE 时会创建该类型房间。
该模式适合十万人以内的在线直播场景,但需要您同时在options中指定role字段来指定该用户进房的角色,在房间中时可以通过调用 trtc.switchRole() 来切换用户的角色。
// 配置进房参数
const options = {
sdkAppId: 2000000000, // 您应用的SDKAPPID
userId: 'your_user_id', // 用户ID
userSig: 'your_usersig', // 基于您应用的SDKSECRETKEY与该用户的userId计算出的用户签名
strRoomId: 'room_id', // 房间ID (字符串类型)
// 互动直播场景
scene: TRTC.TYPE.SCENE_LIVE
role: TRTC.TYPE.ROLE_ANCHOR // 以主播角色 (默认) 进房,可以发布本地音视频
// role: TRTC.TYPE.ROLE_AUDIENCE // 以观众角色进房,没有发布本地音视频的权限,只有收看远端流的权限
};
// 如果要使用数字类型的房间ID, 则可以使用roomId; 当strRoomId与roomId都存在时, roomId优先级高于strRoomId:
// options.roomId = 123456;

try {
await trtc.enterRoom(options);
console.log('Join live room successfully.');
} catch (err) {
console.error('Fail to join live room, err=' + err);
}

步骤7. 采集发布本地音视频流

Twilio Video

// 创建并发布本地视频轨道
const localVideoTrack = await twilioVideo.createLocalVideoTrack();
twilioRoom.localParticipant.publishTrack(localVideoTrack);

// 在网页上渲染视频预览
const localVideoContainer = document.getElementById('local-video-container');
const localVideoElement = localVideoTrack.attach();
localMediaContainer!.appendChild(localVideoElement);

// 创建并发布本地音频轨道
const localAudioTrack = await twilioVideo.createLocalAudioTrack();
twilioRoom.localParticipant.publishTrack(localAudioTrack);

// 在网页上添加音频轨道
const localAudioElement = localAudioTrack.attach();
document.body.appendChild(localAudioElement);

Tencent RTC Engine

使用 trtc.startLocalAudio()trtc.startLocalVideo() 开始从本地摄像头或麦克风设备采集音视频流,并发布到当前房间中。
同时,您还可以使用 TRTC.getCameraList()TRTC.getMicrophoneList() 来获取当前可用的本地摄像头与麦克风设备列表。
// 本地视频流
// 获取可用摄像头设备列表
const cameraList = await TRTC.getCameraList();

// 将第一个可用摄像头的视频流发布到当前房间
if(cameraList[0]) {
await trtc.startLocalVideo({
view: document.getElementById('local-video-container'),
options: { cameraId: cameraList[0].deviceId }
});
}

// 取消发布本地视频流
await trtc.stopLocalVideo();


// 本地音频流
// 获取可用麦克风设备列表
const microphoneList = await TRTC.getMicrophoneList();

// 将第一个可用麦克风的音频流发布到当前房间
if(microphoneList[0]) {
await trtc.startLocalAudio({
options: { microphoneId: microphoneList[0].deviceId }
});
}

// 取消发布本地音频流
await trtc.stopLocalAudio();

步骤8. 订阅并播放远端音视频流

Twilio Video

// 当远端用户进入房间...
twilioRoom.on('participantConnected', participant => {
console.log(`Participant ${participant.sid} has joined the room.`);
const remoteContainer = document.createElement('div');
remoteContainer.id = `remote-container-${participant.sid}`;
// ...并且该远端用户开始推送音视频流时,添加对应的轨道
participant.on('trackSubscribed', track => {
remoteContainer.appendChild(track.attach());
});
participant.tracks.forEach(publication => {
if (publication.isSubscribed) {
remoteContainer.appendChild(publication.track.attach());
}
});
// 该远端用户停止推送音视频流时,移除对应的轨道
participant.on('trackUnsubscribed', track => {
track.detach().forEach(element => element.remove());
});
document.body.appendChild(remoteContainer);
});

twilioRoom.on('participantDisconnected', participant => {
console.log(`Participant ${participant.sid} has left the room.`);
document.getElementById(`remote-container-${participant.sid}`).remove();
});

Tencent RTC Engine

远端用户发布视频时,会触发 TRTC.EVENT.REMOTE_VIDEO_AVAILABLE 事件。您需要在回调内调用 trtc.startRemoteVideo() 来处理并播放对应的远端视频流。当远端用户停止发布视频时,SDK 则会自动停止播放;您也可以调用 trtc.stopRemoteVideo() 来手动停止远端视频流的播放。
// 在调用trtc.enterRoom()进房前设置监听以下事件:

// 当远端用户发布视频... (需要监听TRTC.EVENT.REMOTE_VIDEO_AVAILABLE)
trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
const remoteContainerId = `${userId}_${streamType}`
const remoteContainer = document.createElement('div');
remoteContainer.id = remoteContainerId;
document.body.appendChild(remoteContainer);

// 在收到该事件时, 调用startRemoteVideo()播放远端视频流
trtc.startRemoteVideo({ userId, streamType, view: remoteContainerId });
});

// 当远端用户停止发布视频时... (需要监听TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE)
trtc.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, event => {
// 此时 SDK 会自动停止播放,无需手动调用 stopRemoteVideo。
});

// 手动停止远端用户视频流播放
trtc.stopRemoteVideo({ userId: 'some_remote_user' });

// 默认情况下,SDK会在远端用户发布音频流时自动播放,因此您无需调用任何API来手动播放。
// 如果您需要在远端用户进房时不发布音频,请参考步骤10调用muteRemoteAudio(userId, true)。

步骤9. 静音/取消静音本地音视频

Twilio Video

localVideoTrack.disable(); // 暂停发布本地视频流
localVideoTrack.enable(); // 恢复发布本地视频流, 也可以通过enable(true)或enable(false)进行控制

localAudioTrack.disable(); // 暂停发布本地音频流
localAudioTrack.enable(); // 恢复发布本地音频流, 也可以通过enable(true)或enable(false)进行控制

Tencent RTC Engine

使用 trtc.updateLocalAudio()trtc.updateLocalVideo() 暂时性关闭麦克风与摄像头。该方案不会停止设备采集,而是在“软件层面”暂停采集,因此其优势是重新打开设备时更加快速。
await trtc.updateLocalVideo({ mute: true }); // 暂停发布本地视频流
await trtc.updateLocalVideo({ mute: false }); // 恢复发布本地视频流

await trtc.updateLocalAudio({ mute: true }); // 暂停发布本地音频流
await trtc.updateLocalAudio({ mute: false }); // 恢复发布本地视频流

步骤10. 静音/取消静音远端音视频

Twilio Video

// Twilio Video SDK没有提供直接静音RemoteAudioTrack或RemoteVideoTrack的API
// 您可以通过在HTML层面移除对应的渲染节点来实现手动取消订阅的效果

// 通过detach()实现
const audioElement = remoteAudioTrack.attach();
remoteAudioTrack.detach(audioElement);

Tencent RTC Engine

通过 trtc.muteRemoteAudio() 来快速静音或恢复远端音频流播放。对于远端视频流,请使用 trtc.callExperimentalAPI() 下的 pauseRemotePlayerresumeRemotePlayer进行控制。
await trtc.muteRemoteAudio('some_user_id', true); // 静音远端音频流
await trtc.muteRemoteAudio('some_user_id', false); // 恢复远端音频流

await trtc.callExperimentalAPI('pauseRemotePlayer', { userId: 'some_user_id' }); // 暂停远端视频流
await trtc.callExperimentalAPI('resumeRemotePlayer', { userId: 'some_user_id' }); // 恢复远端视频流

步骤11. 退出房间

Twilio Video

twilioRoom.disconnect()

Tencent RTC Engine

调用 trtc.exitRoom() 来离开当前房间。您也可以使用 trtc.switchRoom() 来快速实现房间之间的切换。
在退房之后,如果您的业务侧无需再使用TRTC实例,可以调用 trtc.destroy() 来销毁 trtc 实例,释放相关资源。
// 仅退出房间
await trtc.exitRoom();

// 结束全部业务RTC逻辑,销毁TRTC实例,释放相关资源
await trtc.destroy();

进阶功能

屏幕分享

Twilio Video

// Twilio Video SDK没有直接调整提供屏幕分享的API
// 需要通过浏览器的navigator.mediaDevices.getDisplayMedia()
// 将屏幕分享流转化为LocalVideoTrack再进行播放

navigator.mediaDevices.getDisplayMedia().then(stream => {
return new TwilioVideo.LocalVideoTrack(stream.getVideoTracks()[0]);
});

// 更多实现请参考
// https://github.com/twilio/video-quickstart-js/blob/master/examples/screenshare/src/helpers.js
// https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getDisplayMedia

Tencent RTC Engine

您可以通过 trtc.startScreenShare()trtc.stopScreenShare() 来更快捷的开启与关闭本地屏幕分享。开启分享后,远端用户会收到 TRTC.EVENT.REMOTE_VIDEO_AVAILABLE 事件,该事件的 streamTypeTRTC.TYPE.STREAM_TYPE_SUB,您可以通过在回调中调用 trtc.startRemoteVideo() 来拉取屏幕分享流。
关于屏幕分享的更多信息,请参考 屏幕分享最佳实践
// 本地: 在调用过trtc.enterRoom()后

// 本地开启屏幕分享
await trtc.startScreenShare();

// 本地停止屏幕分享
await trtc.stopScreenShare();
// 远端: 在调用trtc.enterRoom()前注册事件

// 远端拉取屏幕分享流
trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, ({ userId, streamType }) => {
if (streamType === TRTC.TYPE.STREAM_TYPE_MAIN) {
// 主流,即该用户的摄像头视频流
trtc.startRemoteVideo({ userId, streamType, view: `${userId}_main` });
} else {
// 辅流 (TRTC.TYPE.STREAM_TYPE_SUB),即该用户的屏幕分享流
trtc.startRemoteVideo({ userId, streamType, view: `${userId}_screen` });
}
})

trtc.enterRoom(roomConfig);

音视频编码配置

Twilio Video

// Twilio Video SDK没有直接提供调整音视频编码配置的API
// 需要通过浏览器自带的MediaTrackConstraints, 在进房调用connect()时配置视频分辨率与码率, 以及音频采样率等

const videoEncodingProfile = {
width: 1280,
height: 720,
frameRate: 24
};

const audioEncodingProfile = {
sampleRate: 16000
};

await TwilioVideo.connect(token, {
video: videoEncodingProfile,
audio: audioEncodingProfile
});

// 更多实现请参考
// https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints

Tencent RTC Engine

在调用 trtc.startLocalAudio()trtc.startLocalVideo() 时,您可以通过添加额外的编码参数 profile 调整用户入房使用的视频编码配置音频编码配置
关于编码配置的更多信息,请参考编码文件设置最佳实践
// 本地: 在调用过trtc.enterRoom()后

// 本地视频上行编码配置
// TRTC预定义了一套配置,每个配置对应一组推荐分辨率+帧率+码率的组合
const videoEncodingProfile1 = {
option: {
profile: '1080p' // 分辨率1920*1080, 帧率15fps, 码率2000kbps
}
}

// TRTC同时也支持自定义配置组合
const videoEncodingProfile2 = {
option: {
profile: {
width: 1920,
height: 1080,
frameRate: 15,
bitrate: 2200
}
}
}

await trtc.startLocalVideo(videoEncodingProfile1);

// 支持使用updateLocalVideo进行动态调整
await trtc.updateLocalVideo(videoEncodingProfile2);

// 本地音频上行配置
await trtc.startLocalAudio({ option: { profile: TRTC.TYPE.AUDIO_PROFILE_STANDARD }});

网络质量监控

Twilio Video

// Twilio Video SDK通过connect()时的可选参数networkQuality设置网络质量报告的精细度
await TwilioVideo.connect(token, {
networkQuality: {
local: 1 // Minimal, reporting this participant's network quality
remote: 1 // Minimal, reporting remote paricipants' network quality
}
});

Tencent RTC Engine

TRTC SDK通过在进房前注册 NETWORK_QUALITY 来统计用户进房后的上行与下行网络质量。关于网络质量监控的更多信息,请访问网络质量检测教程
// 本地: 在调用trtc.enterRoom()前注册事件

trtc.on(TRTC.EVENT.NETWORK_QUALITY, event => {
console.log(`network-quality, uplinkNetworkQuality:${event.uplinkNetworkQuality}, downlinkNetworkQuality: ${event.downlinkNetworkQuality}`)
console.log(`uplink RTT:${event.uplinkRTT} loss:${event.uplinkLoss}`)
console.log(`downlink RTT:${event.downlinkRTT} loss:${event.downlinkLoss}`)
})

自定义采集与渲染

Twilio Video

// Twilio Video的LocalTrack支持直接传入已有的MediaStreamTrack实现自定义采集

const customStream = await someCustomCapture(); // e.g. canvas.captureStream(), WebCodecs …
const customMSTrack = customStream.getVideoTracks()[0]; // 或 getAudioTracks()[0], 代表自定义采集的MediaStreamTrack
const customTwilioTrack = new TwilioVideo.LocalVideoTrack(customMSTrack, { name: 'my_custom_track' });

const room = await TwilioVideo.connect(token, {
tracks: [ customTwilioTrack /* 或者直接 customMsTrack */ ],
});

// 更多实现请参考
// https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack

Tencent RTC Engine

在调用 trtc.startLocalAudio()trtc.startLocalVideo() 时,您可以通过添加额外的参数 audioTrackvideoTrack 传入自定义采集的 MediaStreamTrack
关于自定义采集与渲染的更多信息,请参考 自定义采集与渲染最佳实践
// 本地: 在调用过trtc.enterRoom()后

const customStream = await someCustomCapture(); // e.g. canvas.captureStream(), WebCodecs …
const customVideoMSTrack = customStream.getVideoTracks()[0];
const customAudioMSTrack = customStream.getAudioTracks()[0];

// 自定义采集视频
await trtc.startLocalVideo({ option: { videoTrack: customVideoMSTrack }});

// 自定义采集音频
await trtc.startLocalAudio({ option: { audioTrack: customAudioMSTrack }});

数据通道/自定义消息

Twilio Video

// Twilio Video通过LocalDataTrack对象实现数据通道与自定义消息的收发

const dataTrack = new TwilioVideo.LocalDataTrack();

const room = await TwilioVideo.connect(token, {
name: 'my_room',
tracks: [dataTrack /* 以及其他tracks */ ]
});

// 本地通过dataTrack发送消息
dataTrack.send('Hello!');

// 远端通过track.kind判断track类型, 并通过track.on('message')回调接受/展示收到的消息
participant.on('trackSubscribed', track => {
console.log(`Participant "${participant.identity}" added ${track.kind} Track ${track.sid}`);
if (track.kind === 'data') {
track.on('message', data => {
console.log(data);
});
}
});

// 更多实现请参考
// https://www.twilio.com/docs/video/using-datatrack-api

Tencent RTC Engine

自定义消息:trtc.sendCustomMessage() 支持发送自定义消息,消息会广播给房间内的所有用户。
SEI消息:trtc.sendSEIMessage() 支持在视频帧头部数据块中加入SEI消息,适用于对时间精准度要求较高的场景,如歌词同步,直播答题等。
// 本地: 在调用过trtc.enterRoom()后

// 本地发送自定义消息
trtc.sendCustomMessage({
cmdId: 1,
data: new TextEncoder().encode('Hello!').buffer // 一次最大发送1KB数据
});

// 远端通过CUSTOM_MESSAGE事件接收自定义消息
trtc.on(TRTC.EVENT.CUSTOM_MESSAGE, event => {
// event.userId: 远端发消息的 userId
// event.cmdId: 您自定义的消息 Id
// event.seq: 消息的序号
// event.data: 消息内容,ArrayBuffer 类型
console.log(`
received custom msg from ${event.userId},
message: ${new TextDecoder().decode(event.data)}
`);
});
// 发送SEI消息
// 实例化时需要手动开启SEI收发功能
const trtc = TRTC.create({ enableSEI: true });

// 本地: 在调用过enterRoom()与startLocalVideo()后, 发送SEI消息
try {
const unit8Array = new Uint8Array([1, 2, 3]);
trtc.sendSEIMessage(unit8Array.buffer);
// 消息已通过限制,等待后续视频帧发送。
} catch(error) {
console.error(error);
}

// 远端通过SEI_MESSAGE事件接收SEI消息
trtc.on(TRTC.EVENT.SEI_MESSAGE, event =>
console.log(`
received SEI message from ${event.userId},
message: ${event.data}
`);
})

常见问题

Twilio Video 的 Access Token 和 TRTC 的 UserSig 有什么区别?

两者都是用于客户端鉴权的时效性签名凭证,但生成方式不同:
Twilio Access Token:使用 Account SID、API Key SID 和 API Key Secret,通过 Twilio 的 SDK helper libraries 在服务端生成。
TRTC UserSig:使用 SDKAppID 和 SDKSecretKey,通过 HMAC SHA256 算法在服务端生成。

Twilio 的 Room Name(字符串)如何映射到 TRTC 的 Room ID?

TRTC 支持两种房间标识方式:
数字类型 Room ID (roomId):范围为 1 ~ 4294967294 的整数,推荐使用。
字符串类型 Room ID (strRoomId):长度限制 64 字节,支持字母、数字和部分特殊字符。
如果您的 Twilio 项目使用的是字符串形式的房间名称,可以直接使用 strRoomId 进行映射。
注意:
同一个 TRTC 应用中,不可混用 roomIdstrRoomId,两者互不互通。在调用 trtc.enterRoom() 时,如果同时声明了roomIdstrRoomIdroomId优先级高于strRoomId

TRTC 中远端音频为什么不需要手动订阅?

在 Twilio Video 中,远端音频需要通过 remoteParticipant.on('trackSubscribed') 回调手动处理。而在 TRTC 中,远端音频在用户进入房间后会自动播放,无需任何额外操作。如需控制某个远端用户的音频播放,可以使用 muteRemoteAudio(userId, true/false) 进行静音/取消静音。

更多问题

您可以在 API 参考 查看所有函数列表及其描述。如果您的接入和使用中遇到更多问题,请参见 其他问题


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈