Documentation β’ Quickstart β’ Examples β’ Benchmarks β’ 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 wrtcComing from aiortc? Install
wrtc[aiortc], changefrom aiortctofrom webrtc.aiortc, and your code runs on Chrome's engine. See Migrating from aiortc.
| Browser | Python |
|---|---|
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.
- π 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,VideoTrackGeneratorandMediaStreamTrackGeneratorwith WebCodecs'VideoFrameandAudioData, piped through WHATWG Streams. - π Encoded transforms.
RTCRtpScriptTransformand end-to-end encryption with SFrame. - π Fast connection setup. WARP: DTLS 1.3, SNAP and SPED cut round trips off every new connection.
- π¦
pip installand 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.
| 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 |
β | β | β | β no Linux wheels |
Against aiortc, it opens connections 7.3β8.3x faster, moves 7.7β14.6x more data through a data channel and spends less CPU on audio. See the benchmarks, which also measure Pion, libdatachannel and webrtc-rs.
The full comparison, and when another library is the better choice: Choosing a Python WebRTC library.
| 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.
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.
Complete programs, ready to copy. The ones with dependencies declare them inline, so uv run needs nothing installed.
- π€ Voice chat with OpenAI GPT-Live: talk to the model through your microphone and speakers. No server, just an API key.
- πΊ Live stream in the terminal: watch a public Janus stream as colored characters, with the audio on your speakers.
- π Echo peer: send the received video back in grayscale.
- πΎ Recorder: write received video and audio to files.
uv run https://raw.githubusercontent.com/MarshalX/python-webrtc/main/examples/janus_streaming.pyPre-1.0: the API follows the specifications, but compatibility between versions isn't guaranteed until 1.0.0. See the changelog.
- π Documentation: quickstart, guides and the API reference.
- π Report a bug or request a feature.
- π¬ Ask a question.
Contributions of any size are welcome. CONTRIBUTING.md covers the development setup, building from sources, releasing and updating libwebrtc.
Python WebRTC is published under the BSD 3-Clause License.