The LiveKit icon, the name of the repository and some sample code in the background. [![pypi-v](https://img.shields.io/pypi/v/livekit.svg)](https://pypi.org/project/livekit/) # ๐Ÿ“น๐ŸŽ™๏ธ๐Ÿ Python SDK for LiveKit 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](https://pypi.org/project/livekit/): Real-time SDK for connecting to LiveKit as a participant - [livekit-api](https://pypi.org/project/livekit-api/): Access token generation and server APIs ## Using Server API ```shell $ pip install livekit-api ``` ### Generating an access token ```python 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. ```python 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 ```shell $ pip install livekit ``` ### Connecting to a room ```python 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.tracks.items(): print("track publication: %s", publication.sid) ``` ## Examples - [Facelandmark](https://github.com/livekit/python-sdks/tree/main/examples/face_landmark): Use mediapipe to detect face landmarks (eyes, nose ...) - [Basic room](https://github.com/livekit/python-sdks/blob/main/examples/basic_room.py): Connect to a room - [Publish hue](https://github.com/livekit/python-sdks/blob/main/examples/publish_hue.py): Publish a rainbow video track - [Publish wave](https://github.com/livekit/python-sdks/blob/main/examples/publish_hue.py): Publish a sine wave ## Getting help / Contributing Please join us on [Slack](https://livekit.io/join-slack) to get help from our devs / community members. We welcome your contributions(PRs) and details can be discussed there.
LiveKit Ecosystem
Real-time SDKsReact Components ยท JavaScript ยท iOS/macOS ยท Android ยท Flutter ยท React Native ยท Rust ยท Python ยท Unity (web) ยท Unity (beta)
Server APIsNode.js ยท Golang ยท Ruby ยท Java/Kotlin ยท Python ยท Rust ยท PHP (community)
Agents FrameworksPython ยท Playground
ServicesLivekit server ยท Egress ยท Ingress ยท SIP
ResourcesDocs ยท Example apps ยท Cloud ยท Self-hosting ยท CLI