Sincronize fluxos de trabalho de mídia com conteúdo de transmissão ao vivo usando timecode

Esta página descreve como sincronizar fluxos de trabalho de mídia com conteúdo de transmissão ao vivo na API Live Stream usando timecode. O recurso de timecode permite que você transmita entradas de código de tempo, fornecidas como dados em banda, em manifestos de reprodução. Em seguida, é possível sincronizar seus fluxos de trabalho de mídia internos com o conteúdo da transmissão ao vivo. Por exemplo, é possível associar anotações de metadados geradas de modo independente ao conteúdo da transmissão ao vivo ou alinhar o conteúdo de transmissão interno com a saída da API Live Stream.

Os dados do código de tempo precisam estar em conformidade com a especificação SMPTE 12M (consulte ST 12-2:2008). Para H264, os dados de timecode são transmitidos na mensagem de informações de melhoria complementar de tempo de imagem (SEI, na sigla em inglês). Para H265, os dados de timecode são transferidos na mensagem SEI.

Usar código de tempo incorporado

Para usar código de tempo incorporado em um stream de entrada, adicione o seguinte timecodeConfig ao recurso Channel:

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

O valor padrão do campo source é MEDIA_TIMESTAMP.

Por padrão, o fuso horário UTC é usado para interpretar o código de tempo. Para usar um fuso horário diferente, defina o campo timeZone ou utcOffset:

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

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

O horário de verão é considerado ao definir o campo timeZone. Para mais detalhes, consulte Como o código de tempo de entrada é interpretado.

Incluir timecode em manifestos de saída

Você pode definir o campo useTimecodeAsTimeline como true para incluir o timecode de cada manifesto de saída:

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

Arquivo de manifesto HLS

Para transmissões ao vivo com HLS, o timecode é emitido como uma tag #EXT-X-PROGRAM-DATE-TIME para cada segmento no arquivo de manifesto de mídia M3U8 e tem uma aparência semelhante a esta:

#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 contém dados de código de tempo gerados seguindo o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD em que:

  • YYYY é o ano com quatro dígitos
  • MM é o mês com dois dígitos (por exemplo, 03 é março).
  • DD é o dia do mês com dois dígitos (01 a 31)
  • T é um caractere definido que indica o início do elemento de tempo.
  • hh são os dois dígitos de uma hora (00 a 23, AM/PM não incluídos)
  • mm são os dois dígitos de um minuto (00 a 59)
  • ss são os dois dígitos de um segundo (00 a 59)
  • mmm são os três dígitos de um milissegundo (000 a 999)
  • TZD é o indicador de fuso horário (Z, ±hh:mm). O Z representa o UTC, e os valores + ou - indicam o quanto à frente ou atrás do UTC.

Arquivo de manifesto DASH

Para transmissões ao vivo DASH, o atributo availabilityStartTime no arquivo de manifesto da MPD é definido como o timecode inicial e é semelhante ao seguinte:

<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 contém dados de código de tempo gerados seguindo o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD em que:

  • YYYY é o ano com quatro dígitos
  • MM é o mês com dois dígitos (por exemplo, 03 é março).
  • DD é o dia do mês com dois dígitos (01 a 31)
  • T é um caractere definido que indica o início do elemento de tempo.
  • hh são os dois dígitos de uma hora (00 a 23, AM/PM não incluídos)
  • mm são os dois dígitos de um minuto (00 a 59)
  • ss são os dois dígitos de um segundo (00 a 59)
  • mmm são os três dígitos de um milissegundo (000 a 999)
  • TZD é o indicador de fuso horário (Z, ±hh:mm). O Z representa o UTC, e os valores + ou - indicam o quanto à frente ou atrás do UTC.

Como os dados do código de tempo são analisados

O timecode incorporado é analisado a partir do primeiro frame do vídeo. Os carimbos de data/hora da mídia de saída são avançados frame a frame depois. Não há ressincronização entre os tempos de entrada e saída até que o stream de entrada seja desconectado e reconectado.

Como o carimbo de data/hora do vídeo é substituído pelo gerado pelo timecode, os eventos do canal precisam seguir o relógio do timecode para serem executados corretamente em um momento especificado.

O tempo poderá ser alinhado em streams redundantes se o gerador de códigos de tempo no pipeline de produção for o mesmo ou estiver bloqueado nos codificadores de contribuição principal e de backup. Consulte o vídeo O que é bloqueio de saída?.

Como o timecode de entrada é interpretado

O timecode em uma mensagem da SEI de marcação de tempo contém apenas tempo (16:30:00;10). Para incluir timecode nos manifestos de saída, são necessárias tanto a data quanto a hora, por exemplo, data e hora completas (2021-12-06T16:30:00.333Z) ou períodos de época (1638837000333).

Ao interpretar o timecode SEI como formato de data e hora, a API Live Stream sempre presume que o stream de entrada de entrada esteja ao vivo ou quase ativo. A API Live Stream usa o fuso horário especificado no timecodeConfig do canal para interpretar que o timecode da SEI será o mais próximo, mas não posterior, ao horário atual.

Por exemplo, suponha que a API Live Stream receba um stream de entrada no horário atual de 2021-12-06T21:00:00Z em UTC. A tabela a seguir mostra como o timecode SEI é convertido no formato datetime:

ID do fuso horário Código de tempo SEI Interpretado como na hora local Interpretado como 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

Os horários interpretados nunca são posteriores ao horário UTC atual de 2021-12-06T21:00:00Z.