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í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 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í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 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
: