跳到主要内容

Web SDK

TgoRTC Web (JavaScript/React) SDK,基于 LiveKit 的实时音视频通信 SDK。

安装

npm install tgortc-js-sdk
# 或
yarn add tgortc-js-sdk
# 或
pnpm add tgortc-js-sdk

依赖要求

npm install react react-dom

常用功能介绍

// 房间管理 
// 加入,离开房间等
TgoRTC.instance.roomManager

// 参与者管理
// 获取本地参与者,远程参与者,要求成员等
TgoRTC.instance.participantManager

// 音频管理
// 可获取可用设备列表 切换输出输入设备等
TgoRTC.instance.audioManager

快速开始

1. 初始化 SDK

import { TgoRTC } from 'tgortc-js-sdk';

// 初始化配置
TgoRTC.instance.init({
debug: true, // 启用调试日志
mirror: false, // 启用视频镜像
});

2. 创建房间信息并加入

import { RoomInfo, RTCType } from 'tgortc-js-sdk';

// 创建房间信息
const roomInfo = new RoomInfo(
'roomName', // 房间名称
'token', // 连接 Token
'url', // 连接地址
'loginUID', // 当前用户 ID
'creatorUID' // 房间创建者 ID
);

// 可选:配置房间设置
roomInfo.maxParticipants = 9; // 房间最大人数
roomInfo.rtcType = RTCType.Video;
roomInfo.timeout = 30; // 参与者加入超时(秒)

// 加入房间
await TgoRTC.instance.roomManager.joinRoom(roomInfo, {
micEnabled: true, // 默认是否开启麦克风
cameraEnabled: true, // 默认是否打开摄像头
screenShareEnabled: false, // 默认是否屏幕共享
});

3. 监听连接状态

import { ConnectStatus } from 'tgortc-js-sdk';

const handleConnectStatus = (
roomName: string,
status: ConnectStatus,
reason: string
) => {
switch (status) {
case ConnectStatus.Connecting:
console.log('正在连接房间...');
break;
case ConnectStatus.Connected:
console.log('已连接到房间');
break;
case ConnectStatus.Disconnected:
console.log('已断开连接');
break;
case ConnectStatus.Reconnecting:
console.log('正在重连...');
break;
case ConnectStatus.Reconnected:
console.log('已重新连接到房间');
break;
}
};

// 添加监听器
TgoRTC.instance.roomManager.addConnectListener(handleConnectStatus);

// 移除监听器
TgoRTC.instance.roomManager.removeConnectListener(handleConnectStatus);

4. 获取参与者

// 获取本地参与者
const localParticipant = TgoRTC.instance.participantManager.getLocalParticipant();

// 获取所有远程参与者
const remoteParticipants = TgoRTC.instance.participantManager.getRemoteParticipants();

// 获取所有参与者(本地 + 远程)
const allParticipants = TgoRTC.instance.participantManager.getAllParticipants();

// 监听新参与者加入
TgoRTC.instance.participantManager.addNewParticipantListener((participant) => {
console.log('新参与者加入:', participant.uid);
});

5. 媒体控制和事件

媒体控制仅适用于本地参与者。

const participant = TgoRTC.instance.participantManager.getLocalParticipant();

