SRT = Secure Reliable Transport
Zum Test benutzte Server: s0005 – s0007.
Alle von Hand mit 18.04 installiert (kein Puppet).
SRT Installation:
apt update && apt upgrade -y wget -O srt.zip https://github.com/Haivision/srt/archive/master.zip apt install -y screen psmisc tcpdump unzip tclsh pkg-config cmake libssl-dev build-essential unzip srt.zip cd srt-master ./configure make make install reboot
(reboot nur, wenn es beim Update am Anfang einen neuen Kernel gab)
Folgender Versuchsaufbau:
Mit 2 Servern (5+6)
ffmpeg streamt File nach 127.0.0.1:6001
Es werden 80 SRT Sender in Screens gestartet (start-sender.sh 80), alle erwarten eingangsseitig ´den Stream auf 6001 und senden ihn dann an 80 SRT Empfänger auf einem anderen Server (start-receiver.sh 80).
Dort werden die Streams entgegen genommen und als File weggeschrieben.
Erste Erkenntnis: Die SRT Sender locken den Port bez. abhören. Wenn 80 Sender gestartet werden, überträgt nur 80 den Stream, die anderen Sender sehen ihn noch nicht einmal.
Aber: Wird 80 gekillt, übernimmt direkt 79 für ihn und schreibt nahtlos weiter weg.
Das könnte für Redundanz und Skalierung sehr interessant sein. Leider funktioniert der Massentest auf diese Art nicht.
Nächster Versuch ist ffmpeg als Multicast streamen zu lassen.
#####
ffmpeg, wie auch GStreamer setzen beide den Einsatz eines Demuxers voraus, damit wird der Stream prozessiert und der übertragene Stream ist nicht mehr 1 zu 1 identisch zum Ausgangsmaterial. Dies ist im Hinblick auf einen Checksummenvergleich ungünstig.
Folgender Versuchsaufbau für Multicast:
eth1 der Server 5-7 für internen Traffic konfigurieren
route für Multicast
route add -net 224.0.0.0 netmask 240.0.0.0 eth1
UFW Config:
ufw allow in proto udp to 224.0.0.0/4
ufw allow in proto udp from 224.0.0.0/4
und folgende Zeilen in /etc/ufw/before.rules einfügen:
# allow IGMP -A ufw-before-input -p igmp -d 224.0.0.0/4 -j ACCEPT -A ufw-before-output -p igmp -d 224.0.0.0/4 -j ACCEPT
ufw reload hat zwar keine Fehler gemeldet, aber auch nicht wie erwartet funktioniert. Nach langer Fehlersuche als Verzweiflungstat den UFW komplett deaktiviert und es ging. Wieder aktiviert und es ging immer noch.
s0005 simuliert einen IRD. Ausgabe von Stream als Multicast, in einer screen Session mittels ffmpeg.
s0006 simuliert den/die SRT Empfänger (zu starten bevor die Sender gestartet werden).
Für Massentests wurde ein kleines Script erzeugt:
#!/bin/bash for (( i=1; i<=$1; i++ )) do y=$(seq -f "%02g" $i $i) screen -d -m -S receiver$y bash -c "cd /;stransmit srt://:50$y file://con -f > /mnt/data/test$y.ts" done screen -ls
Zu starten mit ./start-receivers.sh ZAHL, wobei Zahl die Anzahl der zu startenden Empfänger angibt.
Die Empfangenen Streams werden nach /mnt/data/test* weggeschrieben.
Vor einem Test müssen alle Empfänger gestoppt und neu gestartet werden, um vergleichbare Files zu erhalten (killall screen).
s0007 simuliert den Feeder, bzw. Multicast Receiver/ SRT Sender.
Zu starten mit ./start-senders.sh ZAHL, wobei Zahl die Anzahl der zu startenden Empfänger angibt.
#!/bin/bash for (( i=1; i<=$1; i++ )) do y=$(seq -f "%02g" $i $i) screen -d -m -S sender$y bash -c "cd /;stransmit udp://@239.0.0.1:6001?adapter=10.20.0.7 srt://s0006.ntrm.de:50$y -s:500" done screen -ls
Vor einem Test müssen alle Sender gestoppt und neu gestartet werden, da die Empfänger gestoppt und gestartet werden müssen (killall screen).
Die genauen Ergebnisse sind Verschlusssache, aber es funktioniert und das sehr gut. Wer es selbst durchspielen möchte sollte hier alles gefunden haben, was er dazu braucht.