Janus WebRTC gateway Python async client.
pip install janus-client
Requires Python >=3.7 <3.11
NOTE: MacBook Air M1 macOS Ventura requires Python >=3.8
Easily send and share WebRTC media through Janus WebRTC server.
This client is using aiortc
for WebRTC communication and subsequently PyAV
for media stack.
- 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
- Simple interface
- Minimum dependency
- Extendable Janus transport
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.
import asyncio
from janus_client import JanusSession, JanusVideoCallPlugin
from aiortc.contrib.media import MediaPlayer, MediaRecorder
async def main():
# Create session
session = JanusSession(
base_url="wss://janusmy.josephgetmyip.com/janusbasews/janus",
)
# Create plugin
plugin_handle = JanusVideoCallPlugin()
# 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.
https://janus-client-in-python.readthedocs.io/
FFmpeg support for VideoRoom plugin has now been moved to experiments
folder, together with GStreamer support.