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

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

I dati del codice di tempo devono essere conformi alla specifica SMPTE 12M (vedi ST 12-2:2008). Per H.264, i dati del codice di tempo vengono trasmessi nel messaggio SEI (Supplemental Enhancement Information) per la sincronizzazione delle immagini. Per H265, i dati del timecode vengono trasmessi nel messaggio SEI del timecode.

Utilizzare il timecode incorporato

Per utilizzare il timecode incorporato in uno stream di input, aggiungi il seguente timecodeConfig alla risorsa Channel:

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

Il valore predefinito per il campo source è MEDIA_TIMESTAMP.

Per impostazione predefinita, per interpretare il timecode 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
}

L'ora legale viene presa in considerazione quando viene impostato il campo timeZone. Per ulteriori dettagli, consulta la sezione Come viene interpretato il timecode in input.

Includi il timecode nei manifest di output

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

"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
  }
]

File manifest HLS

Per i live streaming HLS, il timecode viene emesso come tag #EXT-X-PROGRAM-DATE-TIME per ogni segmento nel file manifest M3U8 dei contenuti multimediali e ha un aspetto 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 i dati del codice di tempo generati in base al formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, dove:

  • YYYY è l'anno a quattro cifre
  • MM è il mese a due cifre (ad esempio, 03 è marzo)
  • DD è il giorno del mese a due cifre (da 01 a 31)
  • T è un carattere impostato che indica l'inizio dell'elemento di tempo
  • hh sono le due cifre di un'ora (da 00 a 23, AM/PM non inclusi)
  • mm sono le due cifre di un minuto (da 00 a 59)
  • ss sono le due cifre di un secondo (da 00 a 59)
  • mmm sono le tre cifre di un millisecondo (da 000 a 999)
  • TZD è l'indicatore 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 e ha il seguente aspetto:

<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 i dati del codice di tempo generati in base al formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, dove:

  • YYYY è l'anno a quattro cifre
  • MM è il mese a due cifre (ad esempio, 03 è marzo)
  • DD è il giorno del mese a due cifre (da 01 a 31)
  • T è un carattere impostato che indica l'inizio dell'elemento di tempo
  • hh sono le due cifre di un'ora (da 00 a 23, AM/PM non inclusi)
  • mm sono le due cifre di un minuto (da 00 a 59)
  • ss sono le due cifre di un secondo (da 00 a 59)
  • mmm sono le tre cifre di un millisecondo (da 000 a 999)
  • TZD è l'indicatore 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.

Come vengono analizzati i dati del timecode

Il timecode incorporato viene analizzato dal primo fotogramma del video. I timestamp dei contenuti multimediali di output vengono avanzati frame per frame in un secondo momento. Non viene eseguita alcuna resynchronizzazione tra i tempi di input e di output finché lo stream di input non viene disconnesso e ricollegato.

Poiché il timestamp del video viene sostituito da quello generato dal timecode, gli eventi del canale devono seguire l'orologio del timecode per essere eseguiti correttamente in un momento specifico.

La sincronizzazione può essere allineata su stream ridondanti se il generatore di timecode nella pipeline di produzione è lo stesso o è bloccato sia sui codificatori di contributi principali che su quelli di backup (vedi il video Che cos'è il blocco dell'output?).

Come viene interpretato il timecode inserito

Il timecode in un messaggio SEI relativo alla temporizzazione delle immagini contiene solo l'ora (16:30:00;10). Per includere il timecode nei manifest di output, sono necessarie sia la data sia l'ora, ad esempio la data e l'ora complete (2021-12-06T16:30:00.333Z) o l'ora dell'epoca (1638837000333).

Quando interpreta il timecode SEI come formato data/ora, l'API Live Stream assume sempre che lo stream di input in arrivo sia in diretta o quasi. L'API Live Stream utilizza il fuso orario specificato nel timecodeConfig del canale per interpretare il codice di tempo SEI in modo che sia il più simile possibile all'ora corrente, senza però superarla.

Ad esempio, supponiamo che l'API Live Stream riceva uno stream di input all'ora corrente 2021-12-06T21:00:00Z UTC. La seguente tabella mostra come avviene la conversione del codice di tempo SEI in formato data/ora:

ID fuso orario Timecode SEI Interpretato come nell'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.