# uniapp-livekit-plugin
**Repository Path**: farsunset/uniapp-livekit
## Basic Information
- **Project Name**: uniapp-livekit-plugin
- **Description**: 给原生uniapp提供开箱即用的单人、多人音视频通话、共享桌面插件。完全自主,不依赖第三方云服务
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: http://farsunset.com
- **GVP Project**: No
## Statistics
- **Stars**: 7
- **Forks**: 1
- **Created**: 2025-03-18
- **Last Updated**: 2025-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Android, uni-app, IOS, webrtc, livekit
## README
#### 插件部分功能截图







#### 一、插件申明
1、本插件服务端需要私有化部署,示例项目中的服务端地址只能用于体验,不能用于生产环境。
**2、本插件严禁用于任何违法犯罪的业务,否则造成任何法律后果由使用者自行承担。**
#### 二、功能简介
1、单人音频实时通话支持接听、挂断、开启/关闭麦克风、开启关闭扬声器、开启悬浮窗。
2、单人视频实时通话支持接听、挂断、开启/关闭麦克风、开启/关闭扬声器、前后摄像头切换、视频窗口切换、开启悬浮窗。
3、多人音频会议支持接听、挂断、开启/关闭麦克风、开启/关闭扬声器、邀请成员、成员麦克风打开/关闭、退出会议、结束会议、开启悬浮窗、会议聊天。
4、多人视频会议支持接听、挂断、开启/关闭麦克风、开启/关闭扬声器、开启/关闭摄像头、邀请成员、成员麦克风打开/关闭、退出会议、结束会议、桌面共享、开启悬浮窗、会议聊天。
通话过程中的事件消息结构体,由服务端下发给uniapp,然后按照下面接口透传给插件
```
{
"id": 362433383034392576,
"sender": 0,
"receiver":"10000",
"action": "900",
"content": "XXXXX",
"extra": 'XXXXXXX',
"format": 0,
"timestamp": 1601024512030
}
```
| action | 含义 |
|-------------|------------------------------------------------------------------------------------|
| 900 | 【单人通话】:收到通话请求 |
| 902 | 【单人通话】:被叫已经同意接听 |
| 903 | 【单人通话】:被叫已经拒绝接听 |
| 904 | 【单人通话】:被叫设备正忙 |
| 905 | 【单人通话】:结束通话、对方挂断通话 |
| 906 | 【单人通话】:主叫取消呼叫 |
| 928 | 【单人通话】:被叫:已经在其他设备接听 |
| 929 | 【单人通话】:被叫:已经在其他设备拒接 |
| 932 | 【单人通话】:被叫已经响铃 |
| 600 | 【多人会议】:收到人会议邀请 |
#### 三、UNI接口文档
```
const livekitPlugin = uni.requireNativePlugin('LivekitMeetingPlugin');
```
##### 1.设置配置信息
【进入APP首页调用】
| 字段名 | 必须的 | 含义 |[README.md](../livekit-push-server/README.md)
|-------------|-----|------------------------------------------------------------------------------------|
| self.id | 是 | 当前用户ID(整形) |
| self.name | 是 | 当前用户名称 |
| logo.uri | 是 | 所有用户LOGO头像地址规则,
如:http://api.yourdomain.com/file/user-icon/{uid}
{uid}为占位符 |
| api.host | 是 | webrtc-push-server服务端地址 |
| livekit.uri | 是 | Livekit服务端地址 |
| api.token | 否 | 当前用户token 可不传,服务端实现登录接口后可再传 |
```
livekitPlugin.setupAppConfig({
"self.id":10000,
"self.name":"远方",
"logo.uri":"http://api.yourdomain.com/file/user-icon/{uid}",
"api.host":"http://api.yourdomain.com",
"api.token":"XXXXXXXXXXXX",
"livekit.uri":"wss://livekit.xx.com"
});
```
##### 2.设置通讯录列表
【进入APP首页调用】
同步通讯录。用于选择联系人,不包含当前用户
```
livekitPlugin.setupContactList({
"friends":[
{
"id":10000,
"name":"远方",
},
{
"id":10001,
"name":"张三",
}
]
});
```
##### 3.拨打单人语音通话
id:被叫UID
```
livekitPlugin.callSingleVoice({
"id":10000
});
```
##### 4. 拨打单人视频通话
id:被叫UID
```
livekitPlugin.callSingleVideo({
"id":10000
});
```
##### 5.收到单人通话来电
收到单人通话来电,包含语音和视频通话来电
收到服务端推送的action:900的消息
```
livekitPlugin.onSingleIncomingCall({
"id":123456789,
"sender":10000,
"action":900,
"content":"xxxxxxx",
"extra":"xxxxxxx",
"timestamp":1681025412032
});
```
##### 6.收到单人通话事件消息
除去action:900、600 其余事件消息都透传给此接口
```
livekitPlugin.onWebrtcEventMessage({
"id":123456789,
"sender":10000,
"action":901,
"content":"xxxxxxx",
"extra":"xxxxxxx",
"timestamp":1681025412032
});
```
##### 7.进入会议房间
外部获取到房间信息后,进入会议房间界面
uniapp调用接口获取会议信息
http://127.0.0.1:8080/swagger-ui/index.html#/
GET /livekit/meeting/room
| 字段名 | 必须的 | 含义 |
|---------------|-----|----------------------------------------------------|
| uid | 是 | 会议创建者UID |
| name | 是 | 会议创建者名称 |
| tag | 是 | 会议房间号码 |
| title | 否 | 会议主题 |
| description | 否 | 会议描述 |
| muted | 是 | 房间是否被禁言 |
| microphoneOn | 是 | 是否打开本地麦克风 |
| cameraOn | 是 | 是否打开本地摄像头 |
| fromGroupMode | 是 | 是否是从群发起的会议,如果true,join之前需要设置setupGroupMemberList() |
```
livekitPlugin.onJoinMeeting({
"uid":10000,
"name":远方,
"title":"xxxxxxx",
"description":"xxxxxxx",
"tag":"xxxxxxx",
"muted":false,
"microphoneOn":false,
"cameraOn":false
});
```
##### 8.发起快速会议
外部发起快捷会议,插件里面实现选择成员发起,
fromGroupMode 是否是群里面发起
true,则从群成员里面选择,先调用setupGroupMemberList
false 从好友列表选择
```
livekitPlugin.onCreateMeeting({
"fromGroupMode":true
});
```
##### 9.收到会议来电消息
收到action=600时,透传消息信息,插件唤起接听界面
```
livekitPlugin.onReceiveMeetingRing({
"id":123456789,
"sender":10000,
"action":600,
"content":"xxxxxxx",
"timestamp":1681025412032
});
```
##### 10. 新增联系人
通讯录增增联系人
```
livekitPlugin.addContact({
"id":10000,
"name":"远方",
});
```
##### 11. 删除联系人
通讯录删除联系人
id:用户UID
```
livekitPlugin.removeContact({
"id":10000
});
```
##### 12. 设置群成员信息
从群发起多人会议时,设置群成员,用于邀请其他人时从群成员列表里面选择邀请
```
livekitPlugin.setupGroupMemberList({
"members":[
{
"id":10000,
"name":"远方",
},
{
"id":10001,
"name":"张三",
}
]
});
```
#### 四、globalEvent事件通知
```
var globalEvent = uni.requireNativePlugin('globalEvent');
globalEvent.addEventListener('LivekitMeetingEvent', function(e) {
});
```
##### 1.单人通话完结通知
所有单人通话事件均放在这个事件当中,根据状态来进行消息记录显示处理
| 字段名 | 含义 |
|---------------|----------------------------------------------|
| data.state | 通话状态 0:已经接通 1:已经取消 2:已拒绝 3:设备正忙 4:响应超时 5:忽略来电 |
| data.duration | 通话时长(毫秒) |
| data.role | 通话角色 0:主叫 1:被叫 |
| data.type | 通话类型 audio:语音 video:视频 |
| data.uid | 对方用户UID |
```
{
"key":"ACTION_CALL_FINISHED",
"data":{
"state":0,
"duration":60000,
"role":0,
"type":"audio",
"uid":10000
}
}
```
##### 2.多人会议完结通知
所有多人通话事件均放在这个事件当中,根据状态来进行消息记录显示处理
修正或者新增本地存储的会议记录
如果是加入会议,则应该是修改会议记录的接通时长,成员等
如果是发起快速会议,则是新增
| 字段名 | 含义 |
|---------------|--------------|
| data.tag | 房间号 |
| data.duration | 通话时长(毫秒) |
| data.joinedAt | 入会时间戳13位 |
| data.member | 参会人信息 UID:名称 |
| uid | 会议创建者UID |
| name | 会议创建者名称 |
```
{
"key":"ACTION_MEETING_FINISHED",
"data":{
"tag":"XXXXXXXX",
"duration":60000,
"joinedAt":1701234567891020
"uid":10000,
"name":"XXX"
"member":{
"10000":"张三",
"10001":"李四",
"10002":"王五"
}
}
}
```
##### 3.开始单人呼叫
打开呼叫页面时触发
```
{
"key":"ACTION_START_CALLING",
}
```
##### 4.收到入会邀请
被他人拉入会议,显示了接听界面,插件通知保存会议记录
| 字段名 | 含义 |
|-------------|---------------|
| data.tag | 房间号 |
| data.uid | 会议创建者UID |
| data.name | 会议创建者名称 |
| data.title | 主题 |
| data.description | 描述 |
| data.dueTime | 预约时间 |
| data.createAt | 收到邀请时间,13位时间戳 |
```
{
"key":"ACTION_MEETING_RING",
"data":{
"tag":"XXXXXXXX",
"title":"xxxx",
"description":"xxxx",
"createAt":1701234567891020,
"dueTime":2024-03-18 14:00,
"uid":10000,
"name":"XXX"
}
}
```