-
-
Save wtip/02835ffb2057d5c189da4ea2ee1516c6 to your computer and use it in GitHub Desktop.
picamera2, MediaMTX (formerly rtsp-simple-server) scripts and config. More details here https://www.wtip.net/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################### | |
# General parameters | |
# Sets the verbosity of the program; available values are "error", "warn", "info", "debug". | |
logLevel: info | |
# Destinations of log messages; available values are "stdout", "file" and "syslog". | |
logDestinations: [stdout] | |
# If "file" is in logDestinations, this is the file which will receive the logs. | |
logFile: mediamtx.log | |
# Timeout of read operations. | |
readTimeout: 10s | |
# Timeout of write operations. | |
writeTimeout: 10s | |
# Number of read buffers. | |
# A higher value allows a wider throughput, a lower value allows to save RAM. | |
readBufferCount: 512 | |
# Maximum size of payload of outgoing UDP packets. | |
# This can be decreased to avoid fragmentation on networks with a low UDP MTU. | |
udpMaxPayloadSize: 1472 | |
# HTTP URL to perform external authentication. | |
# Every time a user wants to authenticate, the server calls this URL | |
# with the POST method and a body containing: | |
# { | |
# "ip": "ip", | |
# "user": "user", | |
# "password": "password", | |
# "path": "path", | |
# "protocol": "rtsp|rtmp|hls|webrtc", | |
# "id": "id", | |
# "action": "read|publish", | |
# "query": "query" | |
# } | |
# If the response code is 20x, authentication is accepted, otherwise | |
# it is discarded. | |
externalAuthenticationURL: | |
# Enable the HTTP API. | |
api: yes | |
# Address of the API listener. | |
apiAddress: 127.0.0.1:9997 | |
# Enable Prometheus-compatible metrics. | |
metrics: no | |
# Address of the metrics listener. | |
metricsAddress: 127.0.0.1:9998 | |
# Enable pprof-compatible endpoint to monitor performances. | |
pprof: no | |
# Address of the pprof listener. | |
pprofAddress: 127.0.0.1:9999 | |
# Command to run when a client connects to the server. | |
# Prepend ./ to run an executable in the current folder (example: "./ffmpeg") | |
# This is terminated with SIGINT when a client disconnects from the server. | |
# The following environment variables are available: | |
# * RTSP_PORT: RTSP server port | |
runOnConnect: | |
# Restart the command if it exits. | |
runOnConnectRestart: no | |
############################################### | |
# RTSP parameters | |
# Disable support for the RTSP protocol. | |
rtspDisable: no | |
# List of enabled RTSP transport protocols. | |
# UDP is the most performant, but doesn't work when there's a NAT/firewall between | |
# server and clients, and doesn't support encryption. | |
# UDP-multicast allows to save bandwidth when clients are all in the same LAN. | |
# TCP is the most versatile, and does support encryption. | |
# The handshake is always performed with TCP. | |
protocols: [udp, multicast, tcp] | |
# Encrypt handshakes and TCP streams with TLS (RTSPS). | |
# Available values are "no", "strict", "optional". | |
encryption: "no" | |
# Address of the TCP/RTSP listener. This is needed only when encryption is "no" or "optional". | |
rtspAddress: :8554 | |
# Address of the TCP/TLS/RTSPS listener. This is needed only when encryption is "strict" or "optional". | |
rtspsAddress: :8322 | |
# Address of the UDP/RTP listener. This is needed only when "udp" is in protocols. | |
rtpAddress: :8000 | |
# Address of the UDP/RTCP listener. This is needed only when "udp" is in protocols. | |
rtcpAddress: :8001 | |
# IP range of all UDP-multicast listeners. This is needed only when "multicast" is in protocols. | |
multicastIPRange: 224.1.0.0/16 | |
# Port of all UDP-multicast/RTP listeners. This is needed only when "multicast" is in protocols. | |
multicastRTPPort: 8002 | |
# Port of all UDP-multicast/RTCP listeners. This is needed only when "multicast" is in protocols. | |
multicastRTCPPort: 8003 | |
# Path to the server key. This is needed only when encryption is "strict" or "optional". | |
# This can be generated with: | |
# openssl genrsa -out server.key 2048 | |
# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 | |
serverKey: server.key | |
# Path to the server certificate. This is needed only when encryption is "strict" or "optional". | |
serverCert: server.crt | |
# Authentication methods. Available are "basic" and "digest". | |
# "digest" doesn't provide any additional security and is available for compatibility reasons only. | |
authMethods: [basic] | |
############################################### | |
# RTMP parameters | |
# Disable support for the RTMP protocol. | |
rtmpDisable: yes | |
# Address of the RTMP listener. This is needed only when encryption is "no" or "optional". | |
rtmpAddress: :1935 | |
# Encrypt connections with TLS (RTMPS). | |
# Available values are "no", "strict", "optional". | |
rtmpEncryption: "no" | |
# Address of the RTMPS listener. This is needed only when encryption is "strict" or "optional". | |
rtmpsAddress: :1936 | |
# Path to the server key. This is needed only when encryption is "strict" or "optional". | |
# This can be generated with: | |
# openssl genrsa -out server.key 2048 | |
# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 | |
rtmpServerKey: server.key | |
# Path to the server certificate. This is needed only when encryption is "strict" or "optional". | |
rtmpServerCert: server.crt | |
############################################### | |
# HLS parameters | |
# Disable support for the HLS protocol. | |
hlsDisable: yes | |
# Address of the HLS listener. | |
hlsAddress: :8888 | |
# Enable TLS/HTTPS on the HLS server. | |
# This is required for Low-Latency HLS. | |
hlsEncryption: no | |
# Path to the server key. This is needed only when encryption is yes. | |
# This can be generated with: | |
# openssl genrsa -out server.key 2048 | |
# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 | |
hlsServerKey: server.key | |
# Path to the server certificate. | |
hlsServerCert: server.crt | |
# By default, HLS is generated only when requested by a user. | |
# This option allows to generate it always, avoiding the delay between request and generation. | |
hlsAlwaysRemux: no | |
# Variant of the HLS protocol to use. Available options are: | |
# * mpegts - uses MPEG-TS segments, for maximum compatibility. | |
# * fmp4 - uses fragmented MP4 segments, more efficient. | |
# * lowLatency - uses Low-Latency HLS. | |
hlsVariant: lowLatency | |
# Number of HLS segments to keep on the server. | |
# Segments allow to seek through the stream. | |
# Their number doesn't influence latency. | |
hlsSegmentCount: 7 | |
# Minimum duration of each segment. | |
# A player usually puts 3 segments in a buffer before reproducing the stream. | |
# The final segment duration is also influenced by the interval between IDR frames, | |
# since the server changes the duration in order to include at least one IDR frame | |
# in each segment. | |
hlsSegmentDuration: 1s | |
# Minimum duration of each part. | |
# A player usually puts 3 parts in a buffer before reproducing the stream. | |
# Parts are used in Low-Latency HLS in place of segments. | |
# Part duration is influenced by the distance between video/audio samples | |
# and is adjusted in order to produce segments with a similar duration. | |
hlsPartDuration: 200ms | |
# Maximum size of each segment. | |
# This prevents RAM exhaustion. | |
hlsSegmentMaxSize: 50M | |
# Value of the Access-Control-Allow-Origin header provided in every HTTP response. | |
# This allows to play the HLS stream from an external website. | |
hlsAllowOrigin: '*' | |
# List of IPs or CIDRs of proxies placed before the HLS server. | |
# If the server receives a request from one of these entries, IP in logs | |
# will be taken from the X-Forwarded-For header. | |
hlsTrustedProxies: [] | |
# Directory in which to save segments, instead of keeping them in the RAM. | |
# This decreases performance, since reading from disk is less performant than | |
# reading from RAM, but allows to save RAM. | |
hlsDirectory: '' | |
############################################### | |
# WebRTC parameters | |
# Disable support for the WebRTC protocol. | |
webrtcDisable: no | |
# Address of the WebRTC listener. | |
webrtcAddress: :8889 | |
# Enable TLS/HTTPS on the WebRTC server. | |
webrtcEncryption: no | |
# Path to the server key. | |
# This can be generated with: | |
# openssl genrsa -out server.key 2048 | |
# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650 | |
webrtcServerKey: server.key | |
# Path to the server certificate. | |
webrtcServerCert: server.crt | |
# Value of the Access-Control-Allow-Origin header provided in every HTTP response. | |
# This allows to play the WebRTC stream from an external website. | |
webrtcAllowOrigin: '*' | |
# List of IPs or CIDRs of proxies placed before the WebRTC server. | |
# If the server receives a request from one of these entries, IP in logs | |
# will be taken from the X-Forwarded-For header. | |
webrtcTrustedProxies: [] | |
# List of ICE servers. | |
webrtcICEServers2: | |
# URL can point to a STUN, TURN or TURNS server. | |
# STUN servers are used to obtain the public IP of server and clients. They are | |
# needed when server and clients are on different LANs. | |
# TURN/TURNS servers are needed when a direct connection between server and | |
# clients is not possible. All traffic is routed through them. | |
- url: stun:stun.l.google.com:19302 | |
# if user is "AUTH_SECRET", then authentication is secret based. | |
# the secret must be inserted into the password field. | |
username: '' | |
password: '' | |
# List of public IP addresses that are to be used as a host. | |
# This is used typically for servers that are behind 1:1 D-NAT. | |
webrtcICEHostNAT1To1IPs: [] | |
# Address of a ICE UDP listener in format host:port. | |
# If filled, ICE traffic will pass through a single UDP port, | |
# allowing the deployment of the server inside a container or behind a NAT. | |
webrtcICEUDPMuxAddress: | |
# Address of a ICE TCP listener in format host:port. | |
# If filled, ICE traffic will pass through a single TCP port, | |
# allowing the deployment of the server inside a container or behind a NAT. | |
# Setting this parameter forces usage of the TCP protocol, which is not | |
# optimal for WebRTC. | |
webrtcICETCPMuxAddress: | |
############################################### | |
# Path parameters | |
# These settings are path-dependent, and the map key is the name of the path. | |
# It's possible to use regular expressions by using a tilde as prefix, | |
# for example "~^(test1|test2)$" will match both "test1" and "test2", | |
# for example "~^prefix" will match all paths that start with "prefix". | |
# Settings under the path "all" are applied to all paths that do not match | |
# another entry. | |
paths: | |
all: | |
source: publisher | |
publishUser: myuser | |
publishPass: mypass | |
publishIPs: [] | |
# Username required to read. | |
# SHA256-hashed values can be inserted with the "sha256:" prefix. | |
readUser: | |
# password required to read. | |
# SHA256-hashed values can be inserted with the "sha256:" prefix. | |
readPass: | |
# IPs or networks (x.x.x.x/24) allowed to read. | |
readIPs: [] | |
hqstream: | |
runOnInit: python3 /root/picam_stream.py | |
runOnInitRestart: yes |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
from picamera2 import Picamera2 | |
from picamera2.encoders import H264Encoder, Quality | |
from picamera2.outputs import FfmpegOutput | |
import os, time | |
picam2 = Picamera2() | |
frame_rate = 30 | |
# max resolution is (3280, 2464) for full FoV at 15FPS | |
video_config = picam2.create_video_configuration(main={"size": (1640, 1232), "format": "RGB888"}, | |
lores={"size": (640, 480), "format": "YUV420"}, | |
controls={'FrameRate': frame_rate}) | |
picam2.align_configuration(video_config) | |
picam2.configure(video_config) | |
# FFMPEG output config | |
HQoutput = FfmpegOutput("-f rtsp -rtsp_transport udp rtsp://myuser:mypass@localhost:8554/hqstream", audio=False) | |
LQoutput = FfmpegOutput("-f rtsp -rtsp_transport udp rtsp://myuser:mypass@localhost:8554/lqstream", audio=False) | |
# Encoder settings | |
encoder_HQ = H264Encoder(repeat=True, iperiod=30, framerate=frame_rate, enable_sps_framerate=True) | |
encoder_LQ = H264Encoder(repeat=True, iperiod=30, framerate=frame_rate, enable_sps_framerate=True) | |
try: | |
print("trying to start camera streams") | |
picam2.start_recording(encoder_HQ, HQoutput, quality=Quality.LOW) | |
picam2.start_recording(encoder_LQ, LQoutput, quality=Quality.LOW, name="lores") | |
print("Started camera streams") | |
while True: | |
time.sleep(5) | |
still = picam2.capture_request() | |
still.save("main", "/dev/shm/camera-tmp.jpg") | |
still.release() | |
os.rename('/dev/shm/camera-tmp.jpg', '/dev/shm/camera.jpg') # make image replacement atomic operation | |
except : | |
print("exiting picamera2 streamer") | |
picam2.stop_recording() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment