Usa código de tiempo para sincronizar los flujos de trabajo de contenido multimedia con el contenido de las transmisiones en vivo.

En esta página, se describe cómo sincronizar flujos de trabajo multimedia con contenido de transmisión en vivo en la API de Live Stream con código de tiempo. La función de código de tiempo te permite pasar las entradas de código de tiempo, proporcionadas como datos dentro de la banda, a los manifiestos de reproducción. Luego, puedes sincronizar tus flujos de trabajo de medios internos con el contenido de transmisión en vivo. Por ejemplo, puedes hacer coincidir las anotaciones de metadatos generadas de forma independiente con el contenido de la transmisión en vivo o alinear el contenido de la transmisión interna con el resultado de la API de Live Stream.

Los datos de código de tiempo deben cumplir con la especificación SMPTE 12M (consulta ST 12-2:2008). En el caso de H264, los datos de código de tiempo se transfieren en el mensaje de información de mejora complementaria (SEI) de sincronización de la imagen. En H265, los datos de código de tiempo se transmiten en el mensaje SEI de código de tiempo.

Cómo usar un código de tiempo incorporado

Para usar el código de tiempo incorporado en un flujo de entrada, agrega el 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, configura 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 cuando se configura el campo timeZone. Consulta Cómo se interpreta el código de tiempo de entrada para obtener más detalles.

Cómo incluir el código de tiempo en los manifiestos de salida

Puedes establecer el campo useTimecodeAsTimeline en true para incluir el código de tiempo de cada manifiesto de salida:

"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
  }
]

Archivo de manifiesto de HLS

En el caso de las transmisiones en vivo de HLS, el código de tiempo se emite como una etiqueta #EXT-X-PROGRAM-DATE-TIME para cada segmento en el archivo de manifiesto M3U8 multimedia y es 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 con el formato YYYY-MM-DDThh:mm:ss[.mmm]TZD ISO8601, en los que sucede lo siguiente:

  • YYYY es el año de cuatro dígitos.
  • MM es el mes de dos dígitos (por ejemplo, 03 es marzo).
  • DD es el día del mes en dos dígitos (de 01 a 31).
  • T es un carácter establecido que indica el inicio del elemento de tiempo
  • hh son los dos dígitos de una hora (de 00 a 23; no se incluye a.m./p.m.)
  • mm son los dos dígitos de un minuto (00 a 59)
  • ss son los dos dígitos de un segundo (00 a 59)
  • mmm corresponde a los tres dígitos de un milisegundo (000 a 999).
  • TZD es el designador de zona horaria (Z, ±hh:mm). La Z representa UTC, y los valores + o - indican qué tan adelantada o atrasada con la UTC.

Archivo de manifiesto de DASH

Para las transmisiones en vivo de DASH, el atributo availabilityStartTime del archivo de manifiesto MPD se establece en el código de tiempo inicial y es 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 con el formato YYYY-MM-DDThh:mm:ss[.mmm]TZD ISO8601, en los que sucede lo siguiente:

  • YYYY es el año de cuatro dígitos.
  • MM es el mes de dos dígitos (por ejemplo, 03 es marzo).
  • DD es el día del mes en dos dígitos (de 01 a 31).
  • T es un carácter establecido que indica el inicio del elemento de tiempo
  • hh son los dos dígitos de una hora (de 00 a 23; no se incluye a.m./p.m.)
  • mm son los dos dígitos de un minuto (00 a 59)
  • ss son los dos dígitos de un segundo (00 a 59)
  • mmm corresponde a los tres dígitos de un milisegundo (000 a 999).
  • TZD es el designador de zona horaria (Z, ±hh:mm). La Z representa UTC, y los valores + o - indican qué tan adelantada o atrasada con la UTC.

Cómo se analizan los datos de código de tiempo

El código de tiempo incorporado se analiza a partir del primer fotograma del video. Las marcas de tiempo de los medios de salida son avanzadas fotograma por fotograma después. No hay resincronización entre los tiempos de entrada y salida hasta que la transmisión de entrada se desconecta y se vuelve a conectar.

Dado que la marca de tiempo del video se reemplaza por la marca de tiempo generada a partir del código de tiempo, los eventos de canal deben seguir el reloj con código de tiempo para ejecutarse correctamente en un momento específico.

El tiempo se puede alinear en transmisiones redundantes si el generador de códigos de tiempo en la canalización de producción es el mismo o está bloqueado tanto en el codificador de contribución principal como en el de copia de seguridad (consulta el video ¿Qué es el bloqueo de salida?).

Cómo se interpreta el código de tiempo de entrada

El código de tiempo en un mensaje de la SEI de latencia de imágenes solo contiene la hora (16:30:00;10). Para incluir el código de tiempo en los manifiestos de salida, se requieren tanto la fecha como la hora, como la fecha y la hora completas (2021-12-06T16:30:00.333Z) o la época (1638837000333).

Cuando se interpreta el código de tiempo de la SEI como formato de fecha y hora, la API de Live Stream siempre supone que la transmisión de entrada entrante está en vivo o casi en vivo. La API de Live Stream usa la zona horaria especificada en el timecodeConfig del canal para interpretar que el código de tiempo de la SEI sea lo más cercano posible, pero no posterior a la hora actual.

Por ejemplo, supongamos que la API de Live Stream recibe una transmisión de entrada en la hora actual de 2021-12-06T21:00:00Z en UTC. En la siguiente tabla, se muestra cómo el código de tiempo SEI se convierte al formato de fecha y hora:

ID de zona horaria Código de tiempo de SEI Interpretado como en la hora local Interpretado 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.