跳至主要内容

微語會議 Meet 升級:統一會議帶來視訊會議、螢幕共享與主持人錄製

· 閱讀時間約 7 分鐘
Jack Ning
Maintainer of Bytedesk

繼 0.1.0 Preview 音訊會議之後,微語會議(Bytedesk Meet)完成了一次重要的統一會議升級:現在每一場會議都是「音訊優先」的視覺化會議——預設純音訊加入,不打擾攝影機;需要時,任何參與者都可以隨時開啟自己的攝影機或共享螢幕;主持人還可以一鍵錄製會議。建立會議不再區分音訊/視訊類型,所有能力都透過會議介面底部工具列按需提供。

本文介紹本次升級包含的能力、介面佈局、技術架構與快速開始方式。

線上演示​

微語會議用戶端:會議室列表

本次升級包含什麼​

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 VideoRoomSFU 媒體轉發、會議室管理、參與者事件;multistream 多流訂閱
瀏覽器WebRTC + janus-gateway JS SDK純音訊發布起步,replaceTracks 按需升級/切換視訊軌
資料通道publisher data channel廣播 media-state,讓觀看端區分攝影機與螢幕畫面
後端modules/webrtc + enterprise/webrtcRoomEntity、ParticipantEntity、MeetingRecordingEntity 與 REST API
前端frontend/apps/meetVideoRoomClient 統一會議用戶端、會議介面、錄製管理頁

幾個關鍵設計:

  • 會議號穩定映射:邀請碼 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. 開始第一次視訊會議​

  1. 登入 meet,建立會議室並複製邀請連結傳送給同事(也可在「通訊錄」中選擇同事或群組一鍵發起會議)
  2. 同事開啟連結、登入後加入會議,允許麥克風即可通話(預設純音訊,不會請求攝影機)
  3. 需要時點擊底部工具列「開啟攝影機」或「共享螢幕」
  4. 主持人可點擊「開始錄製」,停止後在 meet 控制台的「錄製」頁面回看

加入會議

提示:麥克風、攝影機與螢幕共享均要求安全上下文(HTTPS 或 localhost)。區域網路 IP + HTTP 存取時,meet 會給出明確指引;正式環境建議透過 nginx 反向代理提供 HTTPS + WSS。

路線圖​

  • 伺服器端整場錄製(Janus 伺服器端混錄 + 後處理)
  • 會議密碼、主持人強控(全體靜音、移除參會者)
  • 預定會議與快速會議
  • 螢幕共享子母畫面(共享 + 攝影機同框)
  • 參會即時統計、行動端

相關連結​