Giter VIP home page Giter VIP logo

nuxt-webrtc's Introduction

Nuxt WebRTC


Landing Page Screenshot

介紹

為了學習WebRTC所做的專案,能夠:

  • 一對一視訊連線
  • 切換鏡頭 / 麥克風 / 喇叭
  • 使用連結 / Room ID / QRCode加入房間
  • 跨裝置使用(響應式設計)

Tech Stack

目標

  1. 取得使用者的影像與聲音(getUserMedia)
    • 取得鏡頭與麥克風權限
    • 顯示鏡頭畫面
    • 切換鏡頭 / 麥克風
    • 切換喇叭
  2. 透過WebRTC傳送影像與聲音
    • Signaling:
      • 建立和管理通信會話時,瀏覽器之間進行通信的過程
      • 傳輸的資訊為SDP (Session Description Protocol)
      • 可以用Socket.io/peerjs/Firebase來實作
    • 建立RTCPeerConnection
    • 使用peerjs來實作
  3. 優化介面
    • landing page
    • Room page
      • 顯示房間狀態(房間是否存在)
      • 顯示分享按鈕
        • 複製連結
        • 使用新的tab開啟
        • 使用QR code
      • 顯示對方狀態
    • 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 參考
  • 如何切換顯示/關閉自己的鏡頭與麥克風

    • 解決辦法:使用MediaStreamTrackenabled 來控制 參考
  • 在Chrome使用不同分頁互相連線時,就算關閉一個分頁,也不會關閉與其他分頁的連線(跨瀏覽器/裝置則正常)

    • 解決辦法:使用setInterval來定時檢查對方影像的狀態,如果對方videoTrack的狀態為muted,則關閉連線(此為特殊情況)

nuxt-webrtc's People

Contributors

tomatoguy0502 avatar

Stargazers

cn3c3p avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.