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

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

Nov 18, 2024 am 12:09 AM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在Linux终端中使用python --version命令时如何解决权限问题? 在Linux终端中使用python --version命令时如何解决权限问题? Apr 02, 2025 am 06:36 AM

Linux终端中使用python...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

如何绕过Investing.com的反爬虫机制获取新闻数据? 如何绕过Investing.com的反爬虫机制获取新闻数据? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...

Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Python 3.6加载pickle文件报错ModuleNotFoundError: No module named '__builtin__'怎么办? Apr 02, 2025 am 06:27 AM

Python3.6环境下加载pickle文件报错:ModuleNotFoundError:Nomodulenamed...

使用Scapy爬虫时,管道文件无法写入的原因是什么? 使用Scapy爬虫时,管道文件无法写入的原因是什么? Apr 02, 2025 am 06:45 AM

使用Scapy爬虫时管道文件无法写入的原因探讨在学习和使用Scapy爬虫进行数据持久化存储时,可能会遇到管道文�...

See all articles