Sincroniza flujos de trabajo de contenido multimedia con transmisiones en vivo mediante códigos de tiempo

En esta página, se describe cómo sincronizar flujos de trabajo de contenido multimedia con transmisiones en vivo en la API de Live Stream mediante el código de tiempo. La función de código de tiempo te permite pasar entradas de código de tiempo, proporcionadas como datos en banda, a los manifiestos de reproducción. Luego, puedes sincronizar tus flujos de trabajo de contenido multimedia interno con el contenido de la 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 transportan en el mensaje de información de mejora complementaria de la sincronización de imágenes (SEI). En el caso de H265, los datos de código de tiempo se transportan en el mensaje de SEI de código de tiempo.

Usa el 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, establece 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": [
  {
    "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 transmisiones en vivo 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 se ve de la siguiente manera:

#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 ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, en el que se cumple 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 de dos dígitos del mes (del 01 al 31).
  • T es un carácter establecido que indica el inicio del elemento de tiempo.
  • hh son los dos dígitos de una hora (del 00 al 23, sin incluir a.m./p.m.)
  • mm son los dos dígitos de un minuto (de 00 a 59).
  • ss son los dos dígitos de un segundo (del 00 al 59).
  • mmm son los tres dígitos de un milisegundo (de 000 a 999).
  • TZD es el designador de zona horaria (Z, ±hh:mm). La Z representa UTC, y los valores de + o - indican qué tan adelantado o retrasado está UTC.

Archivo de manifiesto de DASH

En el caso de las transmisiones en vivo de DASH, el atributo availabilityStartTime en el archivo de manifiesto MPD se establece en el código de tiempo inicial y se ve de la siguiente manera:

<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 ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD, en el que se cumple 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 de dos dígitos del mes (del 01 al 31).
  • T es un carácter establecido que indica el inicio del elemento de tiempo.
  • hh son los dos dígitos de una hora (del 00 al 23, sin incluir a.m./p.m.)
  • mm son los dos dígitos de un minuto (de 00 a 59).
  • ss son los dos dígitos de un segundo (del 00 al 59).
  • mmm son los tres dígitos de un milisegundo (de 000 a 999).
  • TZD es el designador de zona horaria (Z, ±hh:mm). La Z representa UTC, y los valores de + o - indican qué tan adelantado o retrasado está UTC.

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

El código de tiempo incorporado se analiza desde el primer fotograma del video. Las marcas de tiempo de los medios de salida se avanzan fotograma por fotograma después. No se realiza ninguna resynchronización entre los tiempos de entrada y salida hasta que se desconecta y vuelve a conectar el flujo de entrada.

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

La sincronización 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 en los codificadores de contribución principales y de respaldo (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 de un mensaje SEI de tiempo de fotogramas contiene solo la hora (16:30:00;10). Para incluir el código de tiempo en los manifiestos de salida, se requieren la fecha y la hora, como la fecha y hora completas (2021-12-06T16:30:00.333Z) o la hora de época (1638837000333).

Cuando se interpreta el código de tiempo SEI como formato de fecha y hora, la API de Live Stream siempre supone que el flujo 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 el código de tiempo SEI de manera que sea lo más cercano posible a la hora actual, pero no más tarde.

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

ID de zona horaria Código de tiempo de 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.