# nuxt-WebRTC **Repository Path**: wux-labs/nuxt-WebRTC ## Basic Information - **Project Name**: nuxt-WebRTC - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-10 - **Last Updated**: 2025-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Nuxt WebRTC


Landing Page Screenshot

## 介紹 為了學習WebRTC所做的專案,能夠: - 一對一視訊連線 - 切換鏡頭 / 麥克風 / 喇叭 - 使用連結 / Room ID / QRCode加入房間 - 跨裝置使用(響應式設計) ## Tech Stack - [Nuxt](https://github.com/nuxt/nuxt) - [Pinia](https://github.com/vuejs/pinia) - [UnoCSS](https://github.com/unocss/unocss) - [peerjs](https://github.com/peers/peerjs) - [Headlees UI](https://github.com/tailwindlabs/headlessui) - [node-qrcode](https://github.com/soldair/node-qrcode) ## 目標 1. 取得使用者的影像與聲音(getUserMedia) - [x] 取得鏡頭與麥克風權限 - [x] 顯示鏡頭畫面 - [x] 切換鏡頭 / 麥克風 - [x] 切換喇叭 2. 透過WebRTC傳送影像與聲音 - [x] Signaling: - 建立和管理通信會話時,瀏覽器之間進行通信的過程 - 傳輸的資訊為SDP (Session Description Protocol) - 可以用Socket.io/peerjs/Firebase來實作 - [x] 建立RTCPeerConnection - [x] 使用peerjs來實作 3. 優化介面 - [x] landing page - [x] Room page - [x] 顯示房間狀態(房間是否存在) - [x] 顯示分享按鈕 - [x] 複製連結 - [x] 使用新的tab開啟 - [x] 使用QR code - [x] 顯示對方狀態 - [x] RWD ## 相關名詞解釋 與開發無關,跟WebRTC底層技術較相關的一些名詞筆記 - ICE (Interactive Connectivity Establishment) - 用來建立P2P連線的協定 - 用來應對NAT與防火牆的問題 - 透過STUN/TURN伺服器來取得IP位址 - 使用SDP來交換資訊 - STUN (Session Traversal Utilities for NAT) - 用於檢查和獲取設備的公共IP地址和端口 - TURN (Traversal Using Relays around NAT) - 當STUN無法取得IP時,會透過TURN來進行中轉 - NAT (Network Address Translation) - 網路位址轉換 - 用來解決IP位址不足的問題 - 會造成P2P連線的問題(因為IP位址不是公開的) ## 問題研究 以下是過程中遇到的問題,以及後來的解決辦法 - 如何在切換鏡頭時,不會造成畫面閃爍 - 靈感:google meet的做法是,使用2個重疊的video,並且透過交替切換 `display: none` 來達成 - 解決辦法:將最後一刻的畫面畫在canvas上,然後先顯示canvas,將videoTrack換掉之後,再把canvas隱藏起來 - 如何不造成傳輸停止的情況下,切換鏡頭/麥克風 - 解決辦法: - 先創建一個新的`MediaStream`,並依照鏡頭/麥克風取得對應的track - 本地端(使用者自己看到的畫面):使用 `addTrack` 來新增track,並且使用 `removeTrack` 來移除舊的track - 遠端:使用 `replaceTrack` 來替換舊的track [參考](https://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/replaceTrack) - 如何切換顯示/關閉自己的鏡頭與麥克風 - 解決辦法:使用`MediaStreamTrack`的`enabled` 來控制 [參考](https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack/enabled) - 在Chrome使用不同分頁互相連線時,就算關閉一個分頁,也不會關閉與其他分頁的連線(跨瀏覽器/裝置則正常) - 解決辦法:使用`setInterval`來定時檢查對方影像的狀態,如果對方`videoTrack`的狀態為`muted`,則關閉連線(此為特殊情況)