if (participant) {
// ========== 媒体控制 ==========

// 切换麦克风(仅本地参与者生效)
await participant.setMicrophoneEnabled(true);

// 切换摄像头(仅本地参与者生效)
await participant.setCameraEnabled(true);

// 切换屏幕共享(仅本地参与者生效)
await participant.setScreenShareEnabled(true);

// 切换前后摄像头(仅本地参与者生效)
await participant.switchCamera();

// 切换扬声器(仅本地参与者生效)
await participant.toggleSpeakerphone();

// 指定扬声器开关状态(仅本地参与者生效)
await participant.setSpeakerphoneOn(true);

// 检查媒体状态
const micEnabled = participant.getMicrophoneEnabled();
const cameraEnabled = participant.getCameraEnabled();
const screenShareEnabled = participant.getScreenShareEnabled();
const speakerEnabled = participant.getSpeakerEnabled();
const cameraPosition = participant.getCameraPosition();

// ========== 事件监听 ==========

const onMicChange = (enabled: boolean) => {
console.log('麦克风:', enabled ? '开启' : '关闭');
};

const onCameraChange = (enabled: boolean) => {
console.log('摄像头:', enabled ? '开启' : '关闭');
};

const onSpeakerChange = (enabled: boolean) => {
console.log('扬声器:', enabled ? '开启' : '关闭');
};

const onScreenShareChange = (enabled: boolean) => {
console.log('屏幕共享:', enabled ? '开启' : '关闭');
};

const onSpeakingChange = (isSpeaking: boolean, audioLevel: number) => {
console.log('正在说话:', isSpeaking, '音量:', audioLevel);
};

const onConnQualityChange = (quality) => {
console.log('连接质量:', quality);
};

const onJoined = () => {
console.log('参与者已加入');
};

const onLeave = () => {
console.log('参与者已离开');
};

const onTrackPublished = () => {
console.log('轨道已发布');
};

const onTrackUnpublished = () => {
console.log('轨道已取消发布');
};

const onVideoInfoChange = (info) => {
console.log('视频信息:', info.width, 'x', info.height, info.frameRate, 'fps');
};

// 麦克风状态变化
participant.addMicrophoneStatusListener(onMicChange);

// 摄像头状态变化
participant.addCameraStatusListener(onCameraChange);

// 扬声器状态变化
participant.addSpeakerStatusListener(onSpeakerChange);

// 屏幕共享状态变化
participant.addScreenShareStatusListener(onScreenShareChange);

// 说话状态变化
participant.addSpeakingListener(onSpeakingChange);

// 连接质量变化
participant.addConnQualityListener(onConnQualityChange);

// 参与者加入房间
participant.addJoinedListener(onJoined);

// 参与者离开房间
participant.addLeaveListener(onLeave);

// 轨道发布 / 取消发布
participant.addTrackPublishedListener(onTrackPublished);
participant.addTrackUnpublishedListener(onTrackUnpublished);

// 视频信息变化(分辨率、码率等)
participant.addVideoInfoListener(onVideoInfoChange);

// ========== 移除监听器 ==========

// 页面销毁时务必移除监听器,避免内存泄漏
participant.removeMicrophoneStatusListener(onMicChange);
participant.removeCameraStatusListener(onCameraChange);
participant.removeSpeakerStatusListener(onSpeakerChange);
participant.removeScreenShareStatusListener(onScreenShareChange);
participant.removeSpeakingListener(onSpeakingChange);
participant.removeConnQualityListener(onConnQualityChange);
participant.removeJoinedListener(onJoined);
participant.removeLeaveListener(onLeave);
participant.removeTrackPublishedListener(onTrackPublished);
participant.removeTrackUnpublishedListener(onTrackUnpublished);
participant.removeVideoInfoListener(onVideoInfoChange);
}

6. 渲染视频轨道(React 组件)

import { useRef, useState, useEffect } from 'react';
import {
TgoTrackRenderer,
TgoTrackRendererHandle,
TgoParticipant,
TgoRTC
} from 'tgortc-js-sdk';
import { Track } from 'livekit-client';

function VideoView() {
const rendererRef = useRef<TgoTrackRendererHandle>(null);
const [participant, setParticipant] = useState<TgoParticipant | null>(null);

useEffect(() => {
const local = TgoRTC.instance.participantManager.getLocalParticipant();
setParticipant(local);
}, []);

return (
<TgoTrackRenderer
ref={rendererRef}
participant={participant}
source={Track.Source.Camera}
fit="cover"
mirror={true}
placeholder={<div>等待视频...</div>}
onTrackChange={(hasTrack) => {
console.log('轨道可用:', hasTrack);
}}
/>
);
}

7. 音频设备管理

// 获取音频设备
const inputDevices = await TgoRTC.instance.audioManager.getAudioInputDevices();
const outputDevices = await TgoRTC.instance.audioManager.getAudioOutputDevices();
const videoDevices = await TgoRTC.instance.audioManager.getDevices('videoinput');

// 监听设备变化
TgoRTC.instance.audioManager.addDeviceChangeListener((devices) => {
console.log('设备变化:', devices);
});

// 切换输入 / 输出设备
await TgoRTC.instance.audioManager.switchAudioInputDevice(inputDevices[0].deviceId);
await TgoRTC.instance.audioManager.switchAudioOutputDevice(outputDevices[0].deviceId);

// 切换扬声器
await TgoRTC.instance.audioManager.toggleSpeakerphone();

// 指定扬声器开关状态
await TgoRTC.instance.audioManager.setSpeakerphoneOn(true);

8. 离开房间

await TgoRTC.instance.roomManager.leaveRoom();

API 参考

TgoRTC

