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 modo independente com as propriedades conteúdo de transmissão ao vivo ou alinhar o conteúdo da transmissão interna com o 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). Para H265, os dados do timecode são transferidos mensagem do SEI.

Usar timecode incorporado

Para usar o timecode incorporado em um stream de entrada, adicione o seguinte timecodeConfig para o 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 timecode é emitido como uma tag #EXT-X-PROGRAM-DATE-TIME para cada segmento do arquivo de manifesto de mídia M3U8 e é 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 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 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 UTC, e o Os valores + ou - indicam o quanto adiantado ou atrasado em relação ao UTC.

Arquivo de manifesto DASH

Para transmissões ao vivo DASH, o atributo availabilityStartTime na MPD de manifesto está definido para 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 timecode gerados seguindo o ISO8601. formato 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 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 UTC, e o Os valores + ou - indicam o quanto adiantado ou atrasado em relação ao 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. O os carimbos de data/hora de saída da mídia são avançados frame a frame posteriormente. Não há ressincronização entre os tempos de entrada e saída até que o fluxo de entrada seja desconectado e reconectado.

Como o carimbo de data/hora do vídeo é substituído pelo carimbo de data/hora gerado pelo marcação de tempo, eventos do canal deve seguir o relógio de timecode para ser executado 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 timecode em uma mensagem SEI de marcação de tempo de imagem contém apenas tempo (16:30:00;10). Para incluir um timecode nos manifestos de saída, são necessárias a data e a hora, como como a data e hora completa (2021-12-06T16:30:00.333Z) ou o horário 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. A API de transmissão ao vivo 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 timecode da SEI é convertido no formato de data e hora:

ID do fuso horário Timecode do SEI Interpretada 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: