Sincronizar fluxos de trabalho de mídia com conteúdo de transmissão ao vivo usando o código de tempo

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 o código de tempo. O recurso de código de tempo permite transmitir entradas de código de tempo, fornecidas como dados na banda, em manifestos de reprodução. Em seguida, sincronize seus fluxos de trabalho internos de mídia com o conteúdo da transmissão ao vivo. Por exemplo, é possível combinar anotações de metadados geradas de forma independente com o conteúdo do stream ao vivo ou alinhar o conteúdo de transmissão interna com a saída da API Live Stream.

Os dados de timecode precisam estar em conformidade com a especificação SMPTE 12M (consulte ST 12-2:2008). No H264, os dados de timecode são transmitidos na mensagem de informações de melhoria suplementar de tempo de imagem (SEI, na sigla em inglês). No H.265, os dados de timecode são transmitidos na mensagem SEI de timecode.

Usar código de tempo incorporado

Para usar o 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 é levado em conta ao definir o campo timeZone. Consulte Como o código de tempo de entrada é interpretado para mais detalhes.

Incluir código de tempo nos manifestos de saída

É possível definir o campo useTimecodeAsTimeline como true para incluir o código de tempo de cada manifesto de saída:

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

Arquivo de manifesto do HLS

Nas transmissões ao vivo HLS, o código de tempo é emitido como uma tag #EXT-X-PROGRAM-DATE-TIME para cada segmento no arquivo de manifesto M3U8 de mídia e tem a seguinte aparência:

#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 de acordo com o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, em que:

  • YYYY é o ano de quatro dígitos
  • MM é o mês com dois dígitos (por exemplo, 03 é março)
  • DD é o dia de dois dígitos do mês (de 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ído)
  • 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 designador de fuso horário (Z, ±hh:mm). A Z representa o UTC, e os valores de + ou - indicam quanto tempo antes ou depois do UTC.

Arquivo de manifesto DASH

Para transmissões ao vivo do DASH, o atributo availabilityStartTime no arquivo de manifesto MPD é definido como o código de tempo 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 de acordo com o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, em que:

  • YYYY é o ano de quatro dígitos
  • MM é o mês com dois dígitos (por exemplo, 03 é março)
  • DD é o dia de dois dígitos do mês (de 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ído)
  • 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 designador de fuso horário (Z, ±hh:mm). A Z representa o UTC, e os valores de + ou - indicam quanto tempo antes ou depois do UTC.

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

O código de tempo 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á resincronização entre os tempos de entrada e saída até que o fluxo de entrada seja desconectado e reconectado.

Como a marcação de tempo do vídeo é substituída pela gerada pelo código de tempo, os eventos do canal precisam seguir o relógio de código de tempo para serem executados corretamente em um horário especificado.

O tempo pode ser alinhado em streams redundantes se o gerador de código de tempo no pipeline de produção for o mesmo ou estiver bloqueado nos codificadores de contribuição primário e de backup (consulte o vídeo O que é o bloqueio de saída?).

Como o timecode de entrada é interpretado

O código de tempo em uma mensagem SEI de tempo de imagem contém apenas a hora (16:30:00;10). Para incluir o código de tempo nos manifestos de saída, a data e a hora são necessárias, como a data e hora completas (2021-12-06T16:30:00.333Z) ou o tempo de época (1638837000333).

Ao interpretar o código de tempo SEI como formato de data e hora, a API Live Stream sempre pressupõe que o stream de entrada recebido está ativo ou quase ativo. API Live Stream usa o fuso horário especificado no timecodeConfig do canal para interpretar o código de tempo do SEI como o mais próximo possível do horário atual, mas não depois dele.

Por exemplo, suponha que a API Live Stream receba um stream de entrada no horário atual de 2021-12-06T21:00:00Z no UTC. A tabela a seguir mostra como o código de tempo do SEI é convertido para o formato de data e hora:

ID do fuso horário Timecode do SEI Interpretado como no horário 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.