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 angibthh
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 angibthh
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.