微語會議 Meet 升級:統一會議帶來視訊會議、螢幕共享與主持人錄製
· 閱讀時間約 7 分鐘
繼 0.1.0 Preview 音訊會議之後,微語會議(Bytedesk Meet)完成了一次重要的統一會議升級:現在每一場會議都是「音訊優先」的視覺化會議——預設純音訊加入,不打擾攝影機;需要時,任何參與者都可以隨時開啟自己的攝影機或共享螢幕;主持人還可以一鍵錄製會議。建立會議不再區分音訊/視訊類型,所有能力都透過會議介面底部工具列按需提供。
本文介紹本次升級包含的能力、 介面佈局、技術架構與快速開始方式。
線上演示
- 會議用戶端演示:https://www.weiyuai.cn/meet/
- 會議管理後台演示:https://www.weiyuai.cn/meetadmin

本次升級包含什麼
1. 統一會議:音訊優先,視訊按需
- 所有會議統一使用 Janus VideoRoom 外掛承載,預設只擷取麥克風加入會議,進入頁面不會彈出攝影機授權
- 建立會議室無需選擇媒體類型,進入會議後隨時可升級為視訊會議
- 單一會議預設支援最多 24 路同時發布(音視訊),建立會議時可選擇 6/12/24 人容量檔位(可擴展)
2. 攝影機:頭像列表 + 小視訊窗
會議主區不再是大視訊宮格,而是清爽的參與者頭像列表:
- 任何參與者可隨時開關自己的攝影機,開啟後畫面出現在其頭像旁的小視訊窗中,主區佈局保持不變
- 透過發布者資料通道廣播
media-state(camera / screen / none),觀看端能準確區分對方推送的是攝影機畫面還是螢幕畫面 - 中途加入的參會者也能透過狀態重發機制獲得正確的媒體狀態
3. 螢幕共享:獨立視窗,人人可共享
- 任何參與者都可以共享整個螢幕或某個視窗,共享期間自動替換自己的攝影機畫面
- 共享內容在獨立的浮層視窗中展示,不擠佔會議主區
- 關閉共享視窗只是隱藏,共享不會中斷;點擊共享者頭像上的「正在共享」角標可隨時重新開啟視窗
- 透過工具列按鈕或瀏覽器原生「停止共享」結束共享,自動恢復攝影機或移除視訊軌
4. 主持人錄製
- 錄製按鈕僅主持人(會議室建立者)可見,後端同樣強制校驗,非主持人直接呼叫上傳介面會被拒絕
- 主持人以本地視角錄製(瀏覽器 MediaRecorder):錄到自己的麥克風、攝影 機或正在共享的螢幕
- 錄製期間切換視訊來源(如攝影機切換到螢幕共享)會自動分段上傳,避免成品中途黑屏
- 停止錄製或離開會議時自動上傳並建立錄製索引,無需手動儲存
5. 會議錄製管理
- 新增
bytedesk_webrtc_meeting_recording表與一步式上傳介面:主持人校驗、檔案落盤、建立索引一次完成 - 錄製檔案按 年/月/日 目錄儲存在
bytedesk.webrtc.meeting.record.dir(預設uploads/webrtc-meeting-recordings) - meet 控制台「錄製」頁面:按會議室查詢錄製列表、鑑權播放/下載、主持人刪除;進入頁面自動選中最近會議室並查詢,錄製完成即可看到記錄
- meetAdmin 管理後台新增「會議錄製」頁面:組織維度分頁展示(檔名/會議室/狀態/時長/大小/格式/錄製時間),支援鑑權播放與下載(
MEETING_RECORDING_READ角色權限控制) - 上傳限制:僅允許 webm/mp4 等瀏覽器錄製格式,單檔最大 500MB

6. 通訊錄一鍵發起會議
meet 新增通訊錄頁面(佈局參考 desktop:左側分類 + 右側列表):
- 組織成員:搜索、分頁載入 ,點擊成員查看詳情(職位/工號/聯絡方式),一鍵發起一對一會議
- 我的群組:按群組一鍵發起會議,會議室自動以群組名命名
- 發起即建立會議室並自動複製邀請連結,彈窗可一鍵「進入會議」,連結發給同事即可加入

