34C3 CDN

Architektur

Die CDN-Kaskade hat 4 Stufen

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 allen 3 Audiospuren.

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) Icecast auf Port 7999 gepusht (http://encoderX.lan.c3voc.de:7999/sX). live.lan.c3voc.de pullt diesen und bietet ihn seinerseits auf http://live.lan.c3voc.de:7999/sX an.

2. Transcoder

Das Transcoding läuft im CCL auf den Minions 1, 5 und 6 (die Minions der neusten Generation). Dabei sind die Räume wie folgt auf die Minions verteilt:

minion1: s1

minion2: s2

minion3: s3 & s4

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

Die Transcoding-Scripte holen sich die Master-Streams von http://live.lan.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 werden: 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.lan.c3voc.de 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

3. Fanout

Diese 3 Format-Streams je Raum werden von der nächsten Stufe auf live.lan.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 und hls sowie sX_[native|translated|translated-2].[mp3|opus] erzeugt. Die WebM- und die Audio-Streams werden gegen den Icecast auf http://live.lan.c3voc.de:8000/ gepusht, die HLS-Streams werden vom nginx unter http://live.lan.c3voc.de/hls/ angeboten.

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

Zusätzlich werden vom Ansible Master-Playlisten für jede Sprache in jedem Raum aus folgendem Template erzeugt: https://github.com/voc/cm/blob/master/ansible/roles/relay/templates/fanout/hls_master.m3u8.j2. Diese Master-Playlisten erlauben ein nahtloses umschalten auf verschiedene Qualitätsstufen von Kompatiblen Geräten (insb. iOS/macOS).

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

4. Transport- und Edge-Nodes

Die (Non-Public) Transport-Nodes ziehen alle Daten via Icecast oder nginx-Proxy-Konfiguration von live.lan.c3voc.de. Die (Public) Edge-Nodes ziehen ihre Daten von den jeweiligen Transport-Nodes.

Testdaten

Streamdump des mkv-multiformat-Streams wie ihn die encoder produzieren werden (mit 2 Video und 3 Audiospuren): https://c3voc.mazdermind.de/volatile/main-plus-slides-with-two-translations-stream.mkv