Medienworkflows mit Livestream-Inhalten über den Zeitcode synchronisieren

Auf dieser Seite wird beschrieben, wie du Medienworkflows mit Live-Streams in der Live Stream API mithilfe von Zeitcodes synchronisierst. Mit der Timecode-Funktion kannst du Timecode-Eingaben, die als In-Band-Daten bereitgestellt werden, an Wiedergabemanifeste übergeben. Anschließend kannst du deine internen Medienworkflows mit den Livestream-Inhalten synchronisieren. Du kannst beispielsweise unabhängig generierte Metadaten-Hinweise mit den Inhalten des Livestreams abgleichen oder interne Übertragungsinhalte mit der Live Stream API-Ausgabe abgleichen.

Die Timecode-Daten müssen der SMPTE 12M-Spezifikation entsprechen (siehe ST 12-2:2008). Bei H264 werden Zeitcodedaten in der SEI-Nachricht (Supplemental Enhancement Information) für die Bildzeit übertragen. Bei H265 werden Zeitcodedaten in der Zeitcode-SEI-Nachricht übertragen.

Eingebetteten Zeitcode verwenden

Wenn du einen in einen Eingabestream eingebetteten Zeitcode verwenden möchtest, füge der Channel-Ressource Folgendes hinzu: timecodeConfig

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE"
}

Der Standardwert für das Feld source ist MEDIA_TIMESTAMP.

Standardmäßig wird die Zeitzone UTC verwendet, um den Zeitcode zu interpretieren. Wenn Sie eine andere Zeitzone verwenden möchten, legen Sie das Feld timeZone oder utcOffset fest:

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE",

  "timeZone": {"id": "America/Los_Angeles"}
  // or
  "utcOffset": "-28800s" // -8 hours from UTC
}

Die Sommerzeit wird beim Festlegen des Felds timeZone berücksichtigt. Weitere Informationen finden Sie unter So wird der eingegebene Zeitcode interpretiert.

Zeitcode in Ausgabemanifesten angeben

Du kannst das Feld useTimecodeAsTimeline auf true festlegen, um einen Zeitcode für jedes Ausgabemanifest anzugeben:

"manifests": [
  {
    "key": "manifest_hls",
    "file_name": "manifest.m3u8",
    "type": "HLS",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  },
  {
    "key": "manifest_dash",
    "file_name": "manifest.mpd",
    "type": "DASH",
    "muxStreams": ["mux_720p", "mux_540p"],
    "useTimecodeAsTimeline": true
  }
]

HLS-Manifestdatei

Bei HLS-Livestreams wird der Zeitcode für jedes Segment in der M3U8-Manifestdatei als #EXT-X-PROGRAM-DATE-TIME-Tag ausgegeben. Er sieht in etwa so aus:

#EXTM3U
#EXT-X-VERSION:7
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-DISCONTINUITY-SEQUENCE:0
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:25.529Z
#EXTINF:1.265922
720p60_h264_ts-0000000000.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:26.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000001.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:28.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000002.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:30.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000003.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:32.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000004.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:34.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000005.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:36.795Z
#EXTINF:2.000000
720p60_h264_ts-0000000006.ts
#EXT-X-PROGRAM-DATE-TIME:2023-04-21T21:49:38.795Z

#EXT-X-PROGRAM-DATE-TIME enthält Zeitcodedaten, die gemäß dem ISO 8601-Format YYYY-MM-DDThh:mm:ss[.mmm]TZD generiert wurden. Dabei gilt:

  • YYYY ist die vierstellige Jahreszahl.
  • MM ist der zweistellige Monat (z. B. 03 für März)
  • DD ist der zweistellige Tag des Monats (01 bis 31)
  • T ist ein festes Zeichen, das den Beginn des Zeitelements angibt
  • hh ist die zweistellige Stundenzahl (00 bis 23, ohne Vormittags-/Nachmittags-Zeitangabe)
  • mm ist die zweistellige Minutenzahl (00 bis 59)
  • ss ist die zweistellige Sekundenzahl (00 bis 59).
  • mmm ist die dreistellige Zahl einer Millisekunde (000 bis 999)
  • TZD ist die Zeitzonenbezeichnung (Z, ±hh:mm). Das „Z“ steht für UTC und die Werte „+“ oder „-“ geben an, wie viele Stunden vor oder nach UTC die Zeit liegt.

DASH-Manifestdatei

