Esta página descreve como sincronizar fluxos de trabalho de multimédia com conteúdo de streams em direto na API Live Stream através do timecode. A funcionalidade de código de tempo permite-lhe transmitir entradas de código de tempo, fornecidas como dados na banda, para manifestos de reprodução. Em seguida, pode sincronizar os seus fluxos de trabalho de multimédia internos com o conteúdo da stream em direto. Por exemplo, pode fazer corresponder anotações de metadados geradas de forma independente com o conteúdo da stream em direto ou alinhar o conteúdo de transmissão interno com o resultado da API Live Stream.
Os dados de timecode têm de estar em conformidade com a especificação SMPTE 12M (consulte ST 12-2:2008). Para o formato H264, os dados de timecode são transportados na mensagem de informações de melhoramento suplementar (SEI) de sincronização de imagens. Para H265, os dados de timecode são transportados na mensagem SEI de timecode.
Use o timecode incorporado
Para usar o timecode incorporado numa stream de entrada, adicione o seguinte
timecodeConfig
ao recurso Channel
:
"timecodeConfig": { "source": "EMBEDDED_TIMECODE" }
O valor predefinido do campo source
é MEDIA_TIMESTAMP
.
Por predefinição, o fuso horário UTC é usado para interpretar o timecode. 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 }
A mudança da hora é tida em conta quando define o campo timeZone
.
Consulte o artigo Como o timecode de entrada é interpretado para mais detalhes.
Inclua o timecode nos manifestos de saída
Pode definir o campo useTimecodeAsTimeline
como
true
para incluir o código de tempo para 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 } ]
Ficheiro de manifesto HLS
Para streams em direto HLS, o timecode é emitido como uma etiqueta #EXT-X-PROGRAM-DATE-TIME
para cada segmento no ficheiro de manifesto M3U8 de multimédia e tem um aspeto semelhante ao seguinte:
#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 timecode gerados de acordo com o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
onde:
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 caráter 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). O Z representa UTC e os valores + ou - indicam o tempo de diferença em relação a UTC.
Ficheiro de manifesto DASH
Para streams em direto DASH, o atributo availabilityStartTime
no ficheiro de manifesto MPD está definido para o timecode inicial e tem um aspeto 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 de acordo com o formato ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
onde:
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 caráter 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). O Z representa UTC e os valores + ou - indicam o tempo de diferença em relação a UTC.
Como são analisados os dados de timecode
O timecode incorporado é analisado a partir do primeiro frame do vídeo. As datas/horas dos meios de saída são avançadas frame a frame posteriormente. Não existe resincronização entre as horas de entrada e saída até que o fluxo de entrada seja desligado e religado.
Uma vez que a indicação de tempo do vídeo é substituída pela indicação de tempo gerada a partir do timecode, os eventos do canal têm de seguir o relógio do timecode para serem executados corretamente numa hora especificada.
A sincronização pode ser alinhada em streams redundantes se o gerador de timecode no pipeline de produção for o mesmo ou estiver bloqueado nos codificadores de contribuição principal e secundário (consulte o vídeo O que é o bloqueio de saída?).
Como é interpretado o timecode de entrada
O código de tempo numa mensagem SEI de sincronização de imagens contém apenas a hora (16:30:00;10
).
Para incluir o código de tempo nos manifestos de saída, são necessários a data e a hora, como
a data/hora completa (2021-12-06T16:30:00.333Z
) ou a hora de época
(1638837000333
).
Ao interpretar o código de tempo SEI como formato de data/hora, a API Live Stream assume sempre que a stream de entrada recebida está em direto ou quase em direto.
A API Live Stream usa o fuso horário especificado no elemento
timecodeConfig
do canal para interpretar o timecode SEI de modo a que seja o mais próximo possível, mas não posterior, à hora atual.
Por exemplo, suponha que a API Live Stream recebe uma stream de entrada à hora atual de 2021-12-06T21:00:00Z
UTC. A tabela seguinte mostra como o código de tempo SEI é convertido para o formato de data/hora:
ID do fuso horário | Código de tempo SEI | Interpretado como no horário local | Interpretado como em 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 |
Tenha em atenção que as horas interpretadas nunca são posteriores à hora UTC atual de
2021-12-06T21:00:00Z
.