Use this SDK to add real-time video, audio and data features to your Python app. By connecting to a self- or cloud-hosted LiveKit server, you can quickly build applications like interactive live streaming or video calls with just a few lines of code.
This repo contains two packages
- livekit: Real-time SDK for connecting to LiveKit as a participant
- livekit-api: Access token generation and server APIs
Using Server API
$ pip install livekit-api
Generating an access token
from livekit import api import os # will automatically use the LIVEKIT_API_KEY and LIVEKIT_API_SECRET env vars token = api.AccessToken() \ .with_identity("python-bot") \ .with_name("Python Bot") \ .with_grants(api.VideoGrants( room_join=True, room="my-room", )).to_jwt()
Creating a room
RoomService uses asyncio and aiohttp to make API calls. It needs to be used with an event loop.
from livekit import api import asyncio async def main(): lkapi = api.LiveKitAPI( 'http://localhost:7880', ) room_info = await lkapi.room.create_room( api.CreateRoomRequest(name="my-room"), ) print(room_info) results = await lkapi.room.list_rooms(api.ListRoomsRequest()) print(results) await lkapi.aclose() asyncio.get_event_loop().run_until_complete(main())
Using Real-time SDK
Connecting to a room
from livekit import rtc async def main(): room = rtc.Room() @room.on("participant_connected") def on_participant_connected(participant: rtc.RemoteParticipant): logging.info( "participant connected: %s %s", participant.sid, participant.identity) async def receive_frames(stream: rtc.VideoStream): async for frame in video_stream: # received a video frame from the track, process it here pass # track_subscribed is emitted whenever the local participant is subscribed to a new track @room.on("track_subscribed") def on_track_subscribed(track: rtc.Track, publication: rtc.RemoteTrackPublication, participant: rtc.RemoteParticipant): logging.info("track subscribed: %s", publication.sid) if track.kind == rtc.TrackKind.KIND_VIDEO: video_stream = rtc.VideoStream(track) asyncio.ensure_future(receive_frames(video_stream)) # By default, autosubscribe is enabled. The participant will be subscribed to # all published tracks in the room await room.connect(URL, TOKEN) logging.info("connected to room %s", room.name) # participants and tracks that are already available in the room # participant_connected and track_published events will *not* be emitted for them for participant in room.participants.items(): for publication in participant.track_publications.items(): print("track publication: %s", publication.sid)
Sending and receiving chat
room = rtc.Room() ... chat = rtc.ChatManager(room) # receiving chat @chat.on("message_received") def on_message_received(msg: rtc.ChatMessage): print(f"message received: {msg.participant.identity}: {msg.message}") # sending chat await chat.send_message("hello world")
Examples
- Facelandmark: Use mediapipe to detect face landmarks (eyes, nose ...)
- Basic room: Connect to a room
- Publish hue: Publish a rainbow video track
- Publish wave: Publish a sine wave
Getting help / Contributing
Please join us on Slack to get help from our devs / community members. We welcome your contributions(PRs) and details can be discussed there.
| LiveKit Ecosystem | |
|---|---|
| Real-time SDKs | React Components · Browser · iOS/macOS · Android · Flutter · React Native · Rust · Node.js · Python · Unity (web) · Unity (beta) |
| Server APIs | Node.js · Golang · Ruby · Java/Kotlin · Python · Rust · PHP (community) |
| Agents Frameworks | Python · Playground |
| Services | Livekit server · Egress · Ingress · SIP |
| Resources | Docs · Example apps · Cloud · Self-hosting · CLI |