commit d709f852d7c7d2797cc10b046644b11a4aca5019 Author: sandro Date: Tue Mar 17 08:55:29 2026 +0100 Initialer Commit diff --git a/aktualisiere_epg.py b/aktualisiere_epg.py new file mode 100755 index 0000000..6f82f85 --- /dev/null +++ b/aktualisiere_epg.py @@ -0,0 +1,85 @@ +import requests +import json +import os + +# --- KONFIGURATION --- +JELLYFIN_URL = "http://localhost:8096" # Oder 192.168.188.124 +API_KEY = "5ba10da6cca145feb8feff8f6b4b5e55" # Hier den API Key eintragen +EPG_PATH = "/home/sandro/m3u/sky_epg.xml" +ID_FILE = "last_provider_id.txt" # Lokaler Cache für die ID + +HEADERS = { + "X-Emby-Token": API_KEY, + "Content-Type": "application/json" +} + +def get_provider_id(): + """Versucht die ID des XMLTV-Providers von Jellyfin zu holen.""" + try: + # Liste aller Live-TV Provider abfragen + response = requests.get(f"{JELLYFIN_URL}/LiveTv/ListingProviders", headers=HEADERS) + response.raise_for_status() + providers = response.json().get("Listings", []) + + # Suche den Provider, der unseren Pfad nutzt + for p in providers: + if p.get("Path") == EPG_PATH: + return p.get("Id") + except Exception as e: + print(f"Fehler beim Abrufen der Provider-Liste: {e}") + + # Falls in der API nicht gefunden, schau im lokalen Cache nach + if os.path.exists(ID_FILE): + with open(ID_FILE, "r") as f: + return f.read().strip() + return None + +def sync_jellyfin_epg(): + # 1. ID finden (aus API oder Cache) + provider_id = get_provider_id() + + # 2. Wenn ID vorhanden, alten Provider löschen + if provider_id: + print(f"Lösche Provider mit ID: {provider_id}") + try: + requests.delete(f"{JELLYFIN_URL}/LiveTv/ListingProviders?id={provider_id}", headers=HEADERS) + except Exception as e: + print(f"Löschen fehlgeschlagen (evtl. schon weg): {e}") + + # 3. Provider neu anlegen + print(f"Lege Provider neu an für: {EPG_PATH}") + payload = { + "Type": "xmltv", + "Path": EPG_PATH, + "MoviePrefix": None, + "UserAgent": None, + "MovieCategories": [], + "KidsCategories": [], + "NewsCategories": [], + "SportsCategories": ["sports"], + "EnableAllTuners": True, + "EnabledTuners": [] + } + + try: + response = requests.post(f"{JELLYFIN_URL}/LiveTv/ListingProviders?ValidateListings=true", + headers=HEADERS, json=payload) + response.raise_for_status() + + # Die neue ID aus der Antwort holen und zwischenspeichern + new_data = response.json() + new_id = new_data.get("Id") + + if new_id: + with open(ID_FILE, "w") as f: + f.write(new_id) + print(f"Erfolgreich! Neue ID {new_id} im Cache gespeichert.") + + # 4. Optional: Sofortigen Refresh der Daten triggern + requests.post(f"{JELLYFIN_URL}/LiveTv/Refresh?api_key={API_KEY}") + + except Exception as e: + print(f"Fehler beim Neuerstellen: {e}") + +if __name__ == "__main__": + sync_jellyfin_epg() diff --git a/archiv/dummy.xml b/archiv/dummy.xml new file mode 100644 index 0000000..cab753d --- /dev/null +++ b/archiv/dummy.xml @@ -0,0 +1,46 @@ + + + + CFTV + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + + Meistens Fußball + Meistens Fußball... + Sports + + diff --git a/archiv/dummycreator.sh b/archiv/dummycreator.sh new file mode 100755 index 0000000..1906a12 --- /dev/null +++ b/archiv/dummycreator.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +## VARIABLES +### Your channels go here. add more channels as you want +numberofchannels=2 +declare -a a0=("hdmi_enc" "CFTV" "Meistens Fußball" "Meistens Fußball...") + +starttimes=("000000" "060000" "120000" "180000") +endtimes=("060000" "120000" "180000" "235900") +BASEPATH="/home/sandro/m3u" +DUMMYFILENAME=dummy.xml + + today=$(date +%Y%m%d) + tomorrow=$(date --date="+1 day" +%Y%m%d) + # tomorrow=$(date -v+1d +%Y%m%d) ## if running on MAC or BSD + echo '' > $BASEPATH/$DUMMYFILENAME + echo '' >> $BASEPATH/$DUMMYFILENAME + numberofiterations=$(($numberofchannels - 1)) + echo "Creating Dummy Epg ..." + + + for i in $(seq 0 $numberofiterations); do # Number of Dummys -1 + tvgid=a$i[0] + name=a$i[1] + echo ' ' >> $BASEPATH/$DUMMYFILENAME + echo ' '${!name}'' >> $BASEPATH/$DUMMYFILENAME + echo ' ' >> $BASEPATH/$DUMMYFILENAME + done + + for i in $(seq 0 $numberofiterations) ;do + tvgid=a$i[0] + title=a$i[2] + desc=a$i[3] + for j in {0..3}; do + echo ' ' >> $BASEPATH/$DUMMYFILENAME + echo ' '${!title}'' >> $BASEPATH/$DUMMYFILENAME + echo ' '${!desc}'' >> $BASEPATH/$DUMMYFILENAME + echo ' ' >> $BASEPATH/$DUMMYFILENAME + done + done + + echo '' >> $BASEPATH/$DUMMYFILENAME + +echo "Done!" +sleep 2 diff --git a/archiv/hdmi.m3u b/archiv/hdmi.m3u new file mode 100644 index 0000000..6b1781b --- /dev/null +++ b/archiv/hdmi.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="hdmi_enc" tvg-name="HDMI Encoder" tvg-logo="https://logo.daznplatform.com/CFTV.svg?fontColor=%23FFFFFF&backgroundColor=transparent" group-title="Live", CFTV +rtsp://192.168.189.102:554/live/1_0 diff --git a/epg.xml b/epg.xml new file mode 100644 index 0000000..4706674 --- /dev/null +++ b/epg.xml @@ -0,0 +1,14 @@ + + + + CF Sports + + + + + CF Livesport + CF Live Sports Events + Sport + + + diff --git a/epg_create.py b/epg_create.py new file mode 100755 index 0000000..031624d --- /dev/null +++ b/epg_create.py @@ -0,0 +1,57 @@ +import subprocess +from flask import Flask, request, jsonify +from lxml import etree +from datetime import datetime, timedelta + +app = Flask(__name__) + +EPG_FILE = "sky_epg.xml" + +@app.route('/update_sky', methods=['POST']) +def update_sky(): + data = request.json + channel_name = data.get('channel', 'Unbekannt') + content_title = data.get('content', 'Keine Information') + + # Zeitstempel für XMLTV (Start jetzt, Ende in 1 Std als Platzhalter) + now = datetime.now() + start_time = now.strftime("%Y%m%d%H%M%S +0100") + stop_time = (now + timedelta(hours=12)).strftime("%Y%m%d%H%M%S +0100") + + # XML Struktur aufbauen + root = etree.Element("tv") + + # Kanal Info + channel = etree.SubElement(root, "channel", id="cftv") + etree.SubElement(channel, "display-name").text = "cftv" #+ channel_name + + # Programm Info + prog = etree.SubElement(root, "programme", + start=start_time, + stop=stop_time, + channel="cftv") #channel_name.replace(" ", "")) + etree.SubElement(prog, "title").text = content_title + if data.get('image'): + etree.SubElement(prog, "icon", src=data['image']) + + # Datei speichern + tree = etree.ElementTree(root) + tree.write(EPG_FILE, pretty_print=True, xml_declaration=True, encoding="utf-8") + + print(f"EPG aktualisiert: {channel_name} - {content_title}") + + script_path = "/home/sandro/m3u/aktualisiere_epg.py" + + try: + # Wir rufen es asynchron auf, damit die API sofort "success" an HA zurückgeben kann + subprocess.Popen(["python3", script_path]) + print(f"Externes Skript gestartet: {script_path}") + except Exception as e: + print(f"Fehler beim Aufruf des EPG-Skripts: {e}") + + return jsonify({"status": "XML erstellt, Sync gestartet"}), 200 + + return jsonify({"status": "xml_updated"}), 200 + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5000) diff --git a/hdmi_mtx.m3u b/hdmi_mtx.m3u new file mode 100644 index 0000000..276a3dd --- /dev/null +++ b/hdmi_mtx.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="hdmi_enc" tvg-name="HDMI Encoder" tvg-logo="https://logo.daznplatform.com/CFTV.svg?fontColor=%23FFFFFF&backgroundColor=transparent" group-title="Live", CFTV +rtsp://localhost:8554/live/1_0 diff --git a/last_provider_id.txt b/last_provider_id.txt new file mode 100644 index 0000000..a9083c4 --- /dev/null +++ b/last_provider_id.txt @@ -0,0 +1 @@ +b0bdbf1234554da08ddc1d5241fd56b2 \ No newline at end of file diff --git a/loesche_epg.py b/loesche_epg.py new file mode 100755 index 0000000..345f1d3 --- /dev/null +++ b/loesche_epg.py @@ -0,0 +1,50 @@ +import requests +import json +import os + +# --- KONFIGURATION --- +JELLYFIN_URL = "http://localhost:8096" # Oder 192.168.188.124 +API_KEY = "5ba10da6cca145feb8feff8f6b4b5e55" # Hier den API Key eintragen +EPG_PATH = "/home/sandro/m3u/sky_epg.xml" +ID_FILE = "last_provider_id.txt" # Lokaler Cache für die ID + +HEADERS = { + "X-Emby-Token": API_KEY, + "Content-Type": "application/json" +} + +def get_provider_id(): + """Versucht die ID des XMLTV-Providers von Jellyfin zu holen.""" + try: + # Liste aller Live-TV Provider abfragen + response = requests.get(f"{JELLYFIN_URL}/LiveTv/ListingProviders", headers=HEADERS) + response.raise_for_status() + providers = response.json().get("Listings", []) + + # Suche den Provider, der unseren Pfad nutzt + for p in providers: + if p.get("Path") == EPG_PATH: + return p.get("Id") + except Exception as e: + print(f"Fehler beim Abrufen der Provider-Liste: {e}") + + # Falls in der API nicht gefunden, schau im lokalen Cache nach + if os.path.exists(ID_FILE): + with open(ID_FILE, "r") as f: + return f.read().strip() + return None + +def sync_jellyfin_epg(): + # 1. ID finden (aus API oder Cache) + provider_id = get_provider_id() + + # 2. Wenn ID vorhanden, alten Provider löschen + if provider_id: + print(f"Lösche Provider mit ID: {provider_id}") + try: + requests.delete(f"{JELLYFIN_URL}/LiveTv/ListingProviders?id={provider_id}", headers=HEADERS) + except Exception as e: + print(f"Löschen fehlgeschlagen (evtl. schon weg): {e}") + +if __name__ == "__main__": + sync_jellyfin_epg() diff --git a/mediamtx b/mediamtx new file mode 100755 index 0000000..363352d Binary files /dev/null and b/mediamtx differ diff --git a/mediamtx.backuo b/mediamtx.backuo new file mode 100644 index 0000000..260f756 --- /dev/null +++ b/mediamtx.backuo @@ -0,0 +1,796 @@ +############################################### +# Global settings + +# Settings in this section are applied anywhere. + +############################################### +# Global settings -> General + +# 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] +# When destination is "stdout" or "file", emit logs in structured format (JSONL). +logStructured: false +# When "file" is in logDestinations, this is the file which will receive logs. +logFile: mediamtx.log +# When "syslog" is in logDestinations, use prefix for logs. +sysLogPrefix: mediamtx +# Dump packets to disk. This is useful for debugging. +dumpPackets: false + +# Timeout of read operations. +readTimeout: 10s +# Timeout of write operations. +writeTimeout: 10s +# Size of the queue of outgoing packets. +# A higher value allows to increase throughput, a lower value allows to save RAM. +writeQueueSize: 512 +# Maximum size of outgoing UDP payloads. +# It defaults to the maximum packet size on ethernet (1500) minus IPv6 and UDP headers (48). +# This can be decreased to avoid fragmentation on networks with a low MTU. +udpMaxPayloadSize: 1452 +# Size of the read buffer of every UDP socket. +# This can be increased to decrease packet losses. +# It defaults to the default value of the operating system. +udpReadBufferSize: 0 + +# Command to run when a client connects to the server. +# This is terminated with SIGINT when a client disconnects from the server. +# The following environment variables are available: +# * MTX_CONN_TYPE: connection type +# * MTX_CONN_ID: connection ID +# * RTSP_PORT: RTSP server port +runOnConnect: +# Restart the command if it exits. +runOnConnectRestart: false +# Command to run when a client disconnects from the server. +# Environment variables are the same of runOnConnect. +runOnDisconnect: + +############################################### +# Global settings -> Authentication + +# Authentication method. Available values are: +# * internal: credentials are stored in the configuration file +# * http: an external HTTP URL is contacted to perform authentication +# * jwt: an external identity server provides authentication through JWTs +authMethod: internal + +# Internal authentication. +# Enabled users. +authInternalUsers: + # Default unprivileged user. + # Username. 'any' means any user, including anonymous ones. +- user: any + # Password. Not used in case of 'any' user. + pass: + # IPs or networks allowed to use this user. An empty list means any IP. + ips: [] + # Permissions. + permissions: + # Available actions are: publish, read, playback, api, metrics, pprof. + - action: publish + # Paths can be set to further restrict access to a specific path. + # An empty path means any path. + # Regular expressions can be used by using a tilde as prefix. + path: + - action: read + path: + - action: playback + path: + + # Default administrator. + # This allows to use API, metrics and PPROF without authentication, + # if the IP is localhost. +- user: any + pass: + ips: ['127.0.0.1', '::1'] + permissions: + - action: api + - action: metrics + - action: pprof + +# HTTP-based authentication. +# URL called to perform authentication. Every time a user wants +# to authenticate, the server calls this URL with the POST method +# and a body containing: +# { +# "user": "user", +# "password": "password", +# "token": "token", +# "ip": "ip", +# "action": "publish|read|playback|api|metrics|pprof", +# "path": "path", +# "protocol": "rtsp|rtmp|hls|webrtc|srt", +# "id": "id", +# "query": "query" +# } +# If the response code is 20x, authentication is accepted, otherwise +# it is discarded. +authHTTPAddress: +# If the HTTP authentication URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect auth_http_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authHTTPFingerprint: +# Actions to exclude from HTTP-based authentication. +# Format is the same as the one of user permissions. +authHTTPExclude: +- action: api +- action: metrics +- action: pprof + +# JWT-based authentication. +# Users have to login through an external identity server and obtain a JWT. +# This JWT must contain the claim "mediamtx_permissions" with permissions, +# for instance: +# { +# "mediamtx_permissions": [ +# { +# "action": "publish", +# "path": "somepath" +# } +# ] +# } +# Users are expected to pass the JWT in the Authorization header or as password. +# This is the JWKS URL that will be used to pull (once) the public key that allows +# to validate JWTs. +authJWTJWKS: +# If the JWKS URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect jwt_jwks_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authJWTJWKSFingerprint: +# name of the claim that contains permissions. +authJWTClaimKey: mediamtx_permissions +# Actions to exclude from JWT-based authentication. +# Format is the same as the one of user permissions. +authJWTExclude: [] +# allow passing the JWT through query parameters of HTTP requests (i.e. ?jwt=JWT). +# This is a security risk and will be disabled in the future. +authJWTInHTTPQuery: true + +############################################### +# Global settings -> Control API + +# Enable controlling the server through the Control API. +api: false +# Address of the Control API listener. +apiAddress: :9997 +# Enable HTTPS on the Control API server. +apiEncryption: false +# 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 +apiServerKey: server.key +# Path to the server certificate. +apiServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +apiAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +apiTrustedProxies: [] + +############################################### +# Global settings -> Metrics + +# Enable Prometheus-compatible metrics. +metrics: false +# Address of the metrics HTTP listener. +metricsAddress: :9998 +# Enable HTTPS on the Metrics server. +metricsEncryption: false +# 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 +metricsServerKey: server.key +# Path to the server certificate. +metricsServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +metricsAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +metricsTrustedProxies: [] + +############################################### +# Global settings -> PPROF + +# Enable pprof-compatible endpoint to monitor performances. +pprof: false +# Address of the pprof listener. +pprofAddress: :9999 +# Enable HTTPS on the pprof server. +pprofEncryption: false +# 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 +pprofServerKey: server.key +# Path to the server certificate. +pprofServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +pprofAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +pprofTrustedProxies: [] + +############################################### +# Global settings -> Playback server + +# Enable downloading recordings from the playback server. +playback: false +# Address of the playback server listener. +playbackAddress: :9996 +# Enable HTTPS on the playback server. +playbackEncryption: false +# 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 +playbackServerKey: server.key +# Path to the server certificate. +playbackServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +playbackAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +playbackTrustedProxies: [] + +############################################### +# Global settings -> RTSP server + +# Enable publishing and reading streams with the RTSP protocol. +rtsp: true +# Enabled RTSP transport protocols. The handshake is always performed with TCP. +rtspTransports: [udp, multicast, tcp] +# Use secure protocol variants (RTSPS, SRTP, SRTCP). +# Available values are "no", "strict", "optional". +rtspEncryption: "no" +# Address of the TCP/RTSP listener. This is needed only when encryption is "no" or "optional". +rtspAddress: :8554 +# Address of the TCP/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 rtspTransports and encryption is "no" or "optional". +rtpAddress: :8000 +# Address of the UDP/RTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "no" or "optional". +rtcpAddress: :8001 +# IP range of all UDP-multicast listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastIPRange: 224.1.0.0/16 +# Port of all UDP-multicast/RTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTPPort: 8002 +# Port of all UDP-multicast/RTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTCPPort: 8003 +# Address of the UDP/SRTP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtpAddress: :8004 +# Address of the UDP/SRTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtcpAddress: :8005 +# Port of all UDP-multicast/SRTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTPPort: 8006 +# Port of all UDP-multicast/SRTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTCPPort: 8007 +# 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 +rtspServerKey: server.key +# Path to the server certificate. This is needed only when encryption is "strict" or "optional". +rtspServerCert: server.crt +# Authentication methods. Available are "basic" and "digest". +# "digest" doesn't provide any additional security and is available for compatibility only. +rtspAuthMethods: [basic] + +############################################### +# Global settings -> RTMP server + +# Enable publishing and reading streams with the RTMP protocol. +rtmp: true +# Use the secure protocol variant (RTMP). +# Available values are "no", "strict", "optional". +rtmpEncryption: "no" +# Address of the RTMP listener. This is needed only when encryption is "no" or "optional". +rtmpAddress: :1935 +# 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 + +############################################### +# Global settings -> HLS server + +# Enable reading streams with the HLS protocol. +hls: true +# Address of the HLS listener. +hlsAddress: :8888 +# Enable HTTPS on the HLS server. +# This is required for Low-Latency HLS to function correctly on Apple devices. +hlsEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +hlsAllowOrigins: ['*'] +# 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: [] +# 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: false +# 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 +# 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: '' +# The muxer will be closed when there are no +# reader requests and this amount of time has passed. +hlsMuxerCloseAfter: 60s + +############################################### +# Global settings -> WebRTC server + +# Enable publishing and reading streams with the WebRTC protocol. +webrtc: true +# Address of the WebRTC HTTP listener. +webrtcAddress: :8889 +# Enable HTTPS on the WebRTC server. +# This covers only the WebRTC handshake and does not influence the encryption of WebRTC streams +# which are always encrypted, with a key that is exchanged during the WebRTC handshake. +webrtcEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +webrtcAllowOrigins: ['*'] +# 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: [] +# Address of a local UDP listener that will receive connections. +# Use a blank string to disable. +webrtcLocalUDPAddress: :8189 +# Address of a local TCP listener that will receive connections. +# This is disabled by default since TCP is less efficient than UDP and +# introduces a progressive delay when network is congested. +webrtcLocalTCPAddress: '' +# WebRTC clients need to know the IP of the server. +# Gather IPs from interfaces and send them to clients. +webrtcIPsFromInterfaces: true +# Interfaces whose IPs will be sent to clients. +# An empty value means to use all available interfaces. +webrtcIPsFromInterfacesList: [] +# Additional hosts or IPs to send to clients. +webrtcAdditionalHosts: [] +# ICE servers. Needed only when local listeners can't be reached by clients. +# STUN servers allows to obtain and share the public IP of the server. +# TURN/TURNS servers forces all traffic through them. +webrtcICEServers2: [] + # - 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: '' + # clientOnly: false +# Maximum time to gather STUN candidates. +webrtcSTUNGatherTimeout: 5s +# Time to wait for the WebRTC handshake to complete. +webrtcHandshakeTimeout: 10s +# Maximum time to gather tracks. +webrtcTrackGatherTimeout: 2s + +############################################### +# Global settings -> SRT server + +# Enable publishing and reading streams with the SRT protocol. +srt: true +# Address of the SRT listener. +srtAddress: :8890 + +############################################### +# Default path settings + +# Settings in "pathDefaults" are applied anywhere, +# unless they are overridden in "paths". +pathDefaults: + + ############################################### + # Default path settings -> General + + # Source of the stream. This can be: + # * publisher -> the stream is provided by a RTSP, RTMP, WebRTC or SRT client + # * rtsp://existing-url -> the stream is pulled from another RTSP server / camera + # * rtsps://existing-url -> the stream is pulled from another RTSP server / camera with RTSPS + # * rtsp+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTP tunneling + # * rtsps+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTPS tunneling + # * rtsp+ws://existing-url -> the stream is pulled from another RTSP server / camera, with WebSocket tunneling + # * rtsps+ws://existing-url -> the stream is pulled from another RTSP server / camera, with secure WebSocket tunneling + # * rtmp://existing-url -> the stream is pulled from another RTMP server / camera + # * rtmps://existing-url -> the stream is pulled from another RTMP server / camera with RTMPS + # * http://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera + # * https://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera with HTTPS + # * udp+mpegts://ip:port -> the stream is pulled from MPEG-TS over UDP, by listening on the specified address + # * unix+mpegts://socket -> the stream is pulled from MPEG-TS over Unix socket, by using the socket + # * udp+rtp://ip:port -> the stream is pulled from RTP over UDP, by listening on the specified address + # * srt://existing-url -> the stream is pulled from another SRT server / camera + # * whep://existing-url -> the stream is pulled from another WebRTC server / camera with HTTP+WHEP + # * wheps://existing-url -> the stream is pulled from another WebRTC server / camera with HTTPS+WHEP + # * redirect -> the stream is provided by another path or server + # * rpiCamera -> the stream is provided by a Raspberry Pi Camera + # The following variables can be used in the source string: + # * $MTX_QUERY: query parameters (passed by first reader) + # * $G1, $G2, ...: regular expression groups, if path name is + # a regular expression. + source: publisher + # If the source is a URL, and the source TLS certificate is self-signed + # or invalid, you can provide the fingerprint of the certificate in order to + # validate it anyway. It can be obtained by running: + # openssl s_client -connect source_ip:source_port /dev/null | sed -n '/BEGIN/,/END/p' > server.crt + # openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' + sourceFingerprint: + # If the source is a URL, it will be pulled only when at least + # one reader is connected, saving bandwidth. + sourceOnDemand: false + # If sourceOnDemand is "yes", readers will be put on hold until the source is + # ready or until this amount of time has passed. + sourceOnDemandStartTimeout: 10s + # If sourceOnDemand is "yes", the source will be closed when there are no + # readers connected and this amount of time has passed. + sourceOnDemandCloseAfter: 10s + # Maximum number of readers. Zero means no limit. + maxReaders: 0 + # SRT encryption passphrase required to read from this path. + srtReadPassphrase: + # Use absolute timestamp of frames, instead of replacing them with the current time. + useAbsoluteTimestamp: false + + ############################################### + # Default path settings -> Always available + + # Enable always-available mode, in which a offline segment is played on repeat when the stream is not available. + alwaysAvailable: false + # Tracks of the default offline segment. + alwaysAvailableTracks: [] + # Available values are: AV1, VP9, H265, H264, Opus, MPEG4Audio, G711, LPCM + # - codec: H264 + # # in case of MPEG4Audio, G711, LPCM, sampleRate and ChannelCount must be provided too. + # sampleRate: 48000 + # channelCount: 2 + # # in case of G711, muLaw must be provided too. + # muLaw: false + # A MP4 file can be used instead of the default offline segment. + alwaysAvailableFile: '' + + ############################################### + # Default path settings -> Record + + # Record streams to disk. + record: false + # Path of recording segments. + # Extension is added automatically. + # Available variables are %path (path name), %Y %m %d (year, month, day), + # %H %M %S (hours, minutes, seconds), %f (microseconds), %z (time zone), %s (unix epoch). + recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f + # Format of recorded segments. + # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS). + recordFormat: fmp4 + # fMP4 segments are concatenation of small MP4 files (parts), each with this duration. + # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period. + # When a system failure occurs, the last part gets lost. + # Therefore, the part duration is equal to the RPO (recovery point objective). + recordPartDuration: 1s + # This prevents RAM exhaustion. + recordMaxPartSize: 50M + # Minimum duration of each segment. + recordSegmentDuration: 1h + # Delete segments after this timespan. + # Set to 0s to disable automatic deletion. + recordDeleteAfter: 1d + + ############################################### + # Default path settings -> Publisher source (when source is "publisher") + + # Allow another client to disconnect the current publisher and publish in its place. + overridePublisher: true + # SRT encryption passphrase required to publish to this path. + srtPublishPassphrase: + + ############################################### + # Default path settings -> RTSP source (when source is a RTSP or a RTSPS URL) + + # Transport protocol used to pull the stream. available values are "automatic", "udp", "multicast", "tcp". + rtspTransport: automatic + # Support sources that don't provide server ports or use random server ports. This is a security issue + # and must be used only when interacting with sources that require it. + rtspAnyPort: false + # Range header to send to the source, in order to start streaming from the specified offset. + # available values: + # * clock: Absolute time + # * npt: Normal Play Time + # * smpte: SMPTE timestamps relative to the start of the recording + rtspRangeType: + # Available values: + # * clock: UTC ISO 8601 combined date and time string, e.g. 20230812T120000Z + # * npt: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + # * smpte: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + rtspRangeStart: + # Range of ports used as source port in outgoing UDP packets. + rtspUDPSourcePortRange: [10000, 65535] + + ############################################### + # Default path settings -> RTP source (when source is RTP) + + # session description protocol (SDP) of the RTP stream. + rtpSDP: + + ############################################### + # Default path settings -> WebRTC / WHEP source (when source is WHEP) + + # Token to insert in the Authorization: Bearer header. + whepBearerToken: '' + # Maximum time to gather STUN candidates. + whepSTUNGatherTimeout: 5s + # Time to wait for the WebRTC handshake to complete. + whepHandshakeTimeout: 10s + # Maximum time to gather tracks. + whepTrackGatherTimeout: 2s + + ############################################### + # Default path settings -> Redirect source (when source is "redirect") + + # path which clients will be redirected to. + # It can be can be a relative path (i.e. /otherstream) or an absolute RTSP URL. + sourceRedirect: + + ############################################### + # Default path settings -> Raspberry Pi Camera source (when source is "rpiCamera") + + # ID of the camera. + rpiCameraCamID: 0 + # Whether this is a secondary stream. + rpiCameraSecondary: false + # Width of frames. + rpiCameraWidth: 1920 + # Height of frames. + rpiCameraHeight: 1080 + # Flip horizontally. + rpiCameraHFlip: false + # Flip vertically. + rpiCameraVFlip: false + # Brightness [-1, 1]. + rpiCameraBrightness: 0 + # Contrast [0, 16]. + rpiCameraContrast: 1 + # Saturation [0, 16]. + rpiCameraSaturation: 1 + # Sharpness [0, 16]. + rpiCameraSharpness: 1 + # Exposure mode. + # values: normal, short, long, custom. + rpiCameraExposure: normal + # Auto-white-balance mode. + # (auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy or custom). + rpiCameraAWB: auto + # Auto-white-balance fixed gains. This can be used in place of rpiCameraAWB. + # format: [red,blue]. + rpiCameraAWBGains: [0, 0] + # Denoise operating mode (off, cdn_off, cdn_fast, cdn_hq). + rpiCameraDenoise: "off" + # Fixed shutter speed, in microseconds. + rpiCameraShutter: 0 + # Metering mode of the AEC/AGC algorithm (centre, spot, matrix or custom). + rpiCameraMetering: centre + # Fixed gain. + rpiCameraGain: 0 + # EV compensation of the image in range [-10, 10]. + rpiCameraEV: 0 + # Region of interest, in format x,y,width,height (all normalized between 0 and 1). + rpiCameraROI: + # Whether to enable HDR on Raspberry Camera 3. + rpiCameraHDR: false + # Tuning file. + rpiCameraTuningFile: + # Sensor mode, in format [width]:[height]:[bit-depth]:[packing] + # bit-depth and packing are optional. + rpiCameraMode: + # frames per second. + rpiCameraFPS: 30 + # Autofocus mode (auto, manual or continuous). + rpiCameraAfMode: continuous + # Autofocus range (normal, macro or full). + rpiCameraAfRange: normal + # Autofocus speed (normal or fast). + rpiCameraAfSpeed: normal + # Lens position (for manual autofocus only), will be set to focus to a specific distance + # calculated by the following formula: d = 1 / value + # Examples: 0 moves the lens to infinity. + # 0.5 moves the lens to focus on objects 2m away. + # 2 moves the lens to focus on objects 50cm away. + rpiCameraLensPosition: 0.0 + # Autofocus window, in the form x,y,width,height where the coordinates + # are given as a proportion of the entire image. + rpiCameraAfWindow: + # Manual flicker correction period, in microseconds. + rpiCameraFlickerPeriod: 0 + # Enables printing text on each frame. + rpiCameraTextOverlayEnable: false + # Text that is printed on each frame. + # format is the one of the strftime() function. + rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' + # Codec (auto, hardwareH264, softwareH264 or mjpeg). + # When is "auto" and stream is primary, it defaults to hardwareH264 (if available) or softwareH264. + # When is "auto" and stream is secondary, it defaults to mjpeg. + rpiCameraCodec: auto + # Period between IDR frames (when codec is hardwareH264 or softwareH264). + rpiCameraIDRPeriod: 60 + # Bitrate (when codec is hardwareH264 or softwareH264). + rpiCameraBitrate: 5000000 + # Hardware H264 profile (baseline, main or high) (when codec is hardwareH264). + rpiCameraHardwareH264Profile: main + # Hardware H264 level (4.0, 4.1 or 4.2) (when codec is hardwareH264). + rpiCameraHardwareH264Level: '4.1' + # Software H264 profile (baseline, main or high) (when codec is softwareH264). + rpiCameraSoftwareH264Profile: baseline + # Software H264 level (4.0, 4.1 or 4.2) (when codec is softwareH264). + rpiCameraSoftwareH264Level: '4.1' + # M-JPEG JPEG quality (when codec is mjpeg). + rpiCameraMJPEGQuality: 60 + + ############################################### + # Default path settings -> Hooks + + # Command to run when this path is initialized. + # This can be used to publish a stream when the server is launched. + # This is terminated with SIGINT when the program closes. + # The following environment variables are available: + # * MTX_PATH: path name + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnInit: + # Restart the command if it exits. + runOnInitRestart: false + + # Command to run when this path is requested by a reader + # and no one is publishing to this path yet. + # This can be used to publish a stream on demand. + # This is terminated with SIGINT when there are no readers anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by first reader) + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnDemand: + # Restart the command if it exits. + runOnDemandRestart: false + # Readers will be put on hold until the runOnDemand command starts publishing + # or until this amount of time has passed. + runOnDemandStartTimeout: 10s + # The command will be closed when there are no + # readers connected and this amount of time has passed. + runOnDemandCloseAfter: 10s + # Command to run when there are no readers anymore. + # Environment variables are the same of runOnDemand. + runOnUnDemand: + + # Command to run when the stream is ready to be read, whenever it is + # published by a client or pulled from a server / camera. + # This is terminated with SIGINT when the stream is not ready anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by publisher) + # * MTX_SOURCE_TYPE: source type + # * MTX_SOURCE_ID: source ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnReady: + # Restart the command if it exits. + runOnReadyRestart: false + # Command to run when the stream is not available anymore. + # Environment variables are the same of runOnReady. + runOnNotReady: + + # Command to run when a client starts reading. + # This is terminated with SIGINT when a client stops reading. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by reader) + # * MTX_READER_TYPE: reader type + # * MTX_READER_ID: reader ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRead: + # Restart the command if it exits. + runOnReadRestart: false + # Command to run when a client stops reading. + # Environment variables are the same of runOnRead. + runOnUnread: + + # Command to run when a recording segment is created. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentCreate: + + # Command to run when a recording segment is complete. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * MTX_SEGMENT_DURATION: segment duration + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentComplete: + +############################################### +# Path settings + +# Settings in "paths" are applied to specific paths, and the map key +# is the name of the path. +# Any setting in "pathDefaults" can be overridden here. +# 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". +paths: + # example: + # my_camera: + # source: rtsp://my_camera + + # Settings under path "all_others" are applied to all paths that + # do not match another entry. + all_others: diff --git a/mediamtx.backup.hls b/mediamtx.backup.hls new file mode 100644 index 0000000..9097f91 --- /dev/null +++ b/mediamtx.backup.hls @@ -0,0 +1,801 @@ +############################################### +# Global settings + +# Settings in this section are applied anywhere. + +############################################### +# Global settings -> General + +# 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] +# When destination is "stdout" or "file", emit logs in structured format (JSONL). +logStructured: false +# When "file" is in logDestinations, this is the file which will receive logs. +logFile: mediamtx.log +# When "syslog" is in logDestinations, use prefix for logs. +sysLogPrefix: mediamtx +# Dump packets to disk. This is useful for debugging. +dumpPackets: false + +# Timeout of read operations. +readTimeout: 10s +# Timeout of write operations. +writeTimeout: 10s +# Size of the queue of outgoing packets. +# A higher value allows to increase throughput, a lower value allows to save RAM. +writeQueueSize: 512 +# Maximum size of outgoing UDP payloads. +# It defaults to the maximum packet size on ethernet (1500) minus IPv6 and UDP headers (48). +# This can be decreased to avoid fragmentation on networks with a low MTU. +udpMaxPayloadSize: 1452 +# Size of the read buffer of every UDP socket. +# This can be increased to decrease packet losses. +# It defaults to the default value of the operating system. +udpReadBufferSize: 0 + +# Command to run when a client connects to the server. +# This is terminated with SIGINT when a client disconnects from the server. +# The following environment variables are available: +# * MTX_CONN_TYPE: connection type +# * MTX_CONN_ID: connection ID +# * RTSP_PORT: RTSP server port +runOnConnect: +# Restart the command if it exits. +runOnConnectRestart: false +# Command to run when a client disconnects from the server. +# Environment variables are the same of runOnConnect. +runOnDisconnect: + +############################################### +# Global settings -> Authentication + +# Authentication method. Available values are: +# * internal: credentials are stored in the configuration file +# * http: an external HTTP URL is contacted to perform authentication +# * jwt: an external identity server provides authentication through JWTs +authMethod: internal + +# Internal authentication. +# Enabled users. +authInternalUsers: + # Default unprivileged user. + # Username. 'any' means any user, including anonymous ones. +- user: any + # Password. Not used in case of 'any' user. + pass: + # IPs or networks allowed to use this user. An empty list means any IP. + ips: [] + # Permissions. + permissions: + # Available actions are: publish, read, playback, api, metrics, pprof. + - action: publish + # Paths can be set to further restrict access to a specific path. + # An empty path means any path. + # Regular expressions can be used by using a tilde as prefix. + path: + - action: read + path: + - action: playback + path: + + # Default administrator. + # This allows to use API, metrics and PPROF without authentication, + # if the IP is localhost. +- user: any + pass: + ips: ['127.0.0.1', '::1'] + permissions: + - action: api + - action: metrics + - action: pprof + +# HTTP-based authentication. +# URL called to perform authentication. Every time a user wants +# to authenticate, the server calls this URL with the POST method +# and a body containing: +# { +# "user": "user", +# "password": "password", +# "token": "token", +# "ip": "ip", +# "action": "publish|read|playback|api|metrics|pprof", +# "path": "path", +# "protocol": "rtsp|rtmp|hls|webrtc|srt", +# "id": "id", +# "query": "query" +# } +# If the response code is 20x, authentication is accepted, otherwise +# it is discarded. +authHTTPAddress: +# If the HTTP authentication URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect auth_http_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authHTTPFingerprint: +# Actions to exclude from HTTP-based authentication. +# Format is the same as the one of user permissions. +authHTTPExclude: +- action: api +- action: metrics +- action: pprof + +# JWT-based authentication. +# Users have to login through an external identity server and obtain a JWT. +# This JWT must contain the claim "mediamtx_permissions" with permissions, +# for instance: +# { +# "mediamtx_permissions": [ +# { +# "action": "publish", +# "path": "somepath" +# } +# ] +# } +# Users are expected to pass the JWT in the Authorization header or as password. +# This is the JWKS URL that will be used to pull (once) the public key that allows +# to validate JWTs. +authJWTJWKS: +# If the JWKS URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect jwt_jwks_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authJWTJWKSFingerprint: +# name of the claim that contains permissions. +authJWTClaimKey: mediamtx_permissions +# Actions to exclude from JWT-based authentication. +# Format is the same as the one of user permissions. +authJWTExclude: [] +# allow passing the JWT through query parameters of HTTP requests (i.e. ?jwt=JWT). +# This is a security risk and will be disabled in the future. +authJWTInHTTPQuery: true + +############################################### +# Global settings -> Control API + +# Enable controlling the server through the Control API. +api: false +# Address of the Control API listener. +apiAddress: :9997 +# Enable HTTPS on the Control API server. +apiEncryption: false +# 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 +apiServerKey: server.key +# Path to the server certificate. +apiServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +apiAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +apiTrustedProxies: [] + +############################################### +# Global settings -> Metrics + +# Enable Prometheus-compatible metrics. +metrics: false +# Address of the metrics HTTP listener. +metricsAddress: :9998 +# Enable HTTPS on the Metrics server. +metricsEncryption: false +# 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 +metricsServerKey: server.key +# Path to the server certificate. +metricsServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +metricsAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +metricsTrustedProxies: [] + +############################################### +# Global settings -> PPROF + +# Enable pprof-compatible endpoint to monitor performances. +pprof: false +# Address of the pprof listener. +pprofAddress: :9999 +# Enable HTTPS on the pprof server. +pprofEncryption: false +# 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 +pprofServerKey: server.key +# Path to the server certificate. +pprofServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +pprofAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +pprofTrustedProxies: [] + +############################################### +# Global settings -> Playback server + +# Enable downloading recordings from the playback server. +playback: false +# Address of the playback server listener. +playbackAddress: :9996 +# Enable HTTPS on the playback server. +playbackEncryption: false +# 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 +playbackServerKey: server.key +# Path to the server certificate. +playbackServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +playbackAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +playbackTrustedProxies: [] + +############################################### +# Global settings -> RTSP server + +# Enable publishing and reading streams with the RTSP protocol. +rtsp: true +# Enabled RTSP transport protocols. The handshake is always performed with TCP. +rtspTransports: [udp, multicast, tcp] +# Use secure protocol variants (RTSPS, SRTP, SRTCP). +# Available values are "no", "strict", "optional". +rtspEncryption: "no" +# Address of the TCP/RTSP listener. This is needed only when encryption is "no" or "optional". +rtspAddress: :8554 +# Address of the TCP/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 rtspTransports and encryption is "no" or "optional". +rtpAddress: :8000 +# Address of the UDP/RTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "no" or "optional". +rtcpAddress: :8001 +# IP range of all UDP-multicast listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastIPRange: 224.1.0.0/16 +# Port of all UDP-multicast/RTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTPPort: 8002 +# Port of all UDP-multicast/RTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTCPPort: 8003 +# Address of the UDP/SRTP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtpAddress: :8004 +# Address of the UDP/SRTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtcpAddress: :8005 +# Port of all UDP-multicast/SRTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTPPort: 8006 +# Port of all UDP-multicast/SRTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTCPPort: 8007 +# 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 +rtspServerKey: server.key +# Path to the server certificate. This is needed only when encryption is "strict" or "optional". +rtspServerCert: server.crt +# Authentication methods. Available are "basic" and "digest". +# "digest" doesn't provide any additional security and is available for compatibility only. +rtspAuthMethods: [basic] + +############################################### +# Global settings -> RTMP server + +# Enable publishing and reading streams with the RTMP protocol. +rtmp: true +# Use the secure protocol variant (RTMP). +# Available values are "no", "strict", "optional". +rtmpEncryption: "no" +# Address of the RTMP listener. This is needed only when encryption is "no" or "optional". +rtmpAddress: :1935 +# 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 + +############################################### +# Global settings -> HLS server + +# Enable reading streams with the HLS protocol. +hls: true +# Address of the HLS listener. +hlsAddress: :8888 +# Enable HTTPS on the HLS server. +# This is required for Low-Latency HLS to function correctly on Apple devices. +hlsEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +hlsAllowOrigins: ['*'] +# 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: [] +# 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: false +# 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 +# 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: '' +# The muxer will be closed when there are no +# reader requests and this amount of time has passed. +hlsMuxerCloseAfter: 60s +paths: + live/1_0: + source: publisher + # Erzwinge, dass Audio und Video synchron bleiben + overridePublisher: yes + +############################################### +# Global settings -> WebRTC server + +# Enable publishing and reading streams with the WebRTC protocol. +webrtc: true +# Address of the WebRTC HTTP listener. +webrtcAddress: :8889 +# Enable HTTPS on the WebRTC server. +# This covers only the WebRTC handshake and does not influence the encryption of WebRTC streams +# which are always encrypted, with a key that is exchanged during the WebRTC handshake. +webrtcEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +webrtcAllowOrigins: ['*'] +# 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: [] +# Address of a local UDP listener that will receive connections. +# Use a blank string to disable. +webrtcLocalUDPAddress: :8189 +# Address of a local TCP listener that will receive connections. +# This is disabled by default since TCP is less efficient than UDP and +# introduces a progressive delay when network is congested. +webrtcLocalTCPAddress: '' +# WebRTC clients need to know the IP of the server. +# Gather IPs from interfaces and send them to clients. +webrtcIPsFromInterfaces: true +# Interfaces whose IPs will be sent to clients. +# An empty value means to use all available interfaces. +webrtcIPsFromInterfacesList: [] +# Additional hosts or IPs to send to clients. +webrtcAdditionalHosts: [] +# ICE servers. Needed only when local listeners can't be reached by clients. +# STUN servers allows to obtain and share the public IP of the server. +# TURN/TURNS servers forces all traffic through them. +webrtcICEServers2: [] + # - 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: '' + # clientOnly: false +# Maximum time to gather STUN candidates. +webrtcSTUNGatherTimeout: 5s +# Time to wait for the WebRTC handshake to complete. +webrtcHandshakeTimeout: 10s +# Maximum time to gather tracks. +webrtcTrackGatherTimeout: 2s + +############################################### +# Global settings -> SRT server + +# Enable publishing and reading streams with the SRT protocol. +srt: true +# Address of the SRT listener. +srtAddress: :8890 + +############################################### +# Default path settings + +# Settings in "pathDefaults" are applied anywhere, +# unless they are overridden in "paths". +pathDefaults: + + ############################################### + # Default path settings -> General + + # Source of the stream. This can be: + # * publisher -> the stream is provided by a RTSP, RTMP, WebRTC or SRT client + # * rtsp://existing-url -> the stream is pulled from another RTSP server / camera + # * rtsps://existing-url -> the stream is pulled from another RTSP server / camera with RTSPS + # * rtsp+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTP tunneling + # * rtsps+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTPS tunneling + # * rtsp+ws://existing-url -> the stream is pulled from another RTSP server / camera, with WebSocket tunneling + # * rtsps+ws://existing-url -> the stream is pulled from another RTSP server / camera, with secure WebSocket tunneling + # * rtmp://existing-url -> the stream is pulled from another RTMP server / camera + # * rtmps://existing-url -> the stream is pulled from another RTMP server / camera with RTMPS + # * http://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera + # * https://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera with HTTPS + # * udp+mpegts://ip:port -> the stream is pulled from MPEG-TS over UDP, by listening on the specified address + # * unix+mpegts://socket -> the stream is pulled from MPEG-TS over Unix socket, by using the socket + # * udp+rtp://ip:port -> the stream is pulled from RTP over UDP, by listening on the specified address + # * srt://existing-url -> the stream is pulled from another SRT server / camera + # * whep://existing-url -> the stream is pulled from another WebRTC server / camera with HTTP+WHEP + # * wheps://existing-url -> the stream is pulled from another WebRTC server / camera with HTTPS+WHEP + # * redirect -> the stream is provided by another path or server + # * rpiCamera -> the stream is provided by a Raspberry Pi Camera + # The following variables can be used in the source string: + # * $MTX_QUERY: query parameters (passed by first reader) + # * $G1, $G2, ...: regular expression groups, if path name is + # a regular expression. + source: publisher + # If the source is a URL, and the source TLS certificate is self-signed + # or invalid, you can provide the fingerprint of the certificate in order to + # validate it anyway. It can be obtained by running: + # openssl s_client -connect source_ip:source_port /dev/null | sed -n '/BEGIN/,/END/p' > server.crt + # openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' + sourceFingerprint: + # If the source is a URL, it will be pulled only when at least + # one reader is connected, saving bandwidth. + sourceOnDemand: false + # If sourceOnDemand is "yes", readers will be put on hold until the source is + # ready or until this amount of time has passed. + sourceOnDemandStartTimeout: 10s + # If sourceOnDemand is "yes", the source will be closed when there are no + # readers connected and this amount of time has passed. + sourceOnDemandCloseAfter: 10s + # Maximum number of readers. Zero means no limit. + maxReaders: 0 + # SRT encryption passphrase required to read from this path. + srtReadPassphrase: + # Use absolute timestamp of frames, instead of replacing them with the current time. + useAbsoluteTimestamp: false + + ############################################### + # Default path settings -> Always available + + # Enable always-available mode, in which a offline segment is played on repeat when the stream is not available. + alwaysAvailable: false + # Tracks of the default offline segment. + alwaysAvailableTracks: [] + # Available values are: AV1, VP9, H265, H264, Opus, MPEG4Audio, G711, LPCM + # - codec: H264 + # # in case of MPEG4Audio, G711, LPCM, sampleRate and ChannelCount must be provided too. + # sampleRate: 48000 + # channelCount: 2 + # # in case of G711, muLaw must be provided too. + # muLaw: false + # A MP4 file can be used instead of the default offline segment. + alwaysAvailableFile: '' + + ############################################### + # Default path settings -> Record + + # Record streams to disk. + record: false + # Path of recording segments. + # Extension is added automatically. + # Available variables are %path (path name), %Y %m %d (year, month, day), + # %H %M %S (hours, minutes, seconds), %f (microseconds), %z (time zone), %s (unix epoch). + recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f + # Format of recorded segments. + # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS). + recordFormat: fmp4 + # fMP4 segments are concatenation of small MP4 files (parts), each with this duration. + # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period. + # When a system failure occurs, the last part gets lost. + # Therefore, the part duration is equal to the RPO (recovery point objective). + recordPartDuration: 1s + # This prevents RAM exhaustion. + recordMaxPartSize: 50M + # Minimum duration of each segment. + recordSegmentDuration: 1h + # Delete segments after this timespan. + # Set to 0s to disable automatic deletion. + recordDeleteAfter: 1d + + ############################################### + # Default path settings -> Publisher source (when source is "publisher") + + # Allow another client to disconnect the current publisher and publish in its place. + overridePublisher: true + # SRT encryption passphrase required to publish to this path. + srtPublishPassphrase: + + ############################################### + # Default path settings -> RTSP source (when source is a RTSP or a RTSPS URL) + + # Transport protocol used to pull the stream. available values are "automatic", "udp", "multicast", "tcp". + rtspTransport: automatic + # Support sources that don't provide server ports or use random server ports. This is a security issue + # and must be used only when interacting with sources that require it. + rtspAnyPort: false + # Range header to send to the source, in order to start streaming from the specified offset. + # available values: + # * clock: Absolute time + # * npt: Normal Play Time + # * smpte: SMPTE timestamps relative to the start of the recording + rtspRangeType: + # Available values: + # * clock: UTC ISO 8601 combined date and time string, e.g. 20230812T120000Z + # * npt: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + # * smpte: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + rtspRangeStart: + # Range of ports used as source port in outgoing UDP packets. + rtspUDPSourcePortRange: [10000, 65535] + + ############################################### + # Default path settings -> RTP source (when source is RTP) + + # session description protocol (SDP) of the RTP stream. + rtpSDP: + + ############################################### + # Default path settings -> WebRTC / WHEP source (when source is WHEP) + + # Token to insert in the Authorization: Bearer header. + whepBearerToken: '' + # Maximum time to gather STUN candidates. + whepSTUNGatherTimeout: 5s + # Time to wait for the WebRTC handshake to complete. + whepHandshakeTimeout: 10s + # Maximum time to gather tracks. + whepTrackGatherTimeout: 2s + + ############################################### + # Default path settings -> Redirect source (when source is "redirect") + + # path which clients will be redirected to. + # It can be can be a relative path (i.e. /otherstream) or an absolute RTSP URL. + sourceRedirect: + + ############################################### + # Default path settings -> Raspberry Pi Camera source (when source is "rpiCamera") + + # ID of the camera. + rpiCameraCamID: 0 + # Whether this is a secondary stream. + rpiCameraSecondary: false + # Width of frames. + rpiCameraWidth: 1920 + # Height of frames. + rpiCameraHeight: 1080 + # Flip horizontally. + rpiCameraHFlip: false + # Flip vertically. + rpiCameraVFlip: false + # Brightness [-1, 1]. + rpiCameraBrightness: 0 + # Contrast [0, 16]. + rpiCameraContrast: 1 + # Saturation [0, 16]. + rpiCameraSaturation: 1 + # Sharpness [0, 16]. + rpiCameraSharpness: 1 + # Exposure mode. + # values: normal, short, long, custom. + rpiCameraExposure: normal + # Auto-white-balance mode. + # (auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy or custom). + rpiCameraAWB: auto + # Auto-white-balance fixed gains. This can be used in place of rpiCameraAWB. + # format: [red,blue]. + rpiCameraAWBGains: [0, 0] + # Denoise operating mode (off, cdn_off, cdn_fast, cdn_hq). + rpiCameraDenoise: "off" + # Fixed shutter speed, in microseconds. + rpiCameraShutter: 0 + # Metering mode of the AEC/AGC algorithm (centre, spot, matrix or custom). + rpiCameraMetering: centre + # Fixed gain. + rpiCameraGain: 0 + # EV compensation of the image in range [-10, 10]. + rpiCameraEV: 0 + # Region of interest, in format x,y,width,height (all normalized between 0 and 1). + rpiCameraROI: + # Whether to enable HDR on Raspberry Camera 3. + rpiCameraHDR: false + # Tuning file. + rpiCameraTuningFile: + # Sensor mode, in format [width]:[height]:[bit-depth]:[packing] + # bit-depth and packing are optional. + rpiCameraMode: + # frames per second. + rpiCameraFPS: 30 + # Autofocus mode (auto, manual or continuous). + rpiCameraAfMode: continuous + # Autofocus range (normal, macro or full). + rpiCameraAfRange: normal + # Autofocus speed (normal or fast). + rpiCameraAfSpeed: normal + # Lens position (for manual autofocus only), will be set to focus to a specific distance + # calculated by the following formula: d = 1 / value + # Examples: 0 moves the lens to infinity. + # 0.5 moves the lens to focus on objects 2m away. + # 2 moves the lens to focus on objects 50cm away. + rpiCameraLensPosition: 0.0 + # Autofocus window, in the form x,y,width,height where the coordinates + # are given as a proportion of the entire image. + rpiCameraAfWindow: + # Manual flicker correction period, in microseconds. + rpiCameraFlickerPeriod: 0 + # Enables printing text on each frame. + rpiCameraTextOverlayEnable: false + # Text that is printed on each frame. + # format is the one of the strftime() function. + rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' + # Codec (auto, hardwareH264, softwareH264 or mjpeg). + # When is "auto" and stream is primary, it defaults to hardwareH264 (if available) or softwareH264. + # When is "auto" and stream is secondary, it defaults to mjpeg. + rpiCameraCodec: auto + # Period between IDR frames (when codec is hardwareH264 or softwareH264). + rpiCameraIDRPeriod: 60 + # Bitrate (when codec is hardwareH264 or softwareH264). + rpiCameraBitrate: 5000000 + # Hardware H264 profile (baseline, main or high) (when codec is hardwareH264). + rpiCameraHardwareH264Profile: main + # Hardware H264 level (4.0, 4.1 or 4.2) (when codec is hardwareH264). + rpiCameraHardwareH264Level: '4.1' + # Software H264 profile (baseline, main or high) (when codec is softwareH264). + rpiCameraSoftwareH264Profile: baseline + # Software H264 level (4.0, 4.1 or 4.2) (when codec is softwareH264). + rpiCameraSoftwareH264Level: '4.1' + # M-JPEG JPEG quality (when codec is mjpeg). + rpiCameraMJPEGQuality: 60 + + ############################################### + # Default path settings -> Hooks + + # Command to run when this path is initialized. + # This can be used to publish a stream when the server is launched. + # This is terminated with SIGINT when the program closes. + # The following environment variables are available: + # * MTX_PATH: path name + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnInit: + # Restart the command if it exits. + runOnInitRestart: false + + # Command to run when this path is requested by a reader + # and no one is publishing to this path yet. + # This can be used to publish a stream on demand. + # This is terminated with SIGINT when there are no readers anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by first reader) + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnDemand: + # Restart the command if it exits. + runOnDemandRestart: false + # Readers will be put on hold until the runOnDemand command starts publishing + # or until this amount of time has passed. + runOnDemandStartTimeout: 10s + # The command will be closed when there are no + # readers connected and this amount of time has passed. + runOnDemandCloseAfter: 10s + # Command to run when there are no readers anymore. + # Environment variables are the same of runOnDemand. + runOnUnDemand: + + # Command to run when the stream is ready to be read, whenever it is + # published by a client or pulled from a server / camera. + # This is terminated with SIGINT when the stream is not ready anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by publisher) + # * MTX_SOURCE_TYPE: source type + # * MTX_SOURCE_ID: source ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnReady: + # Restart the command if it exits. + runOnReadyRestart: false + # Command to run when the stream is not available anymore. + # Environment variables are the same of runOnReady. + runOnNotReady: + + # Command to run when a client starts reading. + # This is terminated with SIGINT when a client stops reading. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by reader) + # * MTX_READER_TYPE: reader type + # * MTX_READER_ID: reader ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRead: + # Restart the command if it exits. + runOnReadRestart: false + # Command to run when a client stops reading. + # Environment variables are the same of runOnRead. + runOnUnread: + + # Command to run when a recording segment is created. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentCreate: + + # Command to run when a recording segment is complete. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * MTX_SEGMENT_DURATION: segment duration + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentComplete: + +############################################### +# Path settings + +# Settings in "paths" are applied to specific paths, and the map key +# is the name of the path. +# Any setting in "pathDefaults" can be overridden here. +# 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". +paths: + # example: + # my_camera: + # source: rtsp://my_camera + + # Settings under path "all_others" are applied to all paths that + # do not match another entry. + all_others: diff --git a/mediamtx.yml b/mediamtx.yml new file mode 100644 index 0000000..260f756 --- /dev/null +++ b/mediamtx.yml @@ -0,0 +1,796 @@ +############################################### +# Global settings + +# Settings in this section are applied anywhere. + +############################################### +# Global settings -> General + +# 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] +# When destination is "stdout" or "file", emit logs in structured format (JSONL). +logStructured: false +# When "file" is in logDestinations, this is the file which will receive logs. +logFile: mediamtx.log +# When "syslog" is in logDestinations, use prefix for logs. +sysLogPrefix: mediamtx +# Dump packets to disk. This is useful for debugging. +dumpPackets: false + +# Timeout of read operations. +readTimeout: 10s +# Timeout of write operations. +writeTimeout: 10s +# Size of the queue of outgoing packets. +# A higher value allows to increase throughput, a lower value allows to save RAM. +writeQueueSize: 512 +# Maximum size of outgoing UDP payloads. +# It defaults to the maximum packet size on ethernet (1500) minus IPv6 and UDP headers (48). +# This can be decreased to avoid fragmentation on networks with a low MTU. +udpMaxPayloadSize: 1452 +# Size of the read buffer of every UDP socket. +# This can be increased to decrease packet losses. +# It defaults to the default value of the operating system. +udpReadBufferSize: 0 + +# Command to run when a client connects to the server. +# This is terminated with SIGINT when a client disconnects from the server. +# The following environment variables are available: +# * MTX_CONN_TYPE: connection type +# * MTX_CONN_ID: connection ID +# * RTSP_PORT: RTSP server port +runOnConnect: +# Restart the command if it exits. +runOnConnectRestart: false +# Command to run when a client disconnects from the server. +# Environment variables are the same of runOnConnect. +runOnDisconnect: + +############################################### +# Global settings -> Authentication + +# Authentication method. Available values are: +# * internal: credentials are stored in the configuration file +# * http: an external HTTP URL is contacted to perform authentication +# * jwt: an external identity server provides authentication through JWTs +authMethod: internal + +# Internal authentication. +# Enabled users. +authInternalUsers: + # Default unprivileged user. + # Username. 'any' means any user, including anonymous ones. +- user: any + # Password. Not used in case of 'any' user. + pass: + # IPs or networks allowed to use this user. An empty list means any IP. + ips: [] + # Permissions. + permissions: + # Available actions are: publish, read, playback, api, metrics, pprof. + - action: publish + # Paths can be set to further restrict access to a specific path. + # An empty path means any path. + # Regular expressions can be used by using a tilde as prefix. + path: + - action: read + path: + - action: playback + path: + + # Default administrator. + # This allows to use API, metrics and PPROF without authentication, + # if the IP is localhost. +- user: any + pass: + ips: ['127.0.0.1', '::1'] + permissions: + - action: api + - action: metrics + - action: pprof + +# HTTP-based authentication. +# URL called to perform authentication. Every time a user wants +# to authenticate, the server calls this URL with the POST method +# and a body containing: +# { +# "user": "user", +# "password": "password", +# "token": "token", +# "ip": "ip", +# "action": "publish|read|playback|api|metrics|pprof", +# "path": "path", +# "protocol": "rtsp|rtmp|hls|webrtc|srt", +# "id": "id", +# "query": "query" +# } +# If the response code is 20x, authentication is accepted, otherwise +# it is discarded. +authHTTPAddress: +# If the HTTP authentication URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect auth_http_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authHTTPFingerprint: +# Actions to exclude from HTTP-based authentication. +# Format is the same as the one of user permissions. +authHTTPExclude: +- action: api +- action: metrics +- action: pprof + +# JWT-based authentication. +# Users have to login through an external identity server and obtain a JWT. +# This JWT must contain the claim "mediamtx_permissions" with permissions, +# for instance: +# { +# "mediamtx_permissions": [ +# { +# "action": "publish", +# "path": "somepath" +# } +# ] +# } +# Users are expected to pass the JWT in the Authorization header or as password. +# This is the JWKS URL that will be used to pull (once) the public key that allows +# to validate JWTs. +authJWTJWKS: +# If the JWKS URL has a self-signed or invalid certificate, +# you can provide the fingerprint of the certificate in order to +# validate it anyway. It can be obtained by running: +# openssl s_client -connect jwt_jwks_domain:443 /dev/null | sed -n '/BEGIN/,/END/p' > server.crt +# openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' +authJWTJWKSFingerprint: +# name of the claim that contains permissions. +authJWTClaimKey: mediamtx_permissions +# Actions to exclude from JWT-based authentication. +# Format is the same as the one of user permissions. +authJWTExclude: [] +# allow passing the JWT through query parameters of HTTP requests (i.e. ?jwt=JWT). +# This is a security risk and will be disabled in the future. +authJWTInHTTPQuery: true + +############################################### +# Global settings -> Control API + +# Enable controlling the server through the Control API. +api: false +# Address of the Control API listener. +apiAddress: :9997 +# Enable HTTPS on the Control API server. +apiEncryption: false +# 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 +apiServerKey: server.key +# Path to the server certificate. +apiServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +apiAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +apiTrustedProxies: [] + +############################################### +# Global settings -> Metrics + +# Enable Prometheus-compatible metrics. +metrics: false +# Address of the metrics HTTP listener. +metricsAddress: :9998 +# Enable HTTPS on the Metrics server. +metricsEncryption: false +# 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 +metricsServerKey: server.key +# Path to the server certificate. +metricsServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +metricsAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +metricsTrustedProxies: [] + +############################################### +# Global settings -> PPROF + +# Enable pprof-compatible endpoint to monitor performances. +pprof: false +# Address of the pprof listener. +pprofAddress: :9999 +# Enable HTTPS on the pprof server. +pprofEncryption: false +# 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 +pprofServerKey: server.key +# Path to the server certificate. +pprofServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +pprofAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +pprofTrustedProxies: [] + +############################################### +# Global settings -> Playback server + +# Enable downloading recordings from the playback server. +playback: false +# Address of the playback server listener. +playbackAddress: :9996 +# Enable HTTPS on the playback server. +playbackEncryption: false +# 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 +playbackServerKey: server.key +# Path to the server certificate. +playbackServerCert: server.crt +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +playbackAllowOrigins: ['*'] +# IPs or CIDRs of proxies placed before the HTTP server. +# These proxies can use the X-Forwarded-For header to set the real IP of clients, +# and the X-Forwarded-Proto header to set the original protocol. +playbackTrustedProxies: [] + +############################################### +# Global settings -> RTSP server + +# Enable publishing and reading streams with the RTSP protocol. +rtsp: true +# Enabled RTSP transport protocols. The handshake is always performed with TCP. +rtspTransports: [udp, multicast, tcp] +# Use secure protocol variants (RTSPS, SRTP, SRTCP). +# Available values are "no", "strict", "optional". +rtspEncryption: "no" +# Address of the TCP/RTSP listener. This is needed only when encryption is "no" or "optional". +rtspAddress: :8554 +# Address of the TCP/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 rtspTransports and encryption is "no" or "optional". +rtpAddress: :8000 +# Address of the UDP/RTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "no" or "optional". +rtcpAddress: :8001 +# IP range of all UDP-multicast listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastIPRange: 224.1.0.0/16 +# Port of all UDP-multicast/RTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTPPort: 8002 +# Port of all UDP-multicast/RTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "no" or "optional". +multicastRTCPPort: 8003 +# Address of the UDP/SRTP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtpAddress: :8004 +# Address of the UDP/SRTCP listener. This is needed only when "udp" is in rtspTransports and encryption is "strict" or "optional". +srtcpAddress: :8005 +# Port of all UDP-multicast/SRTP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTPPort: 8006 +# Port of all UDP-multicast/SRTCP listeners. This is needed only when "multicast" is in rtspTransports and encryption is "strict" or "optional". +multicastSRTCPPort: 8007 +# 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 +rtspServerKey: server.key +# Path to the server certificate. This is needed only when encryption is "strict" or "optional". +rtspServerCert: server.crt +# Authentication methods. Available are "basic" and "digest". +# "digest" doesn't provide any additional security and is available for compatibility only. +rtspAuthMethods: [basic] + +############################################### +# Global settings -> RTMP server + +# Enable publishing and reading streams with the RTMP protocol. +rtmp: true +# Use the secure protocol variant (RTMP). +# Available values are "no", "strict", "optional". +rtmpEncryption: "no" +# Address of the RTMP listener. This is needed only when encryption is "no" or "optional". +rtmpAddress: :1935 +# 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 + +############################################### +# Global settings -> HLS server + +# Enable reading streams with the HLS protocol. +hls: true +# Address of the HLS listener. +hlsAddress: :8888 +# Enable HTTPS on the HLS server. +# This is required for Low-Latency HLS to function correctly on Apple devices. +hlsEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +hlsAllowOrigins: ['*'] +# 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: [] +# 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: false +# 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 +# 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: '' +# The muxer will be closed when there are no +# reader requests and this amount of time has passed. +hlsMuxerCloseAfter: 60s + +############################################### +# Global settings -> WebRTC server + +# Enable publishing and reading streams with the WebRTC protocol. +webrtc: true +# Address of the WebRTC HTTP listener. +webrtcAddress: :8889 +# Enable HTTPS on the WebRTC server. +# This covers only the WebRTC handshake and does not influence the encryption of WebRTC streams +# which are always encrypted, with a key that is exchanged during the WebRTC handshake. +webrtcEncryption: false +# 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 +# Allowed CORS origins. +# Supports wildcards: ['http://*.example.com'] +webrtcAllowOrigins: ['*'] +# 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: [] +# Address of a local UDP listener that will receive connections. +# Use a blank string to disable. +webrtcLocalUDPAddress: :8189 +# Address of a local TCP listener that will receive connections. +# This is disabled by default since TCP is less efficient than UDP and +# introduces a progressive delay when network is congested. +webrtcLocalTCPAddress: '' +# WebRTC clients need to know the IP of the server. +# Gather IPs from interfaces and send them to clients. +webrtcIPsFromInterfaces: true +# Interfaces whose IPs will be sent to clients. +# An empty value means to use all available interfaces. +webrtcIPsFromInterfacesList: [] +# Additional hosts or IPs to send to clients. +webrtcAdditionalHosts: [] +# ICE servers. Needed only when local listeners can't be reached by clients. +# STUN servers allows to obtain and share the public IP of the server. +# TURN/TURNS servers forces all traffic through them. +webrtcICEServers2: [] + # - 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: '' + # clientOnly: false +# Maximum time to gather STUN candidates. +webrtcSTUNGatherTimeout: 5s +# Time to wait for the WebRTC handshake to complete. +webrtcHandshakeTimeout: 10s +# Maximum time to gather tracks. +webrtcTrackGatherTimeout: 2s + +############################################### +# Global settings -> SRT server + +# Enable publishing and reading streams with the SRT protocol. +srt: true +# Address of the SRT listener. +srtAddress: :8890 + +############################################### +# Default path settings + +# Settings in "pathDefaults" are applied anywhere, +# unless they are overridden in "paths". +pathDefaults: + + ############################################### + # Default path settings -> General + + # Source of the stream. This can be: + # * publisher -> the stream is provided by a RTSP, RTMP, WebRTC or SRT client + # * rtsp://existing-url -> the stream is pulled from another RTSP server / camera + # * rtsps://existing-url -> the stream is pulled from another RTSP server / camera with RTSPS + # * rtsp+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTP tunneling + # * rtsps+http://existing-url -> the stream is pulled from another RTSP server / camera, with HTTPS tunneling + # * rtsp+ws://existing-url -> the stream is pulled from another RTSP server / camera, with WebSocket tunneling + # * rtsps+ws://existing-url -> the stream is pulled from another RTSP server / camera, with secure WebSocket tunneling + # * rtmp://existing-url -> the stream is pulled from another RTMP server / camera + # * rtmps://existing-url -> the stream is pulled from another RTMP server / camera with RTMPS + # * http://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera + # * https://existing-url/stream.m3u8 -> the stream is pulled from another HLS server / camera with HTTPS + # * udp+mpegts://ip:port -> the stream is pulled from MPEG-TS over UDP, by listening on the specified address + # * unix+mpegts://socket -> the stream is pulled from MPEG-TS over Unix socket, by using the socket + # * udp+rtp://ip:port -> the stream is pulled from RTP over UDP, by listening on the specified address + # * srt://existing-url -> the stream is pulled from another SRT server / camera + # * whep://existing-url -> the stream is pulled from another WebRTC server / camera with HTTP+WHEP + # * wheps://existing-url -> the stream is pulled from another WebRTC server / camera with HTTPS+WHEP + # * redirect -> the stream is provided by another path or server + # * rpiCamera -> the stream is provided by a Raspberry Pi Camera + # The following variables can be used in the source string: + # * $MTX_QUERY: query parameters (passed by first reader) + # * $G1, $G2, ...: regular expression groups, if path name is + # a regular expression. + source: publisher + # If the source is a URL, and the source TLS certificate is self-signed + # or invalid, you can provide the fingerprint of the certificate in order to + # validate it anyway. It can be obtained by running: + # openssl s_client -connect source_ip:source_port /dev/null | sed -n '/BEGIN/,/END/p' > server.crt + # openssl x509 -in server.crt -noout -fingerprint -sha256 | cut -d "=" -f2 | tr -d ':' + sourceFingerprint: + # If the source is a URL, it will be pulled only when at least + # one reader is connected, saving bandwidth. + sourceOnDemand: false + # If sourceOnDemand is "yes", readers will be put on hold until the source is + # ready or until this amount of time has passed. + sourceOnDemandStartTimeout: 10s + # If sourceOnDemand is "yes", the source will be closed when there are no + # readers connected and this amount of time has passed. + sourceOnDemandCloseAfter: 10s + # Maximum number of readers. Zero means no limit. + maxReaders: 0 + # SRT encryption passphrase required to read from this path. + srtReadPassphrase: + # Use absolute timestamp of frames, instead of replacing them with the current time. + useAbsoluteTimestamp: false + + ############################################### + # Default path settings -> Always available + + # Enable always-available mode, in which a offline segment is played on repeat when the stream is not available. + alwaysAvailable: false + # Tracks of the default offline segment. + alwaysAvailableTracks: [] + # Available values are: AV1, VP9, H265, H264, Opus, MPEG4Audio, G711, LPCM + # - codec: H264 + # # in case of MPEG4Audio, G711, LPCM, sampleRate and ChannelCount must be provided too. + # sampleRate: 48000 + # channelCount: 2 + # # in case of G711, muLaw must be provided too. + # muLaw: false + # A MP4 file can be used instead of the default offline segment. + alwaysAvailableFile: '' + + ############################################### + # Default path settings -> Record + + # Record streams to disk. + record: false + # Path of recording segments. + # Extension is added automatically. + # Available variables are %path (path name), %Y %m %d (year, month, day), + # %H %M %S (hours, minutes, seconds), %f (microseconds), %z (time zone), %s (unix epoch). + recordPath: ./recordings/%path/%Y-%m-%d_%H-%M-%S-%f + # Format of recorded segments. + # Available formats are "fmp4" (fragmented MP4) and "mpegts" (MPEG-TS). + recordFormat: fmp4 + # fMP4 segments are concatenation of small MP4 files (parts), each with this duration. + # MPEG-TS segments are concatenation of 188-bytes packets, flushed to disk with this period. + # When a system failure occurs, the last part gets lost. + # Therefore, the part duration is equal to the RPO (recovery point objective). + recordPartDuration: 1s + # This prevents RAM exhaustion. + recordMaxPartSize: 50M + # Minimum duration of each segment. + recordSegmentDuration: 1h + # Delete segments after this timespan. + # Set to 0s to disable automatic deletion. + recordDeleteAfter: 1d + + ############################################### + # Default path settings -> Publisher source (when source is "publisher") + + # Allow another client to disconnect the current publisher and publish in its place. + overridePublisher: true + # SRT encryption passphrase required to publish to this path. + srtPublishPassphrase: + + ############################################### + # Default path settings -> RTSP source (when source is a RTSP or a RTSPS URL) + + # Transport protocol used to pull the stream. available values are "automatic", "udp", "multicast", "tcp". + rtspTransport: automatic + # Support sources that don't provide server ports or use random server ports. This is a security issue + # and must be used only when interacting with sources that require it. + rtspAnyPort: false + # Range header to send to the source, in order to start streaming from the specified offset. + # available values: + # * clock: Absolute time + # * npt: Normal Play Time + # * smpte: SMPTE timestamps relative to the start of the recording + rtspRangeType: + # Available values: + # * clock: UTC ISO 8601 combined date and time string, e.g. 20230812T120000Z + # * npt: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + # * smpte: duration such as "300ms", "1.5m" or "2h45m", valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h" + rtspRangeStart: + # Range of ports used as source port in outgoing UDP packets. + rtspUDPSourcePortRange: [10000, 65535] + + ############################################### + # Default path settings -> RTP source (when source is RTP) + + # session description protocol (SDP) of the RTP stream. + rtpSDP: + + ############################################### + # Default path settings -> WebRTC / WHEP source (when source is WHEP) + + # Token to insert in the Authorization: Bearer header. + whepBearerToken: '' + # Maximum time to gather STUN candidates. + whepSTUNGatherTimeout: 5s + # Time to wait for the WebRTC handshake to complete. + whepHandshakeTimeout: 10s + # Maximum time to gather tracks. + whepTrackGatherTimeout: 2s + + ############################################### + # Default path settings -> Redirect source (when source is "redirect") + + # path which clients will be redirected to. + # It can be can be a relative path (i.e. /otherstream) or an absolute RTSP URL. + sourceRedirect: + + ############################################### + # Default path settings -> Raspberry Pi Camera source (when source is "rpiCamera") + + # ID of the camera. + rpiCameraCamID: 0 + # Whether this is a secondary stream. + rpiCameraSecondary: false + # Width of frames. + rpiCameraWidth: 1920 + # Height of frames. + rpiCameraHeight: 1080 + # Flip horizontally. + rpiCameraHFlip: false + # Flip vertically. + rpiCameraVFlip: false + # Brightness [-1, 1]. + rpiCameraBrightness: 0 + # Contrast [0, 16]. + rpiCameraContrast: 1 + # Saturation [0, 16]. + rpiCameraSaturation: 1 + # Sharpness [0, 16]. + rpiCameraSharpness: 1 + # Exposure mode. + # values: normal, short, long, custom. + rpiCameraExposure: normal + # Auto-white-balance mode. + # (auto, incandescent, tungsten, fluorescent, indoor, daylight, cloudy or custom). + rpiCameraAWB: auto + # Auto-white-balance fixed gains. This can be used in place of rpiCameraAWB. + # format: [red,blue]. + rpiCameraAWBGains: [0, 0] + # Denoise operating mode (off, cdn_off, cdn_fast, cdn_hq). + rpiCameraDenoise: "off" + # Fixed shutter speed, in microseconds. + rpiCameraShutter: 0 + # Metering mode of the AEC/AGC algorithm (centre, spot, matrix or custom). + rpiCameraMetering: centre + # Fixed gain. + rpiCameraGain: 0 + # EV compensation of the image in range [-10, 10]. + rpiCameraEV: 0 + # Region of interest, in format x,y,width,height (all normalized between 0 and 1). + rpiCameraROI: + # Whether to enable HDR on Raspberry Camera 3. + rpiCameraHDR: false + # Tuning file. + rpiCameraTuningFile: + # Sensor mode, in format [width]:[height]:[bit-depth]:[packing] + # bit-depth and packing are optional. + rpiCameraMode: + # frames per second. + rpiCameraFPS: 30 + # Autofocus mode (auto, manual or continuous). + rpiCameraAfMode: continuous + # Autofocus range (normal, macro or full). + rpiCameraAfRange: normal + # Autofocus speed (normal or fast). + rpiCameraAfSpeed: normal + # Lens position (for manual autofocus only), will be set to focus to a specific distance + # calculated by the following formula: d = 1 / value + # Examples: 0 moves the lens to infinity. + # 0.5 moves the lens to focus on objects 2m away. + # 2 moves the lens to focus on objects 50cm away. + rpiCameraLensPosition: 0.0 + # Autofocus window, in the form x,y,width,height where the coordinates + # are given as a proportion of the entire image. + rpiCameraAfWindow: + # Manual flicker correction period, in microseconds. + rpiCameraFlickerPeriod: 0 + # Enables printing text on each frame. + rpiCameraTextOverlayEnable: false + # Text that is printed on each frame. + # format is the one of the strftime() function. + rpiCameraTextOverlay: '%Y-%m-%d %H:%M:%S - MediaMTX' + # Codec (auto, hardwareH264, softwareH264 or mjpeg). + # When is "auto" and stream is primary, it defaults to hardwareH264 (if available) or softwareH264. + # When is "auto" and stream is secondary, it defaults to mjpeg. + rpiCameraCodec: auto + # Period between IDR frames (when codec is hardwareH264 or softwareH264). + rpiCameraIDRPeriod: 60 + # Bitrate (when codec is hardwareH264 or softwareH264). + rpiCameraBitrate: 5000000 + # Hardware H264 profile (baseline, main or high) (when codec is hardwareH264). + rpiCameraHardwareH264Profile: main + # Hardware H264 level (4.0, 4.1 or 4.2) (when codec is hardwareH264). + rpiCameraHardwareH264Level: '4.1' + # Software H264 profile (baseline, main or high) (when codec is softwareH264). + rpiCameraSoftwareH264Profile: baseline + # Software H264 level (4.0, 4.1 or 4.2) (when codec is softwareH264). + rpiCameraSoftwareH264Level: '4.1' + # M-JPEG JPEG quality (when codec is mjpeg). + rpiCameraMJPEGQuality: 60 + + ############################################### + # Default path settings -> Hooks + + # Command to run when this path is initialized. + # This can be used to publish a stream when the server is launched. + # This is terminated with SIGINT when the program closes. + # The following environment variables are available: + # * MTX_PATH: path name + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnInit: + # Restart the command if it exits. + runOnInitRestart: false + + # Command to run when this path is requested by a reader + # and no one is publishing to this path yet. + # This can be used to publish a stream on demand. + # This is terminated with SIGINT when there are no readers anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by first reader) + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnDemand: + # Restart the command if it exits. + runOnDemandRestart: false + # Readers will be put on hold until the runOnDemand command starts publishing + # or until this amount of time has passed. + runOnDemandStartTimeout: 10s + # The command will be closed when there are no + # readers connected and this amount of time has passed. + runOnDemandCloseAfter: 10s + # Command to run when there are no readers anymore. + # Environment variables are the same of runOnDemand. + runOnUnDemand: + + # Command to run when the stream is ready to be read, whenever it is + # published by a client or pulled from a server / camera. + # This is terminated with SIGINT when the stream is not ready anymore. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by publisher) + # * MTX_SOURCE_TYPE: source type + # * MTX_SOURCE_ID: source ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnReady: + # Restart the command if it exits. + runOnReadyRestart: false + # Command to run when the stream is not available anymore. + # Environment variables are the same of runOnReady. + runOnNotReady: + + # Command to run when a client starts reading. + # This is terminated with SIGINT when a client stops reading. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_QUERY: query parameters (passed by reader) + # * MTX_READER_TYPE: reader type + # * MTX_READER_ID: reader ID + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRead: + # Restart the command if it exits. + runOnReadRestart: false + # Command to run when a client stops reading. + # Environment variables are the same of runOnRead. + runOnUnread: + + # Command to run when a recording segment is created. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentCreate: + + # Command to run when a recording segment is complete. + # The following environment variables are available: + # * MTX_PATH: path name + # * MTX_SEGMENT_PATH: segment file path + # * MTX_SEGMENT_DURATION: segment duration + # * RTSP_PORT: RTSP server port + # * G1, G2, ...: regular expression groups, if path name is + # a regular expression. + runOnRecordSegmentComplete: + +############################################### +# Path settings + +# Settings in "paths" are applied to specific paths, and the map key +# is the name of the path. +# Any setting in "pathDefaults" can be overridden here. +# 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". +paths: + # example: + # my_camera: + # source: rtsp://my_camera + + # Settings under path "all_others" are applied to all paths that + # do not match another entry. + all_others: diff --git a/serve_to_plex.sh b/serve_to_plex.sh new file mode 100755 index 0000000..9b05a5c --- /dev/null +++ b/serve_to_plex.sh @@ -0,0 +1 @@ +python3 -m http.server 8088 diff --git a/sky_epg.xml b/sky_epg.xml new file mode 100644 index 0000000..7ee8e04 --- /dev/null +++ b/sky_epg.xml @@ -0,0 +1,10 @@ + + + + cftv + + + ALL IN - Die Bundesliga Highlight Show: 26. Spieltag + + +