基本概念
- SMeeting实例:通过
new SMeeting得到操作实例,绝大部分接口都通过该实例对外提供,所有事件都可通过SMeeting.onNotifyRoomEvent来监听。(如果你想同时加入多个频道,目前只能new多个实例来操作) - 首页需要获取meeting的token(从后端接口中获取),调用smeeting.login登录成功后才能进行后续的操作如创建会议、加入会议等操作
- RoomInfo:
smeeting.enterRoom加入会议后的会议信息,可通过smeeting.getRoomInfo获得 UserInfo:会议内用户信息(包括自己与其他远端用户),可通过smeeting.getUserInfo(uid: string)获取会议单用户信息,也可通过smeeting.getUsersInfo(true/false)获取频道所有在线用户信息 true获取map数据 false获取array数据
初始化SDK及环境检测
复制
询问AI
// 创建实例
const smeeting = new SMeeting({
logLevel: LogLevel.DEBUG,
logTarget: LogTarget.CONSOLE,
});
// 检测环境信息
const envinfo = smeeting.getEnvInfo();
console.log("environment", envinfo);
if(!envinfo.supported) {
alert("当前环境不支持SRTC,建议切换到最新chrome浏览器");
} else {
if(!envinfo.mediaDevices) {
if(!envinfo.secure) {
alert("当前非安全环境(https或localhost或127.0.0.1),将无法获取麦克风、摄像头等媒体设备进行音视频采集、推流");
} else {
alert("当前环境不支持获取外设,将无法获取麦克风、摄像头等媒体设备进行音视频采集、推流");
}
}
if(!envinfo.h264Enc) {
alert("当前环境不支持H264编码,将无法推流");
}
if(!envinfo.h264Dec) {
alert("当前环境不支持H264解码,将无法收流");
}
if(!envinfo.screenshare) {
alert("当前环境不支持发起屏幕共享");
}
}
// 回调事件响应
smeeting.onNotifyRoomEvent = (evt: RoomEvent) => {
console.log('收到会议事件', evt);
switch (evt.type) {
// ...
}
})
```typescript
### 创建会议
```typescript
const createRoom = async () => {
// 调后台api获取Meet授权
let token = "后台返回的Meet授权token";
await smeeting.login(token);
const roomNo = await smeeting.createRoom({
title: 'shu的会议', // 会议名称
}); // 获取到会议号
}
加入会议
复制
询问AI
const enterRoom = async () => {
await smeeting.enterRoom({
room_no: roomNo, // 会议号
nickname: nickname, // 昵称
});
}
```typescript
### 退出会议
```typescript
await smeeting.exitRoom()
结束会议(解散)
复制
询问AI
await smeeting.adminDestroyRoom()
```typescript
### 取消会议
```typescript
await smeeting.value.cancelRoom(meeting_id)
获取房间信息/用户信息/用户列表
复制
询问AI
// 获取房间信息
let roomInfo: RoomInfo = smeeting.getRoomInfo();
// 获取某用户信息
let userInfo: UserInfo = smeeting.getUserInfo(uid);
// 获取房间内用户信息列表
let users: Record<string, UserInfo> = smeeting.getUsersInfo(true);
```typescript
### 更新会中昵称
```typescript
await smeeting.updateName(name)
获取设备列表
复制
询问AI
// kind: 外设类别 "audioinput" | "audiooutput" | "videoinput"
let freshDeviceList = async (kind?: MediaDeviceKind) => {
if(!envinfo.mediaDevices) {
return;
}
try {
let devices = await smeeting.getDevices(kind);
console.log("获取设备列表成功", devices);
devices.forEach((device) => {
// 后续可以用deviceId来进行指定摄像头采集、麦克风采集、扬声器放声(有些环境不支持)
console.log(device.deviceId, device.kind, device.label);
// 添加到界面select选择列表
// let opt = document.createElement('option');
// opt.value = device.deviceId;
// 有时候label可能为空字串,界面显示可以用 label || deviceId
// opt.text = device.label || device.deviceId;
// select.append(opt);
});
} catch(err) {
console.error("获取设备列表失败", err);
};
};
```typescript
### 打开、关闭、切换摄像头
```typescript
/**
* 打开摄像头
* @param container 预览容器
* @param deviceId 摄像头设备id
* @param preset 摄像头预设值
* @param byAdmin 是否主持人操作
* @param adminUid 主持人id(哪个主持人请求打开)
*/
await smeeting.requestOpenCamera(container: HTMLElement, deviceId?: string, preset?: CameraPreset, byAdmin?: boolean, adminUid?: string)
/**
* 关闭摄像头
*/
await smeeting.closeCamera()
/**
* 切换摄像头
* @param deviceId 摄像头设备id,手机端不传自动切换前后置摄像头,桌面端可指定摄像头
*/
await smeeting.switchCamera(deviceId?: string)
开始、停止播放远端用户视频
复制
询问AI
/**
* 开始播放远端用户视频
* @param container 播放容器
* @param uid 远程用户id
* @param trackDesc 视频轨道描述
* @returns RemoteVideoTrack
*/
const track:RemoteVideoTrack = await smeeting.startPlayRemoteVideo(container: HTMLElement,uid: string, trackDesc: TrackDesc)
/**
* 停止播放远端用户视频
* @param container 播放容器
* @param uid 远端用户id
* @param trackDesc 视频轨道描述
*/
await smeeting.stopPlayRemoteVideo(container: HTMLElement, uid: string, trackDesc: TrackDesc)
```typescript
### 打开、关闭、切换麦克风
```typescript
/**
* 打开麦克风
* @param deviceId 麦克风设备id
* @param preset 麦克风预设值
* @param admin_uid 主持人id(哪个主持人请求打开)
*/
await smeeting.requestOpenMic(deviceId?: string, preset?: MicPreset, byAdmin?: boolean, adminUid?: string)
/**
* 关闭麦克风
*/
await smeeting.closeMic()
/**
* 切换麦克风
* @param deviceId 麦克风设备id
*/
await smeeting.switchMic(deviceId: string)
打开、关闭、切换扬声器
复制
询问AI
/**
* 切换远程音频的静音/取消静音状态(可以指定设备)
* @param mute 是否静音
* @param opt 扬声器配置
*/
await smeeting.toggleRemoteAudioMute(false,{deviceId?: string}) // 打开和切换
await smeeting.toggleRemoteAudioMute(true) // 关闭
```typescript
### 请求打开、关闭共享
```typescript
/**
* 打开共享
* @param shareType 共享类型
* @param container 预览容器
*/
await smeeting.requestShare(shareType: ShareType = ShareType.Screen, preset?: ScreenPreset, container?: HTMLElement)
await smeeting.stopShare()
发送聊天消息
复制
询问AI
/**
* 发送聊天消息,可单发和群发
* @param msg_type 消息类型 1文本 2文件 3图片 4语音
* @param msg 消息内容
* @param target_id 消息接收者 为空时表示全房间接收
*/
await smeeting.sendRoomChatMessage(msg: string, target_id: string, msg_type: ChatMsgType = ChatMsgType.Text)
```typescript
### 发送自定义消息
```typescript
/**
* 发送自定义消息,可单发和群发
* @param content 消息内容
* @param target_id 消息接收者 为空时表示全房间接收
*/
await smeeting.sendRoomCustomMessage(content: string, target_id: string)
举手、取消举手
复制
询问AI
enum HandupType {
/**
* 申请开麦克风
*/
Mic = 1,
/**
* 申请开摄像头
*/
Camera = 2,
/**
* 申请聊天
*/
Chat = 3
}
await smeeting.requestHandup(code:HandupType)
await smeeting.cancelHandup(code:HandupType)
```typescript
### 主持人请求远端用户打开摄像头、 关闭远端用户摄像头
```typescript
/**
* 请求远端用户打开摄像头
* @param target_id 用户id
*/
await smeeting.adminRequestUserOpenCamera(target_id: string)
/**
* 关闭远端用户摄像头
* @param target_id 用户id
*/
await smeeting.adminCloseUserCamera(target_id: string)
主持人请求远端用户打开麦克风、关闭远端用户麦克风
复制
询问AI
/**
* 请求远端用户打开麦克风
* @param targetId 用户id
*/
await smeeting.adminRequestUserOpenMic(target_id: string)
/**
* 关闭远端用户麦克风
* @param target_id 用户id
*/
await smeeting.adminCloseUserMic(target_id: string)
```typescript
### 主持人将远端用户踢出房间
```typescript
/**
* 将远端用户踢出房间
* @param target_id 用户id
* @param join_disabled 是否禁止再入会
*/
await smeeting.adminKickUserOut(target_id: string, join_disabled: boolean)
主持人更新房间麦克风使用权限禁用状态(全体禁音和全体解除禁音)
复制
询问AI
/**
* 更新房间麦克风使用权限禁用状态(全体禁音和全体解除禁音)
* @param self_unmute_mic_disabled 是否禁用自我解除
* @param mic_disabled 是否禁用麦克风
*/
await smeeting.adminUpdateRoomMicState(self_unmute_mic_disabled: boolean, mic_disabled: boolean)
```typescript
### 主持人更新房间麦克风允许自我解除
```typescript
/**
* 更新房间麦克风允许自我解除
* @param self_unmute_mic_disabled 是否禁用自我解除
*/
await smeeting.adminUpdateRoomSelfUnmuteMicDisabled(self_unmute_mic_disabled: boolean)
主持人更新房间摄像头允许自我解除
复制
询问AI
/**
* 更新房间摄像头允许自我解除
* @param self_unmute_camera_disabled 是否禁用自我解除
*/
await smeeting.adminUpdateRoomSelfUnmuteCameraDisabled(self_unmute_camera_disabled: boolean)
```typescript
### 主持人更新房间摄像头使用权限禁用状态
```typescript
/**
* 更新房间摄像头使用权限禁用状态
* @param self_unmute_camera_disabled 是否禁用自我解除
* @param camera_disabled 是否禁用摄像头
*/
await smeeting.adminUpdateRoomCameraState(self_unmute_camera_disabled: boolean, camera_disabled: boolean)
主持人邀请设备入会
复制
询问AI
/**
* 主持人邀请设备入会
* @param agents 邀请的设备 {type: 设备类型,contact: 设备标识}
* @param no 房间号
*/
await smeeting.adminInviteAgent(agents:{ type: AgentType, contact: string }[], no: string)
```typescript
### 主持人修改参会人员
```typescript
/**
* 修改参会人员
* @param conferee 参会人员id集合
*/
await smeeting.adminUpdateConferee(conferee: string[])
主持人修改合成会议的布局
复制
询问AI
/**
* 修改合成会议的布局
* @param layoutData 布局数据
*/
await smeeting.adminUpdateLayout(layoutData: LayoutData)
```typescript
### 获取设备列表
```typescript
/**
* 设备列表
* @param type 设备类型
* @param name 名称
* @param page 页码
* @param perPage 每页数量
*/
smeeting.agentList(type: AgentType[], name: string, page: number, perPage: number): Promise<{
data: AgentInfo[];
_meta: MetaRes;
}>
录制相关
复制
询问AI
/**
* 开始录制
* @param req 录制参数
*/
await smeeting.mcuStart(req: McuStartReq)
/**
* 停止录制
*/
await smeeting.mcuStop()
/**
* 获取录制配置
*/
const mcuRecordConfig:McuRecordConfig = await smeeting.mcuRecordConfig()
/**
* 获取录制详情
*/
const mcuRecordDetail:McuRecordDetail = await smeeting.mcuRecordDetail()
```typescript
### 远端合成视频
```typescript
/**
* 开始播放远端合成视频
* @param container 播放容器
* @returns
*/
const track:RemoteVideoTrack = await startPlayRemoteVideoMcu(container: HTMLElement)
/**
* 停止播放远端合成视频
* @param container 播放容器
*/
await stopPlayRemoteVideoMcu(container: HTMLElement)