首頁 > 後端開發 > Python教學 > WebRTC python 伺服器:Python 應用程式的 STUN/TURN 伺服器

WebRTC python 伺服器:Python 應用程式的 STUN/TURN 伺服器

Linda Hamilton
發布: 2024-11-18 00:09:02
原創
1012 人瀏覽過

Python 是一種通用且易於理解的程式語言,以其清晰的語法和可讀性而聞名

這使其成為建立 webrtc 應用程式的好選擇

我們可以使用 aiortc 等函式庫在 python 中建置 WebRTC 伺服器

主動脈庫

  • 純Python實作: 

    • aiortc 函式庫是 WebRTC 和 ORTC 的純 Python 實作。
    • 這表示您不需要依賴任何第三方函式庫或任何其他依賴項
  • 建於 asyncio : 

    • aiortc 建構在 python 自己的用於非同步連接的 asynciolibrary 之上。 
    • 從而讓您可以輕鬆處理多個並發連接
  • 媒體與資料管道:

    • 該程式庫提供對視訊、音訊以及資料通道的支持,從而實現廣泛的即時通訊功能。
  • 易於整合:

    • aiortc 可以輕鬆地與其他 Python 程式庫(例如用於 Web 伺服器的 aiohttp)以及其他第三方程式庫(例如用於即時事件處理的 socket.io)整合
  • 豐富的文件和範例:

    • 庫 aiortc 附帶了豐富的文件和不同的範例,可以幫助您快速入門

使用 Python 設定 WebRTC 伺服器

先決條件

  1. 已安裝 Python 3.x:

    1. 確保您的電腦或伺服器上安裝了 Python 3.x。你可以像這樣檢查python版本  
python3 --version
登入後複製
登入後複製
  1. 非同步程式設計基礎:

    1. 您需要了解非同步程式設計如何運作的基本知識。 
    2. 我們將在本文中使用非同步程式庫,這對於同時連接和資料流非常重要

安裝必要的庫 

使用 pip 安裝 aiortc 和其他相依性

aiortc 是 webrtcand ORTC 的純 Python 實作。它使用Python語言的非同步特性來處理即時通訊

像這樣使用 pip 安裝函式庫

pip install aiortc aiohttp
登入後複製
登入後複製
  • aiorrtc 提供核心 WebRTC 功能

  • aiohttp 是一個非同步 HTTP 用戶端/伺服器框架,我們將使用此框架進行訊號傳輸

開發伺服器

WebRTC python server: STUN/TURN servers for your python app

使用 WebSocket 設定訊號

  1. 使用 WebSocket 設定訊號

WebRTC 需要一個訊號機制來建立連線。 

WebRTC 透過在對等點之間交換 SDP 或會話描述以及 ICE 候選來實現此目的

為此,你可以使用任何東西。在本文中,我們將使用 WebSocket 進行客戶端和伺服器之間的即時雙向通訊

訊號設定(伺服器代碼)

python3 --version
登入後複製
登入後複製
  1. 處理對等連線與媒體串流

在這裡,我們將建立 RTCPeerConnection 物件來管理連線和媒體串流

伺服器程式碼範例(對等連線)

pip install aiortc aiohttp
登入後複製
登入後複製

WebRTC python server: STUN/TURN servers for your python app

  1. 將 TURN 伺服器合併到 ICE 設定中 

為了處理 NAT 穿越並確保連接,我們需要 TURN 伺服器。

在本文中,我們將使用計量 TURN 伺服器。 Metered 是 TURN 伺服器的全球供應商

您可以在計量 TURN 伺服器上註冊免費計劃,該計劃提供每月 50 GB 的 TURN 伺服器配額,並且還提供付費計劃

步驟:

  • 取得憑證

註冊Metered.ca/stun-turn並取得您的 TURN 憑證

在儀表板上按一下「按一下此處產生您的第一個憑證」按鈕以建立新的 TURN 伺服器憑證

WebRTC python server: STUN/TURN servers for your python app

然後按一下「說明」按鈕即可取得您的 ICE 伺服器陣列。

WebRTC python server: STUN/TURN servers for your python app

您也可以使用 api 金鑰來啟用 TURN 伺服器

  • 設定 ICE 伺服器
import asyncio
from aiohttp import web
import json

