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ígitosMM
é 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ígitosMM
é 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
.