SDK 主入口(单例模式)。

属性类型说明
instanceTgoRTC单例实例
optionsOptionsSDK 配置
roomManagerTgoRoomManager房间管理
participantManagerTgoParticipantManager参与者管理
audioManagerTgoAudioManager音频设备管理

TgoRoomManager

方法说明
joinRoom(roomInfo, options?)加入房间
leaveRoom()离开当前房间
addConnectListener(listener)添加连接状态监听器
removeConnectListener(listener)移除连接状态监听器

TgoParticipantManager

方法说明
getLocalParticipant()获取本地参与者
getRemoteParticipants()获取远程参与者
getAllParticipants()获取所有参与者
inviteParticipant(uids)邀请参与者
removePendingParticipants(roomName, uids)移除未接通的待加入参与者
addNewParticipantListener(listener)监听新参与者
removeNewParticipantListener(listener)移除新参与者监听

TgoParticipant

媒体控制方法

方法说明
setMicrophoneEnabled(enabled)启用/禁用麦克风
setCameraEnabled(enabled)启用/禁用摄像头
setScreenShareEnabled(enabled)启用/禁用屏幕共享
switchCamera()切换前后摄像头
toggleSpeakerphone()切换扬声器
setSpeakerphoneOn(on)设置扬声器开关

状态获取方法

方法说明
getMicrophoneEnabled()获取麦克风状态
getCameraEnabled()获取摄像头状态
getScreenShareEnabled()获取屏幕共享状态
getSpeakerEnabled()获取扬声器状态
getCameraPosition()获取当前摄像头方向
getVideoTrack(source?)获取视频轨道
getAudioLevel()获取音频电平 (0-1)
getIsSpeaking()获取是否正在说话

事件监听方法

方法说明
addMicrophoneStatusListener(listener)监听麦克风状态
addCameraStatusListener(listener)监听摄像头状态
addSpeakerStatusListener(listener)监听扬声器状态
addScreenShareStatusListener(listener)监听屏幕共享状态
addSpeakingListener(listener)监听说话状态
addCameraPositionListener(listener)监听摄像头方向变化
addConnQualityListener(listener)监听连接质量
addJoinedListener(listener)监听参与者加入
addLeaveListener(listener)监听参与者离开
addTrackPublishedListener(listener)监听轨道发布
addTrackUnpublishedListener(listener)监听轨道取消发布
addVideoInfoListener(listener)监听视频信息变化
remove...Listener(listener)移除对应监听器

属性

属性类型说明
uidstring参与者 ID
isLocalboolean是否为本地参与者
hasJoinedboolean是否已加入房间
isJoinedboolean是否已加入房间
currentVideoInfoVideoInfo当前视频信息

TgoTrackRenderer(React 组件)

属性类型默认值说明
participantTgoParticipant | null-要渲染的参与者
sourceTrack.SourceCamera轨道来源类型
fit'cover' | 'contain' | 'fill''cover'视频填充模式
mirrorbooleanSDK 设置是否镜像
classNamestring-自定义类名
styleReact.CSSProperties-自定义样式
placeholderReactNode-无视频时的占位符
onTrackChange(hasTrack: boolean) => void-轨道变化回调
Ref 方法说明
refresh()手动刷新视频轨道
setParticipant(participant)更新参与者

枚举类型

ConnectStatus

enum ConnectStatus {
Connecting = 'connecting', // 连接中
Connected = 'connected', // 已连接
Reconnecting = 'reconnecting', // 重连中
Reconnected = 'reconnected', // 已重连
Disconnected = 'disconnected', // 已断开
}

说明: ConnectStatus 枚举完整包含以上 5 个状态。 按当前 JS SDK 实现,TgoRoomManager.addConnectListener(...) 目前实际会回调 ConnectedDisconnectedReconnectingReconnected 这 4 种状态; Connecting 虽然在枚举中定义了,但当前 TgoRoomManager 源码里还没有主动派发这个状态。

RTCType

enum RTCType {
Audio = 'audio', // 仅音频
Video = 'video', // 音视频
}

TgoConnectionQuality

enum TgoConnectionQuality {
Unknown = 'unknown', // 未知
Excellent = 'excellent', // 优秀
Good = 'good', // 良好
Poor = 'poor', // 较差
Lost = 'lost', // 丢失
}

TgoCameraPosition

enum TgoCameraPosition {
Front = 'front', // 前置摄像头
Back = 'back', // 后置摄像头
}

RoomInfo 类

