# j-sfu-meeting **Repository Path**: cgb-lowcode/j-sfu-meeting ## Basic Information - **Project Name**: j-sfu-meeting - **Description**: 基于ZLM4J-WebRTC实现的基于sfu多人会议系统 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 11 - **Created**: 2026-07-19 - **Last Updated**: 2026-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # j-sfu-meeting 基于 [zlm4j](https://gitee.com/aizuda/zlm4j) WebRTC 的 SFU 多人会议系统。 ## 技术栈 - **后端**: Spring Boot 2.7.12 + zlm4j 1.7.2 + Undertow (Java 8+) - **前端**: Vue 3 + TypeScript + Ant Design Vue 4 + Pinia - **媒体**: ZLMediaKit (via zlm4j JNI) — WebRTC SFU - **信令**: WebSocket + HTTP REST API ## 功能 - 创建/加入/离开会议室 - WebRTC 音视频通话 (SFU 模式,每人推1路拉N路) - 麦克风/摄像头开关控制 - 屏幕共享 - 文字聊天 - 实时白板(画笔/橡皮擦/矩形/圆形,多页支持) - 用户身份恢复(Token 重连机制) - 心跳检测与离线状态显示 - 结束会议(主持人专属,需确认) - 会议时长显示 - 多画面自适应布局 - 深色/浅色主题切换 ## 端口 | 服务 | 端口 | |------|------| | 后端 HTTP | 8899 | | 前端开发服务器 | 3000 | | ZLMediaKit HTTP | 7080 | | WebRTC UDP | 8000 | | RTSP | 7554 | | RTMP | 7935 | ## 快速开始 ### 前提条件 - JDK 8+ - Maven 3.6+ - Node.js 18+ - npm 9+ ### 启动后端 ```bash cd server mvn spring-boot:run ``` 后端启动后: - REST API: http://localhost:8899 - WebSocket: ws://localhost:8899/ws/meeting ### 启动前端 ```bash cd web npm install npm run dev ``` 前端访问: http://localhost:3000 ### 使用流程 1. 打开浏览器访问 http://localhost:3000 2. 输入用户名 3. 创建房间或输入房间号加入 4. 允许浏览器访问摄像头和麦克风 5. 开始会议 > **注意**: WebRTC 推流需要 HTTPS。开发环境 localhost 可使用 HTTP。 > 生产部署请配置 SSL 证书。 ## 项目结构 ``` j-sfu-meeting/ ├── server/ # 后端 Spring Boot 服务 │ ├── src/main/java/com/aizuda/meeting/ │ │ ├── JSfuMeetingApplication.java │ │ ├── config/ # 配置类 │ │ ├── context/ # zlm4j 初始化 │ │ ├── model/ # 数据模型 │ │ ├── service/ # 业务逻辑 │ │ ├── controller/ # REST API │ │ ├── websocket/ # WebSocket 信令 │ │ └── callback/ # zlm4j 回调 │ └── src/main/resources/ │ └── application.yml ├── web/ # 前端 Vue 3 应用 │ ├── src/ │ │ ├── api/ # API 调用 │ │ ├── services/ # WebRTC/WebSocket 服务 │ │ ├── views/ # 页面 │ │ ├── components/ # 组件 │ │ ├── stores/ # Pinia 状态管理 │ │ ├── utils/ # 工具函数 │ │ └── router/ # 路由 │ └── package.json ├── shared/ # 共享协议定义 │ ├── protocol.md # WebSocket 信令协议 │ └── api.md # REST API 文档 └── README.md ``` ## WebRTC 工作原理 ``` 参与者A ──push──> zlm4j(SFU) ──play──> 参与者B 参与者B ──push──> zlm4j(SFU) ──play──> 参与者A 参与者C ──push──> zlm4j(SFU) ──play──> 参与者A、B ``` - 每个参与者推1路音视频流到 zlm4j (type=push) - 每个参与者拉N路其他参与者的流 (type=play) - SDP 交换通过 POST /index/api/webrtc 完成 - 流标识: app=room/{roomId}, stream={userId} ## 信令协议 详见 [shared/protocol.md](shared/protocol.md) ## API 文档 详见 [shared/api.md](shared/api.md) ## 部署 详见 [DEPLOY.md](DEPLOY.md) 内网部署参考文档。 ## 白板权限 白板功能可由以下用户操作: 1. **主持人** (isHost = true) 2. **当前屏幕分享者** (screenSharing = true) 其他用户只能查看白板内容,无法绘制。 ## License MIT