FAST Channels verdienen Geld mit Werbeunterbrechungen. Das gesamte GeschĂ€ftsmodell basiert auf einer einzigen Annahme: Wenn der Kanal sagt âWerbung einblendenâ, hört jedes nachgeschaltete System â der Ad Server, der SSAI Splicer, der Smart-TV Player â dies genau im selben Moment und mit exakt derselben Dauer. SCTE-35 ist das Standardprotokoll, das diese Nachricht ĂŒbermittelt. Wenn dies unbemerkt fehlschlĂ€gt â und stummes Fehlschlagen ist der Standard-Fehlermodus â werden Anzeigen entweder nicht gerendert, zum falschen Zeitpunkt ausgelöst oder haben die falsche LĂ€nge. Der Zuschauer sieht ein Testbild. Die Einnahmen bleiben aus.
Dies ist die technische Geschichte, wie die FAST Channels von mStudio standardkonforme SCTE-35 Cues aus bedienerfreundlichen Eingaben senden und warum wir es als drei Cues pro Unterbrechung anstatt nur einen aufgebaut haben.
Schneller Ăberblick
| Aspekt | Detail |
|---|---|
| Bereich | SCTE-35 Ad-Break-Signalisierung fĂŒr AWS MediaLive FAST Channels |
| Bediener-Workflow | Werbeunterbrechungseditor pro Programm â Position in Sekunden, Dauer in Sekunden |
| Emittierte Cues pro Unterbrechung | Drei â Werbe-Start TimeSignal, SpliceInsert, Werbe-Ende TimeSignal |
| DauerbeschrĂ€nkungen | 10â120 Sekunden, validiert auf der Datenschicht |
| Nachgeschaltete Konsumenten | Player, Ad Server und AWS MediaTailor (konzipiert, aber noch nicht angeschlossen) sind Beispiele. |
| Status | SCTE-35 Cue-Emission in Produktion; SSAI-Integration in Konzeption |
Das GeschÀftsproblem
Jede Werbeunterbrechung auf einem FAST Channel ist ein Einnahmeereignis. Der Kanal sendet einen Marker, der besagt âhier wird eine Anzeige platziert, sie dauert 30 Sekunden, bitte vorbereiten.â Nachgeschaltete Systeme â Google Ad Manager, AWS MediaTailor, regionale Ad Server, Smart-TV Player SDKs â lesen diesen Marker und entscheiden, was eingefĂŒgt werden soll.
Wenn der Marker korrekt ist, lĂ€uft die Werbeunterbrechung sauber ab, die Impression wird gezĂ€hlt und der Betreiber wird bezahlt. Wenn der Marker falsch ist â falsche Dauer, falsche Form, falsches Format â lehnt das Ad System ihn entweder ab (keine Anzeige ausgeliefert) oder akzeptiert ihn fehlerhaft (Anzeige mit falscher LĂ€nge oder eine, die in das nĂ€chste Programm ĂŒbergeht). Beide Ergebnisse kosten echtes Geld und beide schlagen still fehl. Der Kanal streamt weiter. Der Zuschauer sieht ein Testbild oder einen ungeschickten Schnitt. Die Monetarisierungspipeline liefert einfach niedrigere Zahlen und keine Fehlermeldung, der man nachgehen könnte.
Das technische Ziel ist nicht âAnzeigen zu unterstĂŒtzenâ. Es lautet: Jede vom Betreiber definierte Werbeunterbrechung muss bei jedem nachgeschalteten Konsumenten als standardkonformes SCTE-35 Signal ankommen, und zwar jedes Mal genau bei dem vom Betreiber gewĂ€hlten Frame.
Was SCTE-35 tatsÀchlich ist (die 90-Sekunden-Version)
SCTE-35 ist ein Standard zum EinfĂŒgen von Cue-Nachrichten in einen Videostream. Die Cues enthalten keine Werbeinhalte; sie tragen Signale â âWerbeunterbrechung beginnt hierâ, âWerbeunterbrechung endet hierâ, âdieses Segment ist N Sekunden langâ. Das nachgeschaltete System liest diese Signale und reagiert darauf: Eine SSAI-Schicht fĂŒgt ein echtes Werbemittel in das HLS Manifest ein, ein Smart-TV Player löst ein Overlay aus, ein Ad Server protokolliert eine Slot-Möglichkeit.
Zwei Cue-Formen sind fĂŒr unseren Anwendungsfall relevant:
- SpliceInsert â der ursprĂŒngliche SCTE-35 Cue. TrĂ€gt eine SpliceEventId, eine Dauer in Sekunden und ein âOut-of-Networkâ-Flag. Die meisten klassischen Ad Server lesen dies.
- TimeSignal â der neuere, ausdrucksstĂ€rkere Cue. TrĂ€gt einen SegmentationDescriptor mit einer SegmentationTypeId (52 = Provider Ad Start, 53 = Provider Ad End) und einer SegmentationDuration in 90.000-Tick-Einheiten. SSAI Systeme und moderne Player bevorzugen diese Form, da sie sauber ĂŒber Start und Ende hinweg paart.
Beide Formen sind korrekt SCTE-35. Verschiedene nachgeschaltete Konsumenten bevorzugen unterschiedliche. Das Emittieren nur einer Form lÀsst Geld auf dem Tisch liegen.
Warum das wichtig ist. Eine naive Implementierung sendet einen SpliceInsert pro Werbeunterbrechung und betrachtet dies als erledigt. Die Werbeunterbrechung funktioniert auf Àlteren Playern und schlÀgt bei SSAI stillschweigend fehl. Die HÀlfte Ihres Anzeigenbestands wird monetarisiert; die andere HÀlfte nicht. Sie werden nicht wissen, welche welche ist, bis Ihre Einnahmezahlen niedrig ausfallen.
Warum naive AnsÀtze scheitern
Die AbkĂŒrzungen sind verlockend, weil sie alle fast funktionieren.
- âZum Zeitpunkt der Kodierung Werbung in das Originalvideo einfĂŒgen.â Es gibt keinen Raum fĂŒr FlexibilitĂ€t. Der Betreiber kann keine A/B-Tests fĂŒr die Platzierung durchfĂŒhren, Anzeigen nach dem Deployment nicht Ă€ndern, keine regionalen oder zielgruppenorientierten Anzeigen schalten. Der Hauptgrund fĂŒr die Existenz von FAST Channels ist die Monetarisierung desselben Inhalts auf verschiedene Weisen â das Einbrennen von Anzeigen zum Zeitpunkt der Kodierung schlieĂt dies aus.
- âClient-seitige Werbeeinblendung nutzen.â Ad-Blocking ist einfach. Unterschiedlicher Codepfad pro GerĂ€t. Keine serverseitige Personalisierung. Und es umgeht SSAI vollstĂ€ndig, was niedrigere CPMs bedeutet.
- âEinfach einen SpliceInsert pro Unterbrechung senden.â Der hĂ€ufigste Produktionsfehler. Funktioniert bei einigen Playern, wird aber von SSAI Systemen, die TimeSignal Cues zum Paaren von Start/Ende benötigen, stillschweigend ignoriert. Teilweise Monetarisierung, ohne Fehler zur Untersuchung.
- âAlles in 90 kHz Ticks ausdrĂŒcken, weil die Spezifikation sie erwĂ€hnt.â Die Spezifikation ist Ă€rgerlicher als das. SpliceInsert.Duration ist in Sekunden. SegmentationDuration ist in 90 kHz Ticks. Das Verwechseln fĂŒhrt zu Cues, die die Schema-Validierung bestehen und versendet werden, dann aber beim Player als fehlerhafte Dauern scheitern. Der Encoder wird es nicht bemerken. Der Player ĂŒberspringt die Unterbrechung einfach.
- âMediaLive zur BestĂ€tigung zulassen.â Das wird es nicht. MediaLive akzeptiert ĂŒberlappende Unterbrechungen, Unterbrechungen mit Null-Dauer und unmögliche Segmentierungsdauern ohne Beanstandung. Die BestĂ€tigung muss erfolgen, bevor MediaLive die Aktion sieht.
Der Hebel, den wir hatten, war die Grenze zwischen der Operator UI â wo Werbeunterbrechungen nur {position, duration} Paare sind â und dem MediaLive Zeitplan, wo jeder Cue perfekt sein muss.
Unsere Lösung
Die Werbeunterbrechung als erstklassiges Datenobjekt durchgĂ€ngig behandeln. Der Betreiber definiert sie in den einfachstmöglichen Begriffen. Das Backend validiert sie einmal auf der Schema-Schicht. Die Lambda-Funktion ĂŒbersetzt sie zur Deployment-Zeit in einen Drei-Cue-Stack, wobei jeder Cue in der von seiner eigenen Spezifikation geforderten Zeitbasis ausgedrĂŒckt wird. Nichts anderes im Stack muss etwas ĂŒber SCTE-35 wissen â die Ăbersetzung befindet sich in einer Funktion, in derselben Lambda-Funktion, die jede andere Zeitplanaktion besitzt.
Diagramm 1 · End-to-End Anzeigenmarker-Pipeline

