RTSP/RTMP client and server for Python.
Project description
RTSP
/((((((\\\\
=======((((((((((\\\\\
(( \\\\\\\
( (* _/ \\\\\\\
\ / \ \\\\\\________________
| | | </ __ ((\\\\
o_| / ____/ / _______ \ \\\\ \\\\\\\
| ._ / __/ __(_-</ _ \ \ \\\\\\\\\\\\\\\\
| / /_/ \__/___/ .__/ / \\\\\\\ \\
.______/\/ / /_/ / \\\
/ __.____/ _/ ________( /\
/ / / ________/`---------' \ / \_
/ / \ \ \ \ \_ \
( < \ \ > / \ \
\/ \\_ / / > )
\_| / / / /
_// _//
/_| /_|
A Pythonic RTSP client and microserver for video and computer vision work, from rapid prototyping to moderate-weight production. Pull frames from any RTSP stream or local capture device as Pillow images, preview streams in a window, or serve a frame buffer over RTSP with a single context manager. For multi-client distribution, pair it with a MediaMTX relay. For performance-intensive pipelines requiring high-throughput encoding or minimal latency, use OpenCV, GStreamer, or FFmpeg directly.
Features
- read most-recent RTSP frame as Pillow Image on demand
- preview stream in a tkinter window. 'q' or ESC to quit.
- URI shortcuts for rapid prototyping
- integers (or numeric strings) open a local capture device, e.g.
rtsp.Client(0) - bare host strings default to
rtsp://, e.g.rtsp.Client('192.168.1.1/stream') - Raspberry Pi camera: enable the V4L2 driver (
dtoverlay=imx219or similar in/boot/config.txt) and usertsp.Client(0)
- integers (or numeric strings) open a local capture device, e.g.
- lightweight RTSP server
rtmp://andrtmps://URIs work withClientandSourceusing the same API as RTSP- enumerate local capture devices with
rtsp.list_devices()
Examples
Client Use
Use RTSP access credentials in your connection string e.g.
RTSP_URL = f"rtsp://{USERNAME}:{PASSWORD}@192.168.1.221:554/11"
One-off Retrieval
import rtsp
client = rtsp.Client(rtsp_server_uri = 'rtsp://...', verbose=True)
client.read().show()
client.close()
Stream Preview
import rtsp
with rtsp.Client(0) as client: # previews USB webcam 0
client.preview()
Continuous Retrieval
import rtsp
with rtsp.Client(rtsp_server_uri = 'rtsp://...') as client:
_image = client.read()
while True:
process_image(_image)
_image = client.read(raw=True)
Resize Retrieval Image
import rtsp
RTSP_URL = "rtsp://..."
client = rtsp.Client(rtsp_server_uri = RTSP_URL)
width = 640
height = 480
client.read().resize([width, height]).show()
client.close()
Rotate Retrieval Image
import rtsp
RTSP_URL = "rtsp://..."
client = rtsp.Client(rtsp_server_uri = RTSP_URL)
client.read().resize([client.read().size[0], client.read().size[0]]).rotate(90).resize([client.read().size[1], client.read().size[0]]).show()
client.close()
Save Retrieval Image (With the TimeStamp Format and Set Number of Save Image)
import rtsp
import datetime
RTSP_URL = "rtsp://..."
IMAGE_COUNT = 10
client = rtsp.Client(rtsp_server_uri = RTSP_URL)
while client.isOpened() and IMAGE_COUNT > 0:
client.read().save("./"+ str(datetime.datetime.now()) +".jpg")
IMAGE_COUNT = IMAGE_COUNT - 1
client.close()
Source Use
Serve frames locally and preview them. source.client_uri gives the address
to connect to, and verbose=True logs the URI and fps on startup:
import rtsp
frames = ['frame1.jpg', 'frame2.jpg', 'frame3.jpg']
with rtsp.Source('rtsp://0.0.0.0:8554/live', fps=1,
frame_buffer=frames, verbose=True) as source:
with rtsp.Client(source.client_uri) as client:
client.preview() # blocks; press q or ESC to quit
Serve without a viewer. serve_forever() blocks and loops the buffer
indefinitely until Ctrl-C:
import rtsp
frames = ['frame1.jpg', 'frame2.jpg', 'frame3.jpg']
with rtsp.Source('rtsp://0.0.0.0:8554/live', frame_buffer=frames) as source:
source.serve_forever() # blocks; Ctrl-C to stop
Multi-client stream via MediaMTX relay.
Also, frames can be added incrementally with put():
# Terminal: ./mediamtx (listens on :8554 by default)
import rtsp
# serve=False pushes to the running MediaMTX relay.
# Any number of Client() instances can then read from the same URI.
with rtsp.Source('rtsp://localhost:8554/live', serve=False) as source:
for frame in incoming_frames():
source.put(frame)
# Elsewhere, any number of concurrent readers:
with rtsp.Client('rtsp://localhost:8554/live') as client:
client.preview()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rtsp-2.0.0.tar.gz.
File metadata
- Download URL: rtsp-2.0.0.tar.gz
- Upload date:
- Size: 56.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6860e50795d9fc62a8adaeb53e1dbf540b4d97c5a3fb687a1f698b33f46d2c56
|
|
| MD5 |
67e51bdc60e2085121a226cde97326de
|
|
| BLAKE2b-256 |
24739be39562523b849170b4e6a3a1e968a93884cc80b31c410323ba28f2bef0
|
File details
Details for the file rtsp-2.0.0-py3-none-any.whl.
File metadata
- Download URL: rtsp-2.0.0-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.25
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a07efa5c7436027e4eb537ccb3111ec1c796a53c5837d1dc08a6bec11a0bcfc
|
|
| MD5 |
fd5a03332fe5f5fc4b80b216f9d0849e
|
|
| BLAKE2b-256 |
d27738fab72ff150ca8db3a44f72e70f4d54227f75552086ed438d66bf6d4362
|