Bei DASH-Livestreams ist das Attribut availabilityStartTime in der MPD-Manifestdatei auf den Anfangszeitcode festgelegt und sieht in etwa so aus:

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" profiles="urn:mpeg:dash:profile:isoff-live:2011"
 type="dynamic" minBufferTime="PT4S" mediaPresentationDuration="PT0H0M473.262S"
 availabilityStartTime="2023-05-19T17:44:16.881Z">

availabilityStartTime enthält Zeitcodedaten, die gemäß dem ISO 8601-Format YYYY-MM-DDThh:mm:ss[.mmm]TZD generiert wurden. Dabei gilt:

  • YYYY ist die vierstellige Jahreszahl.
  • MM ist der zweistellige Monat (z. B. 03 für März)
  • DD ist der zweistellige Tag des Monats (01 bis 31)
  • T ist ein festes Zeichen, das den Beginn des Zeitelements angibt
  • hh ist die zweistellige Stundenzahl (00 bis 23, ohne Vormittags-/Nachmittags-Zeitangabe)
  • mm ist die zweistellige Minutenzahl (00 bis 59)
  • ss ist die zweistellige Sekundenzahl (00 bis 59).
  • mmm ist die dreistellige Zahl einer Millisekunde (000 bis 999)
  • TZD ist die Zeitzonenbezeichnung (Z, ±hh:mm). Das „Z“ steht für UTC und die Werte „+“ oder „-“ geben an, wie viele Stunden vor oder nach UTC die Zeit ist.

So werden die Zeitcodedaten geparst

Der eingebettete Zeitcode wird ab dem ersten Videoframe geparst. Die Zeitstempel der Ausgabemedien werden danach Frame für Frame vor- und zurückgedreht. Es erfolgt keine Resynchronisierung zwischen Eingabe- und Ausgabezeiten, bis die Verbindung zum Eingabestream getrennt und wiederhergestellt wird.

Da der Zeitstempel des Videos durch den aus dem Zeitcode generierten Zeitstempel ersetzt wird, müssen Kanalereignisse der Zeitcodeuhr folgen, damit sie zu einer bestimmten Zeit richtig ausgeführt werden.

Das Timing kann für redundante Streams ausgerichtet werden, wenn der Timecode-Generator in der Produktionspipeline derselbe ist oder sowohl auf dem primären als auch auf dem Sicherungs-Beitrags-Encoder gesperrt ist (siehe Video Was ist die Ausgabesperre?).

So wird der eingegebene Zeitcode interpretiert

Der Zeitcode in einer SEI-Nachricht für die Bildzeit enthält nur die Uhrzeit (16:30:00;10). Um den Zeitcode in Ausgabemanifeste aufzunehmen, sind sowohl Datum als auch Uhrzeit erforderlich, z. B. die vollständige Datums- und Uhrzeitangabe (2021-12-06T16:30:00.333Z) oder die Unixzeit (1638837000333).

Bei der Interpretation des SEI-Zeitcodes als Datums-/Uhrzeitformat geht die Live Stream API immer davon aus, dass der eingehende Eingabestream live oder nahezu live ist. Die Live Stream API verwendet die Zeitzone, die in der timecodeConfig des Kanals angegeben ist, um den SEI-Zeitcode so nah wie möglich an der aktuellen Zeit, aber nicht später als die aktuelle Zeit, zu interpretieren.

Angenommen, die Live Stream API empfängt um 2021-12-06T21:00:00Z Uhr (UTC) einen Eingabestream. In der folgenden Tabelle wird gezeigt, wie der SEI-Zeitcode in das Datums-/Uhrzeitformat umgewandelt wird:

Zeitzonen-ID SEI-Timecode Wird in der jeweiligen Ortszeit interpretiert Wird als UTC interpretiert
UTC 16:30:00;10 2021-12-06T16:30:00.333+00:00 2021-12-06T16:30:00.333Z
America/Los_Angeles 16:30:00;10 2021-12-05T16:30:00.333-08:00 2021-12-06T00:30:00.333Z
America/New_York 16:30:00;10 2021-12-05T16:30:00.333-05:00 2021-12-05T21:30:00.333Z
Asia/Bangkok 16:30:00;10 2021-12-06T16:30:00.333+07:00 2021-12-06T09:30:00.333Z
America/Los_Angeles 03:30:00;10 2021-12-06T03:30:00.333-08:00 2021-12-06T11:30:00.333Z
Asia/Bangkok 03:30:00;10 2021-12-07T03:30:00.333+07:00 2021-12-06T20:30:00.333Z

Die interpretierte Zeit darf nie später als die aktuelle UTC-Zeit von 2021-12-06T21:00:00Z sein.