aiortc

Abstract

Python WebRTC 库 aiortc

Authors

Walter Fan

Status

v1.0

Updated

2026-03-20

概述

aiortc 是一个纯 Python 实现的 WebRTC 和 ORTC 库,基于 asyncio 异步框架构建。 它的 API 紧密对应 JavaScript WebRTC API,同时使用 Python 风格的语法:

  • Promise → async/await 协程

  • Event → pyee.EventEmitter

aiortc 非常适合以下场景:

  • 服务器端 WebRTC(媒体录制、转码、AI 处理)

  • 自动化测试(模拟 WebRTC 客户端)

  • 快速原型验证

主要特性

  • SDP 生成与解析

  • ICE 连接建立(支持 half-trickle 和 mDNS)

  • DTLS 密钥生成与握手

  • SRTP 加解密

  • 纯 Python SCTP 实现

  • DataChannel

  • 音频编解码(Opus / PCMU / PCMA)

  • 视频编解码(VP8 / H.264)

  • RTCP 反馈(NACK / PLI)

安装

pip install aiortc

# 带视频处理支持
pip install aiortc opencv-python

# 带 Web 服务器支持(用于信令)
pip install aiortc aiohttp

基本用法

建立 P2P 连接(Offer 端)

import asyncio
from aiortc import RTCPeerConnection, RTCSessionDescription
from aiortc.contrib.media import MediaPlayer

async def run():
    pc = RTCPeerConnection()

    # 添加本地媒体轨道
    player = MediaPlayer('/dev/video0', format='v4l2',
                          options={'video_size': '640x480'})
    if player.audio:
        pc.addTrack(player.audio)
    if player.video:
        pc.addTrack(player.video)

    # 创建 Offer
    offer = await pc.createOffer()
    await pc.setLocalDescription(offer)

    # 将 offer.sdp 发送给对端...
    # 收到 answer 后:
    # await pc.setRemoteDescription(
    #     RTCSessionDescription(sdp=answer_sdp, type='answer'))

    # 保持运行
    await asyncio.sleep(3600)

asyncio.run(run())

接收远端轨道

from aiortc.contrib.media import MediaRecorder

recorder = MediaRecorder('output.mp4')

@pc.on('track')
async def on_track(track):
    if track.kind == 'video':
        recorder.addTrack(track)
        await recorder.start()

# 结束时
await recorder.stop()

DataChannel

# 创建 DataChannel
channel = pc.createDataChannel('chat')

@channel.on('open')
def on_open():
    channel.send('Hello from Python!')

@channel.on('message')
def on_message(message):
    print(f'Received: {message}')

# 接收对端创建的 DataChannel
@pc.on('datachannel')
def on_datachannel(channel):
    @channel.on('message')
    def on_message(message):
        channel.send(f'echo: {message}')

视频处理示例

结合 OpenCV 对接收的视频帧进行处理:

from aiortc import VideoStreamTrack
from av import VideoFrame
import cv2
import numpy as np

class VideoTransformTrack(VideoStreamTrack):
    """对收到的视频帧进行边缘检测"""

    def __init__(self, track):
        super().__init__()
        self.track = track

    async def recv(self):
        frame = await self.track.recv()
        img = frame.to_ndarray(format='bgr24')

        # OpenCV 边缘检测
        edges = cv2.Canny(img, 100, 200)
        edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)

        new_frame = VideoFrame.from_ndarray(edges_bgr, format='bgr24')
        new_frame.pts = frame.pts
        new_frame.time_base = frame.time_base
        return new_frame

# 将处理后的轨道发回对端
@pc.on('track')
async def on_track(track):
    if track.kind == 'video':
        pc.addTrack(VideoTransformTrack(track))

架构说明

aiortc 内部结构:

RTCPeerConnection
├── RTCDtlsTransport     ← DTLS 握手与密钥导出
│   └── RTCIceTransport  ← ICE 连通性检查
├── RTCRtpSender         ← RTP 发送(编码 + SRTP)
├── RTCRtpReceiver       ← RTP 接收(SRTP + 解码)
├── RTCSctpTransport     ← SCTP over DTLS
│   └── RTCDataChannel   ← 数据通道
└── SDP 协商逻辑

aiortc 的所有网络 I/O 都通过 asyncio 事件循环驱动, 单线程即可处理多个并发连接。

参考资料