En esta página se describe cómo sincronizar flujos de trabajo multimedia con contenido de emisiones en directo en la API Live Stream mediante el código de tiempo. La función de marca de tiempo te permite transferir entradas de marca de tiempo, proporcionadas como datos en banda, a los manifiestos de reproducción. Después, puedes sincronizar tus flujos de trabajo multimedia internos con el contenido de la emisión en directo. Por ejemplo, puedes asociar anotaciones de metadatos generadas de forma independiente con el contenido de la emisión en directo o alinear el contenido de emisión interno con la salida de la API Live Stream.
Los datos de marca de tiempo deben cumplir la especificación SMPTE 12M (consulta ST 12-2:2008). En el caso de H264, los datos de código de tiempo se incluyen en el mensaje de información complementaria de sincronización de imágenes (SEI). En el caso de H265, los datos de marca de tiempo se incluyen en el mensaje SEI de marca de tiempo.
Usar el código de tiempo insertado
Para usar el código de tiempo insertado en un flujo de entrada, añade lo siguiente
timecodeConfig
al recurso Channel
:
"timecodeConfig": { "source": "EMBEDDED_TIMECODE" }
El valor predeterminado del campo source
es MEDIA_TIMESTAMP
.
De forma predeterminada, se usa la zona horaria UTC para interpretar el código de tiempo. Para usar una zona horaria diferente, define el campo timeZone
o utcOffset
:
"timecodeConfig": { "source": "EMBEDDED_TIMECODE", "timeZone": {"id": "America/Los_Angeles"} // or "utcOffset": "-28800s" // -8 hours from UTC }
El horario de verano se tiene en cuenta al definir el campo timeZone
.
Consulta más información sobre cómo se interpreta el código de tiempo de entrada.
Incluir el código de tiempo en los manifiestos de salida
Puede definir el campo useTimecodeAsTimeline
en
true
para incluir el código de tiempo de cada manifiesto de salida:
"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 } ]
Archivo de manifiesto HLS
En las emisiones en directo de HLS, el código de tiempo se emite como una etiqueta #EXT-X-PROGRAM-DATE-TIME
para cada segmento del archivo de manifiesto M3U8 multimedia y tiene un aspecto similar al siguiente:
#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
contiene datos de código de tiempo generados según el formato ISO 8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
, donde:
YYYY
es el año de cuatro dígitosMM
es el mes expresado en dos dígitos (por ejemplo, 03 es marzo).DD
es el día del mes expresado en dos dígitos (del 01 al 31).T
es un carácter definido que indica el inicio del elemento de tiempo.hh
son los dos dígitos de una hora (del 00 al 23, sin incluir AM/PM).mm
son los dos dígitos de un minuto (del 00 al 59).ss
son los dos dígitos de los segundos (del 00 al 59).mmm
son los tres dígitos de una milésima de segundo (del 000 al 999).TZD
es el designador de zona horaria (Z, ±hh:mm). La Z representa la hora UTC, y los valores + o - indican la diferencia con respecto a la hora UTC.
Archivo de manifiesto de DASH
En las emisiones en directo de DASH, el atributo availabilityStartTime
del archivo de manifiesto MPD se define en la marca de tiempo inicial y tiene un aspecto similar al siguiente:
<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
contiene datos de código de tiempo generados según el formato ISO 8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
, donde:
YYYY
es el año de cuatro dígitosMM
es el mes expresado en dos dígitos (por ejemplo, 03 es marzo).DD
es el día del mes expresado en dos dígitos (del 01 al 31).T
es un carácter definido que indica el inicio del elemento de tiempo.hh
son los dos dígitos de una hora (del 00 al 23, sin incluir AM/PM).mm
son los dos dígitos de un minuto (del 00 al 59).ss
son los dos dígitos de los segundos (del 00 al 59).mmm
son los tres dígitos de una milésima de segundo (del 000 al 999).TZD
es el designador de zona horaria (Z, ±hh:mm). La Z representa la hora UTC, y los valores + o - indican la diferencia con respecto a la hora UTC.
Cómo se analizan los datos de la marca de tiempo
El código de tiempo insertado se analiza a partir del primer fotograma del vídeo. Las marcas de tiempo de los medios de salida se adelantan fotograma a fotograma después. No hay resincronización entre los tiempos de entrada y salida hasta que se desconecta y se vuelve a conectar el flujo de entrada.
Como la marca de tiempo del vídeo se sustituye por la marca de tiempo generada a partir del código de tiempo, los eventos de canal deben seguir el reloj del código de tiempo para ejecutarse correctamente a una hora específica.
Los tiempos se pueden alinear en las emisiones redundantes si el generador de código de tiempo de la cadena de producción es el mismo o está bloqueado en los codificadores de contribución principal y de respaldo (consulta el vídeo ¿Qué es el bloqueo de salida?).
Cómo se interpreta el código de tiempo de entrada
El código de tiempo de un mensaje SEI de sincronización de imágenes solo contiene la hora (16:30:00;10
). Para incluir el código de tiempo en los manifiestos de salida, se necesitan tanto la fecha como la hora, como la fecha y hora completas (2021-12-06T16:30:00.333Z
) o la hora de época (1638837000333
).
Al interpretar la marca de tiempo SEI como formato de fecha y hora, la API Live Stream siempre asume que el flujo de entrada es en directo o casi en directo.
La API Live Stream usa la zona horaria especificada en el elemento timecodeConfig
del canal para interpretar la marca de tiempo SEI de forma que sea lo más cercana posible a la hora actual, pero nunca posterior.
Por ejemplo, supongamos que la API Live Stream recibe una emisión de entrada a las 2021-12-06T21:00:00Z
(hora actual) en UTC. En la siguiente tabla se muestra cómo se convierte el código de tiempo SEI al formato de fecha y hora:
ID de zona horaria | Código de tiempo SEI | Se interpreta como la hora local | Se interpreta como en 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 |
Ten en cuenta que las horas interpretadas nunca son posteriores a la hora UTC actual de
2021-12-06T21:00:00Z
.