Janus WebRTC Server Python async client.
Install
pip install janus-client
Requires Python >=3.8 <3.14
Description
Easily send and share WebRTC media through Janus WebRTC server.
This client is using aiortc for WebRTC communication and subsequently PyAV for media stack.
✅ Features ✅
- Connect to Janus server using:
- Websocket
- HTTP
- Authentication with shared static secret (API key) and/or stored token
- Support Admin/Monitor API:
- Generic requests
- Configuration related requests
- Token related requests
- Support Janus plugins:
- EchoTest plugin
- VideoCall plugin (Please refer to eg_videocall_in.py and eg_videocall_out.py)
- VideoRoom plugin
- TextRoom plugin
- Simple interface
- Minimum dependency
- Extendable Janus transport
Examples
Simple Connect And Disconnect
import asyncio
from janus_client import JanusSession, JanusEchoTestPlugin, JanusVideoRoomPlugin
# Protocol will be derived from base_url
base_url = "wss://janusmy.josephgetmyip.com/janusbasews/janus"
# OR
base_url = "https://janusmy.josephgetmyip.com/janusbase/janus"
session = JanusSession(base_url=base_url)
plugin_handle = JanusEchoTestPlugin()
# Attach to Janus session
await plugin_handle.attach(session=session)
# Destroy plugin handle
await plugin_handle.destroy()
This will create a plugin handle and then destroy it.
Notice that we don't need to call connect or disconnect explicitly. It's managed internally.
Make Video Calls
import asyncio
from janus_client import JanusSession, JanusVideoCallPlugin
from aiortc.contrib.media import MediaPlayer, MediaRecorder
from aiortc import RTCConfiguration, RTCIceServer
async def main():
# Create session
session = JanusSession(
base_url="wss://janusmy.josephgetmyip.com/janusbasews/janus",
)
# Create plugin (optionally with WebRTC configuration)
config = RTCConfiguration(iceServers=[
RTCIceServer(urls='stun:stun.l.google.com:19302')
])
plugin_handle = JanusVideoCallPlugin(pc_config=config)
# Attach to Janus session
await plugin_handle.attach(session=session)
# Prepare username and media stream
username = "testusernamein"
username_out = "testusernameout"
player = MediaPlayer(
"desktop",
format="gdigrab",
options={
"video_size": "640x480",
"framerate": "30",
"offset_x": "20",
"offset_y": "30",
},
)
recorder = MediaRecorder("./videocall_record_out.mp4")
# Register myself as testusernameout
result = await plugin_handle.register(username=username_out)
# Call testusernamein
result = await plugin_handle.call(
username=username, player=player, recorder=recorder
)
# Wait awhile then hangup
await asyncio.sleep(30)
result = await plugin_handle.hangup()
# Destroy plugin
await plugin_handle.destroy()
# Destroy session
await session.destroy()
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
pass
This example will register to the VideoCall plugin using username testusernameout. It will then call the user registered using the username testusernamein.
A portion of the screen will be captured and sent in the call media stream.
The incoming media stream will be saved into videocall_record_out.mp4 file.
Documentation
Link here: https://josephlim94.github.io/python_janus_client/
Dev
Documentation Development
The project documentation is built with Material for MkDocs and deployed to GitHub Pages.
Setup
# Install development dependencies
hatch env create
# To serve the documentation locally with live reload
# Should be available at http://127.0.0.1:8000/
hatch run docs-serve
Building Documentation
To build the documentation for production:
hatch run docs-build
The built documentation will be in the site/ directory.
Important: The documentation build uses the --strict flag to catch warnings as errors. This ensures documentation quality and prevents deployment of documentation with issues.
For local development without strict mode:
hatch run mkdocs build
hatch run +py=3.8 mkdocs build # to build in a specific python environment only, not all
Run unit tests
Use video url from https://gist.github.com/jsturgis/3b19447b304616f18657
Use following command to run unit tests and see all logs:
hatch test # Run all tests on all environments
hatch test -- -s --log-cli-level=INFO --full-trace -- tests # Run all tests with all logs on a default environment
hatch test .\tests\test_plugin.py::TestTransportHttp::test_plugin_echotest_create -- -s --log-cli-level=INFO --full-trace # Run a specific test with all logs on a default environment
hatch test -i py=3.8 .\tests\test_plugin.py::TestTransportHttp::test_plugin_echotest_create -- -s --log-cli-level=INFO --full-trace # Run a specific test with all logs on a specific environment
Generate code coverage:
# Not running it through all python environments because the webrtc connection might fail to setup.
# That is a server configuration issue which naturally comes with integration tests like these.
hatch test -i py=3.8 -c
hatch env run -e py3.8 coverage html
Build and publish
hatch -e py3.8 build --clean
hatch publish
Experiments
FFmpeg support for VideoRoom plugin has now been moved to experiments folder, together with GStreamer support.
Metadata
Release files for janus-client 0.9.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| janus_client-0.9.0.tar.gz | 112.1 kB | Without provenance | Details for janus_client-0.9.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| janus_client-0.9.0-py3-none-any.whl | Python 3 | none | any | Details for janus_client-0.9.0-py3-none-any.whl |
Total release size: 164.5 kB
Release files / janus_client-0.9.0.tar.gz
| Download URL | janus_client-0.9.0.tar.gz |
|---|---|
| Size | 112.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9b71243ddc206ab9be2557ee52fe5eff5a8ddc8bd68dd3b124cc6b43d11a2da3
|
|
BLAKE2b-256 checksum How to use checksums |
50deddbfc3e00043908546c4c07fb743fa6bdd5467b5ffb25369eceeee28cd77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-httpx/0.28.1
|
Release files / janus_client-0.9.0-py3-none-any.whl
| Download URL | janus_client-0.9.0-py3-none-any.whl |
|---|---|
| Size | 52.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
31eecef5942cac9c53051349ed166dc740266631067418b1dce63f1df8944edf
|
|
BLAKE2b-256 checksum How to use checksums |
77219949d427d83b64bdd46fadb053797dcefbb97780376292175f4aa92781c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
python-httpx/0.28.1
|
Security for janus-client 0.9.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.