想在 Python 里做 WebRTC?以前基本没什么好选择,要么用浏览器 API(只能前端),要么想办法绑定 C++ 库(各种坑)。aiortc 的出现改变了这个局面 - 纯 Python 实现的 WebRTC 库,基于 asyncio,用起来很舒服。
为什么 aiortc 值得试试?
如果你写过 JavaScript 的 WebRTC 代码,用 aiortc 会感觉很熟悉。它基本上就是把浏览器那套 API 搬到了 Python 里:
- JavaScript 的 Promise → Python 的 async/await
- 事件系统还是那个事件系统,只是换成了 Python 的写法
- API 设计几乎一样,学习成本很低
最重要的是,这是纯 Python 实现,不需要编译什么 C++ 库,pip install 就能用。
重要资源链接
- 📖 官方文档:https://aiortc.readthedocs.io/en/latest/
- 💻 GitHub 仓库:https://github.com/aiortc/aiortc
- 🔧 官方示例:https://github.com/aiortc/aiortc/tree/main/examples/server
和其他方案比起来怎么样?
以前的选择都不太理想
浏览器 WebRTC API
- 好处:功能完整,兼容性好
- 问题:只能在浏览器里跑,服务端就没戏了
libwebrtc 的 Python 绑定
- 好处:Google 官方的实现,功能强大
- 问题:编译麻烦,部署更麻烦,想改点东西基本不可能
aiortc 的优势在哪里?
代码好懂:纯 Python 写的,想看实现直接读源码就行,不像 C++ 那么复杂。
Python 生态加成:想做点有意思的功能很容易,比如:
- 用 OpenCV 做实时视频处理
- 接入机器学习模型做语音识别
- 和各种 Python 库无缝集成
部署简单:pip install 装完就能用,不用担心动态库依赖问题。
功能够不够用?
和 Chrome、Firefox 这些浏览器的兼容性没问题,该有的功能基本都有:
基本的 WebRTC 功能
- SDP 协商、ICE 连接这些标准流程都支持
- 数据通道可以发文本、二进制数据
- 音频:Opus、PCMU、PCMA 编解码器
- 视频:VP8、H.264 编解码器
- 加密传输:DTLS、SRTP 都有
一些实用特性
- 丢包重传(NACK)和关键帧请求(PLI)
- 可以直接操作 RTP/RTCP 数据包
- 支持录制到文件(IVF、MP4 等格式)
怎么装?
就一行命令:
pip install aiortc
装完就能用,不需要额外配置什么。如果遇到问题,看看 官方安装文档 应该能解决。
基本使用示例
1. 创建 RTCPeerConnection
import asyncio
from aiortc import RTCPeerConnection, RTCSessionDescription
async def create_connection():
# 创建 RTCPeerConnection 实例
pc = RTCPeerConnection()
# 添加事件监听器
@pc.on("connectionstatechange")
async def on_connectionstatechange():
print(f"连接状态: {pc.connectionState}")
return pc
2. 获取用户媒体
from aiortc import MediaStreamTrack
from aiortc.contrib.media import MediaPlayer
async def setup_media():
# 使用摄像头和麦克风
player = MediaPlayer('/dev/video0') # Linux 摄像头
# 或者使用文件
# player = MediaPlayer('video.mp4')
return player.audio, player.video
3. 创建 Offer 和 Answer
async def create_offer(pc):
# 添加音视频轨道
audio_track, video_track = await setup_media()
if audio_track:
pc.addTrack(audio_track)
if video_track:
pc.addTrack(video_track)
# 创建 offer
offer = await pc.createOffer()
await pc.setLocalDescription(offer)
return offer
async def handle_offer(pc, offer_sdp):
# 设置远程描述
offer = RTCSessionDescription(sdp=offer_sdp, type="offer")
await pc.setRemoteDescription(offer)
# 创建 answer
answer = await pc.createAnswer()
await pc.setLocalDescription(answer)
return answer
4. 数据通道使用
async def setup_data_channel(pc):
# 创建数据通道
channel = pc.createDataChannel("chat")
@channel.on("open")
def on_open():
print("数据通道已打开")
# 发送消息
channel.send("Hello from aiortc!")
@channel.on("message")
def on_message(message):
print(f"收到消息: {message}")
return channel
5. 完整的客户端示例
import asyncio
import json
from aiortc import RTCPeerConnection, RTCSessionDescription
from aiortc.contrib.signaling import BYE, add_signaling_arguments
async def run_client(signaling):
pc = RTCPeerConnection()
# 设置数据通道
channel = pc.createDataChannel("chat")
@channel.on("open")
def on_open():
print("数据通道已连接")
asyncio.ensure_future(send_messages(channel))
@channel.on("message")
def on_message(message):
print(f"收到: {message}")
# 创建 offer
await pc.setLocalDescription(await pc.createOffer())
# 通过信令服务器发送 offer
await signaling.send(pc.localDescription)
# 等待 answer
obj = await signaling.receive()
if isinstance(obj, RTCSessionDescription):
await pc.setRemoteDescription(obj)
# 保持连接
try:
await signaling.receive()
except KeyboardInterrupt:
pass
finally:
await pc.close()
async def send_messages(channel):
"""定期发送消息"""
for i in range(10):
message = f"消息 {i+1}"
channel.send(message)
print(f"发送: {message}")
await asyncio.sleep(2)
高级应用场景
1. 视频处理服务器
from aiortc.contrib.media import MediaRelay
import cv2
class VideoTransformTrack(MediaStreamTrack):
"""自定义视频处理轨道"""
def __init__(self, track):
super().__init__()
self.track = track
async def recv(self):
frame = await self.track.recv()
# 转换为 OpenCV 格式
img = frame.to_ndarray(format="bgr24")
# 应用图像处理(例如:边缘检测)
edges = cv2.Canny(img, 100, 200)
edges_colored = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
# 转换回 VideoFrame
new_frame = VideoFrame.from_ndarray(edges_colored, format="bgr24")
new_frame.pts = frame.pts
new_frame.time_base = frame.time_base
return new_frame
2. 录制和回放
from aiortc.contrib.media import MediaRecorder
async def record_session(pc):
# 创建录制器
recorder = MediaRecorder("recording.mp4")
@pc.on("track")
def on_track(track):
print(f"接收到轨道: {track.kind}")
recorder.addTrack(track)
# 开始录制
await recorder.start()
# ... 处理连接 ...
# 停止录制
await recorder.stop()
与其他 WebRTC 库的对比
| 特性 | aiortc | 浏览器 WebRTC | libwebrtc |
|---|---|---|---|
| 语言 | Python | JavaScript | C++ |
| 异步支持 | ✅ asyncio | ✅ Promise | ❌ |
| 代码可读性 | ✅ 高 | ✅ 中等 | ❌ 低 |
| 自定义处理 | ✅ 容易 | ❌ 受限 | ✅ 复杂 |
| 部署灵活性 | ✅ 服务器端 | ❌ 仅客户端 | ✅ 多平台 |
官方示例和学习资源
aiortc 提供了丰富的示例代码,帮助开发者快速上手:
GitHub 官方示例
访问 aiortc/examples/server 可以找到以下实用示例:
- 📹
webcam.py:网络摄像头流媒体服务器 - 🎵
audio.py:音频处理和传输示例 - 📊
datachannel.py:数据通道通信示例 - 🎬
player.py:媒体文件播放服务器 - 📺
server.py:完整的 WebRTC 服务器实现
快速运行示例
# 克隆仓库
git clone https://github.com/aiortc/aiortc.git
cd aiortc/examples/server
# 安装依赖
pip install -r requirements.txt
# 运行网络摄像头示例
python webcam.py
学习路径建议
- 入门阶段:从
datachannel.py开始,理解基本的数据通道通信 - 进阶阶段:学习
webcam.py,掌握音视频流处理 - 高级应用:研究
server.py,了解完整服务器架构 - 深入定制:基于示例代码开发自己的应用
社区和支持
- 📚 完整文档:aiortc.readthedocs.io
- 🐛 问题反馈:GitHub Issues
- 💬 讨论交流:GitHub Discussions
- 📦 PyPI 包:pypi.org/project/aiortc
总结
aiortc 为 Python 开发者提供了一个功能完整、易于使用的 WebRTC 实现。它的主要优势在于:
- 纯 Python 实现,易于理解和修改
- 基于 asyncio,充分利用异步编程优势
- 丰富的功能支持,涵盖音视频和数据传输
- 良好的扩展性,可以轻松集成 Python 生态系统
- 活跃的社区支持和持续的更新维护
- 完善的文档和示例,降低学习门槛
无论是学习 WebRTC 原理、构建原型应用,还是开发具有特殊需求的实时通信系统,aiortc 都是一个值得考虑的优秀选择。建议从 官方示例 开始,结合 完整文档 进行学习和开发。
标签
版权声明
本文由 WebRTC.link 创作,采用 CC BY-NC-SA 4.0 许可协议。本站转载文章会注明来源以及作者。如果您需要转载,请注明出处以及作者。



评论区
Giscus评论由 Giscus 驱动,基于 GitHub Discussions