Architektur
- Frontend Ad-Break-Editor â Betreiber fĂŒgen Werbeunterbrechungen pro Programm hinzu, indem sie einen Positions-Offset (Sekunden vom Programmstart) und eine Dauer (Sekunden) angeben. Bumper Slots sind Teil des Datenmodells und bereit fĂŒr die Ausspielschicht.
- AdMarker Collection (MongoDB) â ein Dokument pro Programm mit Werbeunterbrechungen, das auf das Video verweist. Das adBreaks[] Array speichert {position, duration}, wobei Mongoose zum Speicherzeitpunkt 10 †duration †120 erzwingt. Bumpers tragen eine adBreakId Referenz fĂŒr die nachgeschaltete Paarung.
- NestJS Backend (schedule.service.ts) â verbindet zur Deployment-Zeit jeden Zeitplan mit seinem AdMarker und benennt Felder gemÀà dem Vertrag der Lambda-Funktion um (position â offsetSeconds, duration â durationSeconds). Ein Bulk-Abruf, kein N+1-Problem.
- Lambda Orchestrator (fastChannel-lambda-fun/index.js) â verantwortet die SCTE-35 Ăbersetzung. FĂŒr jede Werbeunterbrechung wird der Drei-Cue-Stack in denselben BatchUpdateScheduleCommand emittiert, der Eingabewechsel und Wasserzeichen enthĂ€lt. Aktionsnamen werden pro Programm versioniert, damit der Orphan Sweep sie nach einem partiellen Deploy paaren kann.
- AWS MediaLive â empfĂ€ngt die Aktionen, emittiert #EXT-SCTE35 Marker im HLS Manifest zur vom Betreiber gewĂ€hlten Sekunde.
Wichtige technische Entscheidungen
1. Drei Cues pro Werbeunterbrechung, nicht einer
Jede Werbeunterbrechung sendet drei diskrete Aktionen fĂŒr denselben logischen Moment im Programm.
Diagramm 2 · Lebenszyklus einer einzelnen Werbeunterbrechung

