首页  >  文章  >  后端开发  >  WebRTC python 服务器:Python 应用程序的 STUN/TURN 服务器

WebRTC python 服务器:Python 应用程序的 STUN/TURN 服务器

Linda Hamilton
Linda Hamilton原创
2024-11-18 00:09:02935浏览

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、6544、5928。

  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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn