Skip to content

Repository files navigation

Python WebRTC logo

Chrome's WebRTC engine, with the browser API, in Python.

Documentation • Quickstart • Examples • PyPI


Python WebRTC binds libwebrtc M152, the engine inside Chrome, and exposes it through the W3C APIs you already know from the browser: RTCPeerConnection, data channels, tracks, WebCodecs frames, encoded transforms and stats. Talk to browsers, servers, SFUs and AI agents peer-to-peer, with no vendor service in between.

pip install wrtc

If you know it in JavaScript, you know it in Python

BrowserPython
const pc = new RTCPeerConnection();
const channel = pc.createDataChannel('chat');
channel.onopen = () => channel.send('Hello!');
channel.onmessage = (e) => console.log(e.data);
pc.onicecandidate = (e) => signaling.send(e.candidate);

const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
signaling.send(pc.localDescription);
pc = webrtc.RTCPeerConnection()
channel = pc.create_data_channel('chat')
channel.on('open', lambda e: channel.send('Hello!'))
channel.on('message', lambda e: print(e.data))
pc.on('icecandidate', lambda e: signaling.send(e.candidate))

offer = await pc.create_offer()
await pc.set_local_description(offer)
signaling.send(pc.local_description)

Names follow the specifications in snake_case, and the camelCase originals (createOffer) work too. Enums compare equal to the strings of the specification, dictionaries are typed dataclasses, and everything is asyncio.

Highlights

  • 🌐 The real engine. ICE, DTLS, SCTP, congestion control, jitter buffers and codecs are Chrome's own, so interop with browsers is the browsers' interop.
  • 🧩 The browser API. Written against the W3C specifications and tested with the web-platform-tests the browsers use.
  • 🎞️ Every modern codec. VP8, VP9, AV1, H.264 and Opus. Hardware H.264 through VideoToolbox on macOS.
  • ⚡ Native media path. Packets, decoding and encoding never touch Python. You see frames, not packets.
  • 🖼️ Frames in, frames out. MediaStreamTrackProcessor, VideoTrackGenerator and MediaStreamTrackGenerator with WebCodecs' VideoFrame and AudioData, piped through WHATWG Streams.
  • 🔐 Encoded transforms. RTCRtpScriptTransform and end-to-end encryption with SFrame.
  • 🚀 Fast connection setup. WARP: DTLS 1.3, SNAP and SPED cut round trips off every new connection.
  • 📦 pip install and go. Prebuilt wheels for Linux, macOS and Windows, CPython 3.9–3.15, including free-threaded 3.14t and 3.15t. Nothing else to install.
  • 🏷️ Typed. Full type stubs, so your editor knows every interface, dictionary and event.

How it compares

Python WebRTC aiortc LiveKit SDK GStreamer webrtcbin
Engine libwebrtc (Chrome's) own, in Python libwebrtc own, in C
Connects peer-to-peer to any WebRTC endpoint ✅ ✅ ❌ needs a LiveKit server ✅
Browser API (RTCPeerConnection, createOffer, …) ✅ similar ❌ rooms ❌ GObject signals
Media path native Python native native
VP9 and AV1 ✅ ❌ ✅ ✅
pip install on Linux, macOS and Windows ✅ ✅ ✅ ❌ system packages

Codecs

Linux and Windows macOS
Video VP8, VP9, AV1, H.264 with OpenH264 VP8, VP9, AV1, H.264 with VideoToolbox
Audio Opus, G.722, G.711 Opus, G.722, G.711

No H.264 implementation is built into the package. webrtc.openh264.install() downloads Cisco's binary on the user's device, under Cisco's patent license.

Platforms

Prebuilt wheels for CPython 3.9–3.15, and free-threaded 3.14t and 3.15t, on:

Linux macOS Windows
x86_64 and aarch64 (glibc 2.27+, manylinux) 13+, Intel and Apple Silicon x64

Elsewhere pip builds it from sources with CMake and a C++20 compiler. See CONTRIBUTING.md.

Examples

Complete programs, ready to copy. The ones with dependencies declare them inline, so uv run needs nothing installed.

uv run https://raw.githubusercontent.com/MarshalX/python-webrtc/main/examples/janus_streaming.py

Status

Pre-1.0: the API follows the specifications, but compatibility between versions isn't guaranteed until 1.0.0. See the changelog.

Getting help

Contributing

Contributions of any size are welcome. CONTRIBUTING.md covers the development setup, building from sources, releasing and updating libwebrtc.

License

Python WebRTC is published under the BSD 3-Clause License.

Releases

Sponsor this project

Used by

Contributors

Languages