Die Start- und End-TimeSignal Cues teilen sich eine SegmentationUpid, damit nachgeschaltete Systeme sie deterministisch paaren können. Der SpliceInsert trÀgt eine eindeutige SpliceEventId zur Deduplizierung auf Player-Ebene. Verschiedene Konsumenten lesen verschiedene Cues. Das Emittieren aller drei deckt jeden Vertrag ab, der uns heute wichtig ist, und jeden plausiblen in der Zukunft.
HĂ€ufiger Produktionsfehler. Senden Sie einen SpliceInsert und gehen Sie davon aus, dass der Rest des Ăkosystems es herausfindet. SSAI Systeme verwerfen stillschweigend Unterbrechungen, denen passende TimeSignal Cues fehlen; klassische Ad Server ignorieren TimeSignal-only Signale. Ohne alle drei wird jede Werbeunterbrechung von einem Teil Ihres nachgeschalteten Stacks monetarisiert und vom Rest ĂŒbersehen â und Sie erfahren dies aus dem Umsatzbericht, nicht aus den Logs.
2. Zwei Zeitbasen, in einer Funktion abgeglichen
SpliceInsert.Duration ist in Sekunden. SegmentationDuration innerhalb eines TimeSignal Deskriptors ist in 90.000-Tick-Einheiten. Dieselbe logische Dauer, zwei Kodierungen â und der hĂ€ufigste SCTE-35 Fehler in der Praxis ist das Verwechseln dieser.
Diagramm 3 · Zeitkonvertierungslogik