房间信息类,用于配置房间连接。

class RoomInfo {
roomName: string; // 房间名称
token: string; // LiveKit Token
url: string; // LiveKit 服务器地址
loginUID: string; // 当前用户 ID
creatorUID: string; // 房间创建者 ID
maxParticipants: number; // 最大参与者数(默认 2)
rtcType: RTCType; // 通话类型(默认 Audio)
isP2P: boolean; // 是否点对点(默认 true)
uidList: string[]; // 参与者列表
timeout: number; // 超时时间(默认 30 秒)

// 方法
getP2PToUID(): string; // 获取 P2P 目标用户
isCreator(): boolean; // 是否为创建者
}

配置选项

interface Options {
mirror: boolean; // 视频镜像(默认 false)
debug: boolean; // 调试模式(默认 true)
}

TgoAudioManager

方法说明
getAudioInputDevices()获取麦克风设备列表
getAudioOutputDevices()获取音频输出设备列表
getDevices(kind)获取指定类型设备列表
switchAudioInputDevice(deviceId, setAsDefault?)切换麦克风设备
switchAudioOutputDevice(deviceId, setAsDefault?)切换音频输出设备
toggleSpeakerphone()切换扬声器状态
setSpeakerphoneOn(on)设置扬声器状态
addDeviceChangeListener(listener)监听设备变化
removeDeviceChangeListener(listener)移除设备变化监听

属性

属性类型说明
isSpeakerOnboolean当前扬声器状态
currentAudioInputDeviceIdstring | null当前输入设备 ID
currentAudioOutputDeviceIdstring | null当前输出设备 ID

最佳实践

使用 useRef 保存参与者引用

在 React 中,使用 useRef 保存 participant 引用,避免在事件监听器中使用过时的闭包:

import { useRef, useEffect, useCallback } from 'react';
import { TgoRTC, TgoParticipant } from 'tgortc-js-sdk';

function CallPage({ roomInfo }) {
const localParticipantRef = useRef<TgoParticipant | null>(null);
const cleanupRef = useRef<(() => void) | null>(null);

useEffect(() => {
const joinRoom = async () => {
await TgoRTC.instance.roomManager.joinRoom(roomInfo, {
micEnabled: true,
cameraEnabled: true,
});

// 保存参与者引用
const participant = TgoRTC.instance.participantManager.getLocalParticipant();
localParticipantRef.current = participant;

// 添加监听器并保存清理函数
if (participant) {
const onMicChange = (enabled: boolean) => console.log('Mic:', enabled);
const onCameraChange = (enabled: boolean) => console.log('Camera:', enabled);

participant.addMicrophoneStatusListener(onMicChange);
participant.addCameraStatusListener(onCameraChange);

cleanupRef.current = () => {
participant.removeMicrophoneStatusListener(onMicChange);
participant.removeCameraStatusListener(onCameraChange);
};
}
};

joinRoom();

return () => {
// 清理监听器
cleanupRef.current?.();
// 离开房间
TgoRTC.instance.roomManager.leaveRoom();
};
}, [roomInfo]);

const handleMicToggle = useCallback(async () => {
const participant = localParticipantRef.current;
if (participant) {
const current = participant.getMicrophoneEnabled();
await participant.setMicrophoneEnabled(!current);
}
}, []);

return <button onClick={handleMicToggle}>切换麦克风</button>;
}

监听远程参与者

使用 addNewParticipantListener 监听新参与者加入,并为其添加事件监听:

const participantManager = TgoRTC.instance.participantManager;

// 监听新参与者加入
participantManager.addNewParticipantListener((participant) => {
console.log('新参与者:', participant.uid);

// 监听远程参与者事件
participant.addJoinedListener(() => {
console.log(`${participant.uid} 已加入`);
});

participant.addLeaveListener(() => {
console.log(`${participant.uid} 已离开`);
});

participant.addCameraStatusListener((enabled) => {
console.log(`${participant.uid} 摄像头:`, enabled);
});
});

处理未接通参与者

当前 JS SDK 没有 participant.addTimeoutListener(...) 这类参与者级超时事件。 如果业务侧已经知道某些被邀请用户未接通,可以通过 TgoParticipantManager.removePendingParticipants(...) 把这些尚未加入房间的参与者从当前列表中移除:

const roomName = roomInfo.roomName;
const missedUids = ['user_b', 'user_c'];

TgoRTC.instance.participantManager.removePendingParticipants(
roomName,
missedUids
);