128 lines
3.5 KiB
Bash
Executable File
128 lines
3.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Startet OBS mit einem eigenen Profil und sendet sofort an MediaMTX.
|
|
#
|
|
# Das Profil legt fest, wohin gesendet wird; die Szene, was gesendet wird.
|
|
# Beide liegen neben deiner normalen OBS-Konfiguration und fassen sie nicht an.
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
[ -f .env ] || { echo "Keine .env gefunden."; exit 1; }
|
|
set -a; . ./.env; set +a
|
|
|
|
: "${MTX_SENDEPASSWORT:?MTX_SENDEPASSWORT fehlt in der .env}"
|
|
|
|
# Ohne Argument lokal, sonst der übergebene Host
|
|
ZIEL="${1:-127.0.0.1}"
|
|
PROFIL="filmabend"
|
|
BASIS="$HOME/.config/obs-studio/basic"
|
|
P="$BASIS/profiles/$PROFIL"
|
|
|
|
command -v obs > /dev/null || { echo "OBS ist nicht installiert."; exit 1; }
|
|
|
|
# Ohne laufenden MediaMTX bricht OBS mit "is offline" ab — das steht dann
|
|
# nur im OBS-Log und man sucht lange.
|
|
if ! timeout 3 bash -c "</dev/tcp/${ZIEL}/1935" 2>/dev/null; then
|
|
echo "Auf $ZIEL:1935 antwortet nichts."
|
|
[ "$ZIEL" = "127.0.0.1" ] && echo "Starte MediaMTX mit: make mtx"
|
|
exit 1
|
|
fi
|
|
|
|
scripts/ton.sh auf
|
|
|
|
mkdir -p "$P" "$BASIS/scenes"
|
|
|
|
# Sendeziel jedes Mal neu schreiben — es hängt am Argument
|
|
cat > "$P/service.json" <<JSON
|
|
{
|
|
"settings": {
|
|
"bwtest": false,
|
|
"key": "filmabend?user=sender&pass=$MTX_SENDEPASSWORT",
|
|
"server": "rtmp://$ZIEL:1935/",
|
|
"use_auth": false
|
|
},
|
|
"type": "rtmp_custom"
|
|
}
|
|
JSON
|
|
|
|
# Einstellungen nur anlegen, nicht überschreiben — du willst Bitrate und
|
|
# Auflösung vielleicht anpassen
|
|
if [ ! -f "$P/basic.ini" ]; then
|
|
cat > "$P/basic.ini" <<'INI'
|
|
[General]
|
|
Name=filmabend
|
|
|
|
[Video]
|
|
BaseCX=1920
|
|
BaseCY=1080
|
|
OutputCX=1920
|
|
OutputCY=1080
|
|
FPSType=0
|
|
FPSCommon=60
|
|
|
|
[Output]
|
|
Mode=Simple
|
|
|
|
[SimpleOutput]
|
|
VBitrate=9000
|
|
ABitrate=160
|
|
StreamEncoder=x264
|
|
Preset=veryfast
|
|
UseAdvanced=true
|
|
x264Settings=keyint=60 min-keyint=60 scenecut=0 bframes=0
|
|
|
|
[Audio]
|
|
SampleRate=48000
|
|
ChannelSetup=Stereo
|
|
INI
|
|
fi
|
|
|
|
# Szene ebenfalls nur beim ersten Mal. Die PipeWire-Quelle fragt beim Start,
|
|
# welches Fenster du senden willst.
|
|
if [ ! -f "$BASIS/scenes/$PROFIL.json" ]; then
|
|
cat > "$BASIS/scenes/$PROFIL.json" <<'JSON'
|
|
{
|
|
"current_scene": "Filmabend",
|
|
"current_program_scene": "Filmabend",
|
|
"name": "filmabend",
|
|
"scene_order": [{"name": "Filmabend"}],
|
|
"sources": [
|
|
{
|
|
"id": "pipewire-window-capture-source",
|
|
"name": "Fenster",
|
|
"settings": {"cursor": false},
|
|
"versioned_id": "pipewire-window-capture-source"
|
|
},
|
|
{
|
|
"id": "pulse_output_capture",
|
|
"name": "Ton",
|
|
"settings": {"device_id": "filmabend.monitor"},
|
|
"versioned_id": "pulse_output_capture"
|
|
},
|
|
{
|
|
"id": "scene",
|
|
"name": "Filmabend",
|
|
"settings": {
|
|
"items": [
|
|
{"name": "Fenster", "visible": true, "pos": {"x": 0.0, "y": 0.0},
|
|
"scale": {"x": 1.0, "y": 1.0}, "align": 5, "bounds_type": 2,
|
|
"bounds": {"x": 1920.0, "y": 1080.0}},
|
|
{"name": "Ton", "visible": true}
|
|
]
|
|
},
|
|
"versioned_id": "scene"
|
|
}
|
|
]
|
|
}
|
|
JSON
|
|
fi
|
|
|
|
echo "Sende an rtmp://$ZIEL:1935/filmabend"
|
|
echo "OBS fragt gleich, welches Fenster übertragen werden soll."
|
|
echo "Beenden: OBS-Fenster schließen oder 'make stream-stop'."
|
|
|
|
# Ohne --minimize-to-tray bleibt das Fenster sichtbar und lässt sich normal
|
|
# schließen. Mit Tray-Symbol ignoriert OBS auch Strg-C im Terminal.
|
|
exec obs --profile "$PROFIL" --collection "$PROFIL" \
|
|
--startstreaming --disable-updater
|