Die Konvertierung befindet sich in buildProgramActions und nur dort. Es gibt eine kanonische Stelle, an der man nachsehen muss, wenn eine Cue-Dauer falsch herauskommt, und eine Stelle, die man Àndern muss, wenn sich die Spezifikation jemals weiterentwickelt.
Kompromiss, den wir absichtlich eingegangen sind. Wir hÀtten beide Zeitbasen im AdMarker Dokument speichern und die Lambda-Funktion sie durchkopieren lassen können. Wir haben dies bewusst nicht getan: Das Speichern nur des Sekundenwerts bedeutet, dass es nur eine Zahl gibt, die ein Operator festlegen muss, nur eine Zahl, die validiert werden muss, und nur eine Zahl, die falsch sein kann. Der 90 kHz Wert ist abgeleitet, niemals gespeichert. Abgeleitete Daten können nicht driften.
3. Position ist relativ, Auslösezeit ist absolut
Der Betreiber sagt âWerbeunterbrechung bei 720 Sekunden ins Programm.â Die Lambda-Funktion berechnet die tatsĂ€chliche UTC-Auslösezeit als programStartTime + offsetSeconds Ă 1000 und stempelt diese auf die Aktion. Jede andere Zeitplanaktion â Eingabewechsel, Wasserzeichen ein, Programmende â verwendet dieselbe Offset-zu-Timestamp-Pipeline. Anzeigen-Cues landen auf denselben Frame-Grenzen wie alles andere, ohne Mehrdeutigkeit darĂŒber, welche Uhr die Zeitachse besitzt.
4. Validierung auf der Datenschicht, nicht am Draht
Das AdMarker Schema erzwingt duration â [10, 120] Sekunden zum Mongoose Speicherzeitpunkt. Eine auĂerhalb des Bereichs liegende Unterbrechung erreicht niemals die Lambda-Funktion. Werbeunterbrechungen, die ĂŒber das Programmende hinausgehen wĂŒrden, werden zur Build-Zeit gekĂŒrzt anstatt abgelehnt â Betreiber verlieren ihre Arbeit nicht durch eine einzige schlechte Unterbrechung. Die Arten von Fehlern, die nicht auftreten können, sind interessanter als die, die auftreten können.
5. Cue-Emission von SSAI entkoppelt
Was wir heute ausliefern, ist die Signalisierungsschicht. Die serverseitige Werbeeinblendung ĂŒber AWS MediaTailor â die diese Cues konsumieren wĂŒrde, um echte Werbemittel in das HLS Manifest einzufĂŒgen â ist vollstĂ€ndig konzipiert und noch nicht angeschlossen. Die bewusste Reihenfolge: Zuerst die Cue-Schicht korrekt in Produktion bringen, von echten KanĂ€len verwendet, bevor SSAI aktiviert wird. Wenn die Integration live geht, sind die Cues bereits vorhanden. Das nachgeschaltete System erhĂ€lt vom ersten Tag an einen sauberen Vertrag zur Konsumierung.
Warum diese Reihenfolge wichtig ist. Das Debugging von SSAI ist brutal, wenn Ihre Cues falsch sind, da jeder Fehler wie ein SSAI Fehler aussieht, selbst wenn die Cues fehlerhaft sind. Indem wir die Cue-Schicht zuerst isoliert ausgeliefert und gegen reale Player und Ad Server validiert haben, haben wir eine ganze Kategorie von Integrationsverwirrungen eliminiert, bevor sie ĂŒberhaupt entstehen konnte.
Ergebnisse
- Jede vom Betreiber definierte Werbeunterbrechung sendet einen standardkonformen Drei-Cue SCTE-35 Stack im HLS Manifest des Kanals â zur richtigen Sekunde, gegen die richtige Zeitbasis.
- Die Ăbersetzungsschicht befindet sich in einer Funktion. SpezifikationsĂ€nderungen oder neue nachgeschaltete Konsumenten erfordern eine Ănderung an einer einzigen Datei, nicht eine Suche quer durch die Codebasis.
- Die Dauervalidierung erfolgt auf der Datenschicht, bevor ein Cue den Encoder erreicht. Bedienerfehler werden in der UI sichtbar, nicht stillschweigend zur Sendezeit â fehlerhafte Cues können MediaLive nicht erreichen.
- Die Cue-Generierung ist deterministisch: Identische Bediener-Eingaben erzeugen identische SCTE-35 Aktionen, sodass dieselbe Unterbrechung sich bei jedem Deployment und jedem Kanal gleich verhÀlt.
- Die Signalisierungsschicht ist ausgeliefert und live. Der SSAI Konsument (MediaTailor) ist konzipiert und bereit zur Anbindung â und wenn dies geschieht, werden die Cues jedes bestehenden Kanals bereits darauf warten.
Technologie-Stack: AWS MediaLive · AWS Lambda · NestJS · MongoDB · TypeScript · Node 18 · SCTE-35 (Scte35TimeSignalSettings, Scte35SpliceInsertSettings) · AWS SDK v3

