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