Sincronizar flujos de trabajo multimedia con contenido de emisiones en directo mediante el código de tiempo

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ígitos
  • MM 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ígitos
  • MM 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.