async def index(request):
    with open('index.html', 'r') as f:
        content = f.read()
    return web.Response(text=content, content_type='text/html')

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)
    # Handle incoming WebSocket messages here
    return ws

app = web.Application()
app.router.add_get('/', index)
app.router.add_get('/ws', websocket_handler)

web.run_app(app)
登入後複製
  1. 說明關鍵步驟的程式碼範例

這是我們如何整合這裡的一切

from aiortc import RTCPeerConnection, RTCSessionDescription

pcs = set()  # Keep track of peer connections

async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    pc = RTCPeerConnection()
    pcs.add(pc)

    @pc.on("datachannel")
    def on_datachannel(channel):
        @channel.on("message")
        async def on_message(message):
            # Handle incoming messages
            pass

    async for msg in ws:
        if msg.type == web.WSMsgType.TEXT:
            data = json.loads(msg.data)

            if data["type"] == "offer":
                await pc.setRemoteDescription(RTCSessionDescription(
                    sdp=data["sdp"], type=data["type"]))
                answer = await pc.createAnswer()
                await pc.setLocalDescription(answer)
                await ws.send_json({
                    "type": pc.localDescription.type,
                    "sdp": pc.localDescription.sdp
                })

            elif data["type"] == "candidate":
                candidate = data["candidate"]
                await pc.addIceCandidate(candidate)
        elif msg.type == web.WSMsgType.ERROR:
            print(f'WebSocket connection closed with exception {ws.exception()}')

    pcs.discard(pc)
    return ws
登入後複製

實際實施技巧

網路注意事項

  1. 使用 Metered.ca STUN/TURN 伺服器管理 NAT 遍歷
  • STUN 伺服器: 這些伺服器可協助 NAT 後方的用戶端裝置了解自己的 IP 位址和連接埠號碼。要了解有關 STUN 伺服器的更多信息,請訪問 Stun 伺服器:什麼是 NAT 的會話遍歷實用程式?

  • TURN 伺服器: 當因 NAT 或防火牆規則而無法進行直接通訊時,TURN 伺服器會在對等點之間中繼流量。要了解有關 TURN 伺服器的更多信息,請訪問:什麼是 TURN 伺服器?

  1. 確保可靠且低延遲的連線
  • 自動地理路由: Metered.ca 具有自動地理路由

效能最佳化 

  1. 使用 asyncio 進行同時管理

  2. 媒體串流管理最佳實務

WebRTC python server: STUN/TURN servers for your python app

  1. API: 使用強大的 API 進行 TURN 伺服器管理。您可以執行以下操作:透過 API 新增/刪除憑證、透過 API 檢索每個使用者/憑證和使用者指標、透過 API 啟用/停用憑證、透過 API 按日期檢索使用資料。

  2. 全球地理位置定位:自動將流量定向到最近的伺服器,以實現盡可能低的延遲和最高的品質效能。全球任何地方的延遲均低於 50 毫秒

  3. 全球所有地區的伺服器:多倫多、邁阿密、舊金山、阿姆斯特丹、倫敦、法蘭克福、班加羅爾、新加坡、雪梨、首爾、達拉斯、紐約

  4. 低延遲: 低於 50 毫秒的延遲,在世界任何地方。

  5. 經濟高效:即用即付定價,並提供頻寬和批量折扣。

  6. 輕鬆管理: 取得使用日誌、帳戶達到門檻限制時的電子郵件、帳單記錄以及電子郵件和電話支援。

  7. 符合標準: 符合 UDP、TCP、TLS 和 DTLS 的 RFC 5389、5769、5780、5766、6062、6156、5245、5768、6336、925336、92536、92536、92536。

  8. 多租用戶: 建立多個憑證並依客戶或不同應用程式分開使用。取得使用日誌、計費記錄和閾值警報。

  9. 企業可靠性: SLA 正​​常運作時間達 99.999%。

  10. 企業規模: 併發流量或總流量不限制。計量 TURN 伺服器提供企業可擴充性

  11. 每月 5 GB 免費: 透過免費方案每月獲得 5 GB 免費 TURN 伺服器使用量

  12. 在連接埠 80 和 443 上運作

  13. 支援 TURNS SSL 以允許透過深度封包偵測防火牆進行連線。

  14. 同時支援 TCP 和 UDP

  15. 免費無限制 STUN

以上是WebRTC python 伺服器:Python 應用程式的 STUN/TURN 伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板