CDN

Diese Doku beschreibt unser Live-Streaming CDN, wie es seit dem 34C3 gilt.

Architektur

Die CDN-Kaskade hat 5 Stufen: Master-Encoder, Transcoder, Fanout, Transport-/Master-Nodes und schließlich Edge-Nodes.

1. Master-Encoder

Das Master-Encoding entsteht auf dem encoder-cube im Saal aus dem Ausgabesignal des Voctomix. Das Master-Encoding enthält den Mix als 1080p25 in h264 sowie die Slides als 1080p5 in h264 sowie aac von bis zu drei Audiospuren (Native, Translated, Translated-2). Wahlweise können die Übersetzerspuren sowie die Slide-Spur weggelassen werden. Alle Spuren werden in einem Matroska-Container verpackt.

Das Master-Encoding wird von einem Script erzeugt, welches vom ansible aus folgendem Template erzeugt wird: https://github.com/voc/cm/blob/master/ansible/roles/encoder/templates/voctomix-scripts/streaming-sink-mkvonly.sh.j2

Das Master-Encoding wird auf den lokalen (= auf dem encoder-cube laufenden) Icedist (= Icecast zur internen Distribution) auf Port 7999 gepusht (http://encoderX.lan.c3voc.de:7999/sX). Der Icedist auf live.ber.c3voc.de pullt diesen und bietet ihn seinerseits auf http://live.ber.c3voc.de:7999/sX an.

Debugging:http://195.54.164.164:7999 (oder http://live.ber.c3voc.de:7999 im Inkognito-Modus damit einen der Browser nicht zu HTTPS zwingen will)

voc@live.ber:/etc/icecast2$ systemctl status icedist 2019-08-20 21:52:20
● icedist.service - distribution Icecast
Loaded: loaded (/etc/systemd/system/icedist.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-07-30 19:50:07 CEST; 3 weeks 0 days ago
Main PID: 794 (icecast2)
Tasks: 25 (limit: 4915)
CGroup: /system.slice/icedist.service
└─794 /usr/bin/icecast2 -c /etc/icecast2/icedist.xml
sudo tail -f /var/log/icedist/error.log

2. Transcoder

Das Transcoding läuft auf Speedy & Tweety im RZ “alb”. Dabei sind die Räume wie folgt verteilt:

speedy: s1, s2, s3, q1 (Freie Push-Quelle), sX (Teststream)

tweety: s4, s5, s6, q2 (Freie Push-Quelle), s23 (Encoder CCCB), s80 (Encoder MUC)

Diese Verteilung wird über Host-Attribute im cm geregelt: https://github.com/voc/cm/blob/master/ansible/event#L48-L49.

Die Transcoding-Scripte holen sich die Master-Streams von http://live.ber.c3voc.de:7999 und erzeugen die fehlenden Formate: vpx-hd/sd/slides, vorbis-audio (für webm), h264-sd sowie mp3/opus-audio.

Die Scripte dazu werden vom ansible aus folgenden Templates erzeugt: https://github.com/voc/cm/tree/master/ansible/roles/transcoder/templates/transcoder

Die drei Scripte (h264, vpx, audio) erzeugen aus dem Master-Stream drei Format-Streams: (sXh264, sXwebm, sX_audio), welche wieder gegen live.ber.c3voc.de:7999 gepusht werden. Diese Format-Streams sind dann unter folgenden URLs verfügbar:

http://live.lan.c3voc.de:7999/sX_h264

http://live.lan.c3voc.de:7999/sX_vpx und

http://live.lan.c3voc.de:7999/sX_audio

Da jeder Format-Stream aus einem einzelnen ffmpeg-Prozess stammt und in einem Container landet sind die darin enthaltenen Videoströme Zeitsynchron zueinander. Die Trennung nach Formaten soll ermöglichem einzelne Format-Transport-Chains bei Problemen neustarten zu können, ohne die andere zu stören.

Die Pull-Quelle und das Push-Ziel ist über Group-Vars konfigurierbar: https://github.com/voc/cm/blob/master/ansible/group_vars/transcoders

Verwaltung

Je nach Event und Situation möchte man ggf. die Verteilugn der Streams zwischen Speedy und Tweety anders einstellen. Dazu existieren auf beiden Rechnern systemd-Targets für jeden Raum. Um einen Überblick über die derzeit aktivierten Transcodings zu erhalten kann folgender Befehl verwendet werden:

voc@tweety.int:~$ systemctl list-units 'trans*' 2018-01-23 0:22:42
UNIT LOAD ACTIVE SUB DESCRIPTION
transcode_s1_audio.service loaded active running Transcoder audio Stream s1
transcode_s1_h264.service loaded active running Transcoder h264 Stream s1
transcode_s1_vpx.service loaded active running Transcoder vpx Stream s1
transcode_s2_audio.service loaded active running Transcoder audio Stream s2
…
transcode_s1.target loaded active active All Transcoders of Stream s1
transcode_s2.target loaded active active All Transcoders of Stream s2
…

Zum auflisten aller verfügbaren Transcoder kann folgender Befehl benutzt werden:

voc@tweety.int:~$ systemctl list-unit-files 'trans*' 2018-01-23 0:35:36
UNIT FILE STATE
transcode_s1_audio.service enabled
transcode_s1_h264.service enabled
transcode_s1_vpx.service enabled
transcode_s2_audio.service enabled
…
transcode_s1.target disabled
transcode_s2.target disabled
transcode_s3.target disabled
transcode_s4.target enabled
transcode_s5.target enabled
transcode_s6.target enabled

Einzelne Räume können über die Targets aktiviert bzw. Deaktiviert werden:

sudo systemctl start transcode_s5.target
sudo systemctl stop transcode_s1.target

3. Fanout

Diese 3 Format-Streams je Raum werden von der nächsten Stufe auf live.ber.c3voc.de in die finalen Streams in allen für Endnutzer angebotenen Kombinationen auseinander gemuxt (=“fanout”).

Dabei entstehen alle Kombinationen aus sX[hd|sd|slides][native|translated|translated-2] in webm, hls und dash sowie sX_[native|translated|translated-2].[mp3|opus] erzeugt. Die WebM- und die Audio-Streams werden gegen den Icecast auf http://live.ber.c3voc.de:8000/ gepusht, die HLS- und DASH-Streams werden vom nginx unter http://live.ber.c3voc.de/hls/ bzw. http://live.ber.c3voc.de/dash/ angeboten.

Die Scripte dazu werden vom ansible aus folgenden Templates erzeugt werden: https://github.com/voc/cm/tree/master/ansible/roles/relay/files/fanout.

Um einen Überblick über die deployten Fanout Skripte zu erhalten kann folgender Befehl verwendet werden:

voc@live.ber:~$ systemctl list-units 'fanout*'

Die Pull-Quelle und das Push-Ziel sowie der Pfad unter dem die HLS/DASH-Schnipsel und Playlisten abgelegt werden ist über Group-Vars konfigurierbar: https://github.com/voc/cm/blob/master/ansible/group_vars/relays#L5

Zu den Aufgaben der fanout-Scripte gehört auch das übermitteln des h264-Videostroms zu Youtube. Die Stream-Keys dazu kommen aus dem KeePass, die Scripte aus dem oben verlinkten Git-Repo.

Youtube ist derzeit deaktiviert und wird üblicherweise nur für den Congress aktiviert.

Das Transcoding und Fanout reagiert dynamisch auf die Konfiguration des Streams der vom encoder-cube gesendet wird. Fehlt die Slides-Spur oder die Translation-Spuren wird diese nicht in den Master-Playlists und Dash-Manifestd für Adaptives streaming angeboten. Dadurch kann von Event zu Event entschieden werden, ob der Einsatz der Slide-Spur bzw. von Translations sinn ergibt. Siehe dazu Audiomapping in Voctomix zu Details wie Translations de/aktiviert werden können.

4. Transport- und Master-Nodes

Im Non-Congress Setup ist live.ber.c3voc.de die einzige (Non-Public) Transport-Node. Die (Public) Edge-Nodes ziehen ihre Daten von dort.

5. Edge-Nodes

Die ganzjährigen Edge-Nodes lauten:

live.bn.c3voc.de

live.alb.c3voc.de

live.dus.c3voc.de

live.self.c3voc.de

live.fem.c3voc.de

Diese pullen alle Icecast-Streams (Port :8000) – nicht die Icedist-Streams – von live.ber.c3voc.de.Für die schlussendliche Auslieferung kommt ein nginx zum Einsatz, der abhängig von der URL Daten von einem der unterschiedlichen Backend proxied:

Für Anfragen zu einem WebM, MP3 oder Opus-Stream (z.B: http://live.x.c3voc.de/sX_native_hd.webm) agiert der nginx als Proxy zu seinem eigenen Icecast. Er übernimmt in dieser Rolle das Aggregieren auf die Ports 80/443 sowie das SSL-Handling (für 443).

Für Anfragen nach HLS oder DASH-Schnipseln, -Playlisten und -Manifests (z.B. http://live.x.c3voc.de/hls/sX_native_hd.m3u8) agiert der nginx als Proxy zur Master-Node live.ber.c3voc.de, von welcher er die angefragten Datein abholt und für einen genau festgelegten Zeitraum zwischenspeichert. Dieser Zeitraum muss dabei mit der Segmentlänge der Playlists abgestimmt sein, um eine Fehlerfreie Wiedergabe zu ermöglichen.

Teststream

Für den Teststream vornach dem Congress (Codename sXnativehd & co.) wurde speedy.lan.c3voc.de als Transcoder für den Stream sX konfiguriert; live.ber.c3voc.de übernimmt das fanout. Der Teststream wird von einem script in einem screen des voc-Benutzers auf live.ber.c3voc.de zugeliefert.

Alle bereitgestellten Test-URLs lauten

VPx-HD:

http://cdn.c3voc.de/sX_native_hd.webm

http://cdn.c3voc.de/sX_translated_hd.webm

http://cdn.c3voc.de/sX_translated-2_hd.webm

VPx-SD:

http://cdn.c3voc.de/sX_native_sd.webm

http://cdn.c3voc.de/sX_translated_sd.webm

http://cdn.c3voc.de/sX_translated-2_sd.webm

VPx-Slides:

http://cdn.c3voc.de/sX_native_slides.webm

http://cdn.c3voc.de/sX_translated_slides.webm

http://cdn.c3voc.de/sX_translated-2_slides.webm

h264-HD:

http://cdn.c3voc.de/hls/sX_native_hd.m3u8

http://cdn.c3voc.de/hls/sX_translated_hd.m3u8

http://cdn.c3voc.de/hls/sX_translated-2_hd.m3u8

h264-SD:

http://cdn.c3voc.de/hls/sX_native_sd.m3u8

http://cdn.c3voc.de/hls/sX_translated_sd.m3u8

http://cdn.c3voc.de/hls/sX_translated-2_sd.m3u8

h264-Slides:

http://cdn.c3voc.de/hls/sX_native_slides.m3u8

http://cdn.c3voc.de/hls/sX_translated_slides.m3u8

http://cdn.c3voc.de/hls/sX_translated-2_slides.m3u8

WebM Multi-Qualität + Multi-Lang

http://cdn.c3voc.de/dash/sX/manifest.mpd

Audio-MP3:

http://cdn.c3voc.de/sX_native.mp3

http://cdn.c3voc.de/sX_translated.mp3

http://cdn.c3voc.de/sX_translated-2.mp3

Audio-Opus:

http://cdn.c3voc.de/sX_native.opus

http://cdn.c3voc.de/sX_translated.opus

http://cdn.c3voc.de/sX_translated-2.opus

Vollständiges deaktivieren des Teststreams

auf speedy.lan.c3voc.de:

sudo systemctl stop transcode_sX.target
sudo systemctl disable transcode_sX.target

auf live.ber.c3voc.de:

sudo systemctl stop fanout_sX.target
sudo systemctl disable fanout_sX.target
screen -rd source-for-teststream
:quit

Loadbalancer

Neben den Transport- und Edge-Relays gibt es noch zwei Loadbalancer:

lb.dus.c3voc.de

lb.alb.c3voc.de

Diese sind sowohl für die Domains streaming.media.ccc.de als auch für cdn.c3voc.de zuständig. Im DNS sind für beide Domains beide Server angegeben, so dass Clients per statistischem Round-Robin auf einen der beiden Server verteilt werden.

streaming.media.ccc.de

Unter dieser Domain liefern beide LBs unabhängig von einander die Streaming-Webseite aus. Die LBs sind dabei komplett unabhängig voneinander und haben auch je eine eigene Konfiguration. Es ist aufgabe des Website-Deployments die Konfiguration synchron zu halten. Durch dieses Setup kann bei Bedarf der jeweilige LB einfach aus der DNS-Rotation herausgenommen werden.

cdn.c3voc.de

Die Domain cdn.c3voc.de wird auf beiden LBs von einem HAProxy bedient. Dieser sortiert eventuell zwischen DTAG und Lokalen Klienten und wählt auf dieser Basis einen des obenstehenden Relays aus. Im unterjährigen Betrieb gibt es keine Unterscheidung: Alle Anfragen werden unter den genannten Relays verteilt.

Der HAProxy verteilt dabei ausschließlich per Redirect, er proxied (entgegen seines Namens) nicht.

RTMP Ingest

Für Spezialanwendungen (z.B. Cam-Only Streaming im Fritz-Studio) existieren die RTMP-Endpunkte q1 und q2 auf live.ber.c3voc.de.Die Push-Targets lauten rtmp://live.ber.c3voc.de/stream/q1 bzw. q2. Eine Systemd-Unit setzt diese dann auf Icedist-Ströme gleichen Namens um, von wo Transcoding und Fanout wie oben beschrieben seinen Weg nehmen.

Achtung: Aufgrund der langen rtmp-Timeouts in ffmpeg kann es bis zu 40 Sekunden dauern, bis die Streams auftauchen und weitere 30 Sekunden, bis alle Formate zur Verfügung stehen. Keine Ungeduld.