Synchroniser les workflows multimédias avec du contenu diffusé en direct à l'aide de codes temporels

Cette page explique comment synchroniser des workflows multimédias avec du contenu de diffusion en direct dans l'API Live Stream à l'aide de codes temporels. La fonctionnalité de code temporel vous permet de transmettre des entrées de code temporel, fournies sous forme de données intrabandes, aux fichiers manifestes de lecture. Vous pouvez ensuite synchroniser vos workflows multimédias internes avec le contenu de la diffusion en direct. Par exemple, vous pouvez mettre en correspondance des annotations de métadonnées générées indépendamment avec le contenu de la diffusion en direct ou aligner le contenu de diffusion interne avec la sortie de l'API Live Stream.

Les données de code temporel doivent être conformes à la spécification SMPTE 12M (voir ST 12-2:2008). Pour H264, les données de code temporel sont contenues dans le message SEI (Picture-Timing Supplemental Information Information). Pour H265, les données de code temporel sont incluses dans le message SEI de code temporel.

Utiliser un code temporel intégré

Pour utiliser un code temporel intégré à un flux d'entrée, ajoutez l'élément timecodeConfig suivant à la ressource Channel:

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE"
}

La valeur par défaut du champ source est MEDIA_TIMESTAMP.

Par défaut, le fuseau horaire UTC est utilisé pour interpréter le code temporel. Pour utiliser un fuseau horaire différent, définissez le champ timeZone ou utcOffset:

"timecodeConfig": {
  "source": "EMBEDDED_TIMECODE",

  "timeZone": {"id": "America/Los_Angeles"}
  // or
  "utcOffset": "-28800s" // -8 hours from UTC
}

L'heure d'été est prise en compte lorsque le champ timeZone est défini. Pour en savoir plus, consultez la section Interprétation du code temporel d'entrée.

Inclure le code temporel dans les fichiers manifestes de sortie

Vous pouvez définir le champ useTimecodeAsTimeline sur true pour inclure un code temporel pour chaque fichier manifeste de sortie:

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

Fichier manifeste HLS

Pour les flux en direct HLS, le code temporel est émis sous la forme d'une balise #EXT-X-PROGRAM-DATE-TIME pour chaque segment du fichier manifeste M3U8 multimédia. Il se présente comme suit:

#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 contient les données de code temporel générées au format ISO 8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD où:

  • YYYY correspond à une année à quatre chiffres.
  • MM correspond à un mois à deux chiffres (par exemple, 03 correspond à mars).
  • DD correspond à un jour du mois à deux chiffres (01 à 31).
  • T est un caractère défini qui indique le début de l'élément temporel
  • hh correspond aux deux chiffres d'une heure (00 à 23, AM/PM non inclus)
  • mm correspond aux deux chiffres d'une minute (00 à 59)
  • ss correspond aux deux chiffres d'une seconde (00 à 59)
  • mmm correspond aux trois chiffres d'une milliseconde (de 000 à 999)
  • TZD correspond à l'indicateur de fuseau horaire (Z, ±hh:mm). Le Z représente l'UTC, et les valeurs + ou - indiquent l'avance ou le retard par rapport à l'UTC.

Fichier manifeste DASH

Pour les flux en direct DASH, l'attribut availabilityStartTime du fichier manifeste de la description de la présentation du média est défini sur le code temporel initial et se présente comme suit:

<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 contient les données de code temporel générées au format ISO 8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD où:

  • YYYY correspond à une année à quatre chiffres.
  • MM correspond à un mois à deux chiffres (par exemple, 03 correspond à mars).
  • DD correspond à un jour du mois à deux chiffres (01 à 31).
  • T est un caractère défini qui indique le début de l'élément temporel
  • hh correspond aux deux chiffres d'une heure (00 à 23, AM/PM non inclus)
  • mm correspond aux deux chiffres d'une minute (00 à 59)
  • ss correspond aux deux chiffres d'une seconde (00 à 59)
  • mmm correspond aux trois chiffres d'une milliseconde (de 000 à 999)
  • TZD correspond à l'indicateur de fuseau horaire (Z, ±hh:mm). Le Z représente l'UTC, et les valeurs + ou - indiquent l'avance ou le retard par rapport à l'UTC.

Analyse des données de code temporel

Le code temporel intégré est analysé à partir de la première image de la vidéo. Les horodatages des contenus multimédias de sortie sont avancés trame par image par la suite. Il n'y a pas de resynchronisation entre les heures d'entrée et de sortie tant que le flux d'entrée n'est pas déconnecté et reconnecté.

Étant donné que le code temporel de la vidéo est remplacé par celui généré à partir du code temporel, les événements de chaîne doivent suivre l'horloge du code temporel pour s'exécuter correctement à un moment précis.

La durée peut être alignée sur les flux redondants si le générateur de codes temporels du pipeline de production est le même ou est verrouillé sur les encodeurs de contribution principal et de secours (voir la vidéo Qu'est-ce que le verrouillage de la sortie ?).

Interprétation du code temporel d'entrée

Le code temporel d'un message SEI de minutage d'image ne contient que l'heure (16:30:00;10). Pour inclure un code temporel dans les fichiers manifestes de sortie, vous devez renseigner à la fois la date et l'heure, telles que la date et l'heure complètes (2021-12-06T16:30:00.333Z) ou l'heure de l'époque (1638837000333).

Lorsque vous interprétez le code temporel SEI en tant que format date/heure, l'API Live Stream suppose toujours que le flux d'entrée entrant est en direct ou presque en direct. L'API Live Stream utilise le fuseau horaire spécifié dans le fichier timecodeConfig de la chaîne pour interpréter le code temporel SEI comme étant le plus proche possible de l'heure actuelle.

Par exemple, supposons que l'API Live Stream reçoive un flux d'entrée à l'heure actuelle 2021-12-06T21:00:00Z (UTC). Le tableau suivant montre comment le code temporel SEI est converti au format date/heure:

Identifiant du fuseau horaire Code temporel SEI Interprété en heure locale Interprété 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

Notez que les heures interprétées ne sont jamais postérieures à l'heure UTC actuelle de 2021-12-06T21:00:00Z.