Sincronizzare i flussi di lavoro multimediali con i contenuti in live streaming utilizzando il timecode

Questa pagina descrive come sincronizzare i flussi di lavoro multimediali con i contenuti in live streaming nell'API Live Stream utilizzando il timecode. La funzione timecode consente di passare gli input di timecode, forniti come dati in banda, nei manifest di riproduzione. Potrai quindi sincronizzare i flussi di lavoro multimediali interni con i contenuti del live streaming. Ad esempio, puoi associare le annotazioni di metadati generate in modo indipendente ai contenuti del live streaming o allineare i contenuti trasmessi interni all'output dell'API Live Stream.

I dati di timecode devono essere conformi alla specifica SMPTE 12 M (vedi ST 12-2:2008). Per H264, i dati del codice temporale vengono trasferiti nel messaggio SEI (Informazioni supplementari sul miglioramento della sincronizzazione immagine). Per H265, i dati del timecode sono riportati nel messaggio SEI del timecode.

Usa timecode incorporato

Per utilizzare il timecode incorporato in un flusso di input, aggiungi quanto segue timecodeConfig alla risorsa Channel:

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

Il valore predefinito del campo source è MEDIA_TIMESTAMP.

Per impostazione predefinita, per interpretare il codice temporale viene utilizzato il fuso orario UTC. Per utilizzare un fuso orario diverso, imposta il campo timeZone o utcOffset:

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

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

Durante l'impostazione del campo timeZone, viene presa in considerazione l'ora legale. Per ulteriori dettagli, consulta Come viene interpretato il codice temporale di input.

Includi timecode nei manifest di output

Puoi impostare il campo useTimecodeAsTimeline su true per includere il timecode per ciascun manifest di output:

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

File manifest HLS

Per i live streaming HLS, il timecode viene emesso sotto forma di tag #EXT-X-PROGRAM-DATE-TIME per ogni segmento nel file manifest M3U8 multimediale ed è simile al seguente:

#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 contiene dati del codice temporale generati secondo il formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, dove:

  • YYYY indica l'anno di quattro cifre
  • MM indica il mese di due cifre (ad esempio, 03 è marzo)
  • DD indica il giorno del mese a due cifre (da 01 a 31)
  • T è un carattere impostato che indica l'inizio dell'elemento temporale
  • hh corrisponde alle due cifre dell'ora (da 00 a 23, AM/PM non incluse)
  • mm corrisponde alle due cifre di un minuto (da 00 a 59)
  • ss corrisponde alle due cifre di un secondo (da 00 a 59)
  • mmm corrisponde alle tre cifre di un millisecondo (da 000 a 999)
  • TZD è l'identificatore del fuso orario (Z, ±hh:mm). La Z rappresenta il fuso orario UTC e i valori + o - indicano quanto avanti o indietro rispetto al fuso orario UTC.

File manifest DASH

Per i live streaming DASH, l'attributo availabilityStartTime nel file manifest MPD è impostato sul timecode iniziale ed è simile al seguente:

<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 contiene dati del codice temporale generati secondo il formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, dove:

  • YYYY indica l'anno di quattro cifre
  • MM indica il mese di due cifre (ad esempio, 03 è marzo)
  • DD indica il giorno del mese a due cifre (da 01 a 31)
  • T è un carattere impostato che indica l'inizio dell'elemento temporale
  • hh corrisponde alle due cifre dell'ora (da 00 a 23, AM/PM non incluse)
  • mm corrisponde alle due cifre di un minuto (da 00 a 59)
  • ss corrisponde alle due cifre di un secondo (da 00 a 59)
  • mmm corrisponde alle tre cifre di un millisecondo (da 000 a 999)
  • TZD è l'identificatore del fuso orario (Z, ±hh:mm). La Z rappresenta il fuso orario UTC e i valori + o - indicano quanto avanti o indietro rispetto al fuso orario UTC.

Modalità di analisi dei dati del timecode

Il timecode incorporato viene analizzato a partire dal primo frame del video. I timestamp dei media di output vengono avanzati frame per frame in seguito. Non esiste una risincronizzazione tra i tempi di ingresso e di uscita fino a quando il flusso di input non viene scollegato e ricollegato.

Poiché il timestamp del video è sostituito dal timestamp generato dal timecode, gli eventi del canale devono seguire l'orologio del timecode per poter essere eseguiti correttamente in un orario specificato.

La tempistica può essere allineata sui flussi ridondanti se il generatore di timecode nella pipeline di produzione è lo stesso o è bloccato su entrambi i codificatori principali e di backup (vedi il video Che cos'è il blocco dell'output?).

Come viene interpretato il timecode di input

Il codice temporale in un messaggio SEI di temporizzazione delle immagini contiene solo l'ora (16:30:00;10). Per includere il timecode nei file manifest di output, sono obbligatorie sia la data che l'ora, ad esempio l'ora completa (2021-12-06T16:30:00.333Z) o l'ora del periodo (1638837000333).

Quando si interpreta il timecode SEI come formato data/ora, l'API Live Stream presuppone sempre che lo stream di input in entrata sia in diretta o quasi in diretta. L'API Live Stream utilizza il fuso orario specificato nell'elemento timecodeConfig del canale per interpretare il codice temporale SEI in modo che sia il più vicino possibile, ma non successiva all'ora attuale.

Ad esempio, supponiamo che l'API Live Stream riceva uno stream di input all'ora attuale di 2021-12-06T21:00:00Z nel fuso orario UTC. La tabella seguente mostra come il timecode SEI viene convertito nel formato data/ora:

ID fuso orario Timecode SEI Interpretato come ora locale Interpretato come in UTC
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

Tieni presente che le ore interpretate non sono mai successive all'ora UTC corrente di 2021-12-06T21:00:00Z.