7. 主鏈路與體驗保留
- 「建立會議 - 分享連結 - 加入會議 - 參會記錄」主鏈路保持不變,參會記錄(CDR 式)繼續自動留存
- 麥克風權限預檢、非安全上下文指引等 0.1.0 的能力全部保留,並對攝影機/螢幕共享提供同樣的可操作提示
8. 其他修復
- 修復 1:1 通話預設在 Janus 伺服器端開啟
.mjr錄製的隱患:現在預設不錄製,明確請求錄製時才開啟 - meet 前端繼續支援簡體中文、繁體中文、English 三種語言
介面一覽
+------------------------------------------------------+
| 會議主區(預設無大視訊) |
| [頭像+名字] [頭像+小視訊窗] [頭像+名字] ... |
| +------------------+ |
| | 獨立共享視窗(浮層)| |
| | XX 的螢幕 · 共享中 | |
| +------------------+ |
+------------------------------------------------------+
| 工具列:麥克風 攝影機 共享螢幕 錄製(主持人) 參與者 連結 離開 |
+------------------------------------------------------+

技術 架構
「瀏覽器直連 Janus WebSocket」的架構保持不變,會議承載從 AudioBridge 切換到 VideoRoom,後端仍不做信令轉發:
| 層次 | 組成 | 說明 |
|---|---|---|
| 媒體層 | Janus VideoRoom | SFU 媒體轉發、會議室管理、參與者事件;multistream 多流訂閱 |
| 瀏覽器 | WebRTC + janus-gateway JS SDK | 純音訊發布起步,replaceTracks 按需升級/切換視訊軌 |
| 資料通道 | publisher data channel | 廣播 media-state,讓觀看端區分攝影機與螢幕畫面 |
| 後端 | modules/webrtc + enterprise/webrtc | RoomEntity、ParticipantEntity、MeetingRecordingEntity 與 REST API |
| 前端 | frontend/apps/meet | VideoRoomClient 統一會議用戶端、會議介面、錄製管理頁 |
幾個關鍵設計:
- 會議號穩定映射:邀請碼
inviteUid透過穩定雜湊映射為 VideoRoom 會議室號;建立房間時明確record:false(不在伺服器端留.mjr)、publishers=6、視訊碼率1024000 - 音訊優先發布:加入後僅發布音訊軌並保留只收視訊 m-line,開攝影機/共享螢幕時
replaceTracks+ 重新協商,失敗自動回滾 - 錄製邊界:本期錄製的是主持人本地視角(主持人所看所聽);伺服器端整場混錄(Janus
.mjr+janus-pp-rec後處理)在路線圖中 - 安全邊界:錄製上傳介面從登入態取人並校驗主持人身分;錄製檔案路徑限定在儲存根目錄內;播放/下載需具備會議室可見性(主持人/同組織/參與過)
快速開始
1. 啟動 Janus 媒體伺服器
cd deploy/docker
./start.sh webrtc
2. 啟動微語後端
按常規方式啟動 starter(預設已開啟 bytedesk.webrtc.janus.enabled=true,並設定了 Janus WS 位址與 ICE 伺服器)。
3. 啟動 meet 前端
cd frontend
pnpm install
turbo dev --filter=meet
4. 開始第一次視訊會議
- 登入 meet,建立會議室並複製邀請連結傳送給同事(也可在「通訊錄」中選擇同事或群組一鍵發起會議)
- 同事開啟連結、登入後加入會議,允許麥克風即可通話(預設純音訊,不會請求攝影機)
- 需要時點擊底部工具列「開啟攝影機」或「共享螢幕」
- 主持人可點擊「開始錄製」,停止後在 meet 控制台的「錄製」頁面回看

提示:麥克風、攝影機與螢幕共享均要求安全上下文(HTTPS 或 localhost)。區域網路 IP + HTTP 存取時,meet 會給出明確指引;正式環境建議透過 nginx 反向代理提供 HTTPS + WSS。
路線圖
- 伺服器端整場錄製(Janus 伺服器端混錄 + 後處理)
- 會議密碼、主持人強控(全體靜音、移除參會者)
- 預定會議與快速會議
- 螢幕共享子母畫面(共享 + 攝影機同框)
- 參會即時統計、行動端
