Cette page explique comment synchroniser les workflows multimédias avec le contenu de la diffusion en direct dans l'API Live Stream à l'aide d'un code temporel. La fonctionnalité de code temporel vous permet de transmettre des entrées de code temporel, fournies en tant que données en bande, dans les 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 faire correspondre des annotations de métadonnées générées indépendamment au contenu du flux en direct ou aligner le contenu de la diffusion interne sur la sortie de l'API Live Stream.
Les données de code temporel doivent être conformes aux spécifications SMPTE 12M (voir ST 12-2:2008). Pour H.264, les données de code temporel sont transmises dans le message SEI (Supplemental Enhancement Information) de synchronisation des images. Pour H265, les données de code temporel sont transmises 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 le 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 lors de la définition du champ timeZone
.
Pour en savoir plus, consultez la section Comment le code temporel d'entrée est interprété.
Inclure un code temporel dans les fichiers manifestes de sortie
Vous pouvez définir le champ useTimecodeAsTimeline
sur true
pour inclure le 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 diffusions en direct HLS, le code temporel est émis sous forme de balise #EXT-X-PROGRAM-DATE-TIME
pour chaque segment du fichier manifeste multimédia M3U8. 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 des données de code temporel générées conformément au format ISO 8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
, où:
YYYY
: année à quatre chiffresMM
: mois à deux chiffres (par exemple, 03 correspond à mars)DD
: 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
: deux chiffres représentant l'heure (de 00 à 23, sans AM/PM)mm
: deux chiffres représentant la minute (de 00 à 59)ss
: deux chiffres représentant les secondes (de 00 à 59)mmm
correspond aux trois chiffres d'une milliseconde (000 à 999).TZD
est le code du fuseau horaire (Z, ±hh:mm). Le Z représente l'heure UTC, et les valeurs + ou - indiquent l'avance ou le retard par rapport à l'heure UTC.
Fichier manifeste DASH
Pour les diffusions en direct DASH, l'attribut availabilityStartTime
du fichier manifeste MPD 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 des données de code temporel générées conformément au format ISO8601 YYYY-MM-DDThh:mm:ss[.mmm]TZD
, où:
YYYY
: année à quatre chiffresMM
: mois à deux chiffres (par exemple, 03 correspond à mars)DD
: 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
: deux chiffres représentant l'heure (de 00 à 23, sans AM/PM)mm
: deux chiffres représentant la minute (de 00 à 59)ss
: deux chiffres représentant les secondes (de 00 à 59)mmm
correspond aux trois chiffres d'une milliseconde (000 à 999).TZD
est le code du fuseau horaire (Z, ±hh:mm). Le Z représente l'heure UTC, et les valeurs + ou - indiquent l'avance ou le retard par rapport à l'heure UTC.
Analyse des données de code temporel
Le code temporel intégré est analysé à partir du premier frame vidéo. Les codes temporels multimédias de sortie sont avancés image par image par la suite. Aucune resynchronisation n'est effectuée entre les temps 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 être correctement exécutés à une heure spécifiée.
Le timing peut être aligné sur des flux redondants si le générateur de code temporel dans le pipeline de production est identique ou verrouillé à la fois sur les encodeurs de contribution principaux et de secours (voir la vidéo What is Output Locking? (Qu'est-ce que le verrouillage de sortie ?)).
Interprétation du code temporel saisi
Le code temporel d'un message SEI de synchronisation d'image ne contient que l'heure (16:30:00;10
). Pour inclure le code temporel dans les fichiers manifestes de sortie, la date et l'heure sont requises, telles que la date et l'heure complètes (2021-12-06T16:30:00.333Z
) ou l'heure EPOCH (1638837000333
).
Lorsque l'API Live Stream interprète le code temporel SEI au format date/heure, elle suppose toujours que le flux d'entrée entrant est en direct ou presque.
L'API Live Stream utilise le fuseau horaire spécifié dans le timecodeConfig
de la chaîne pour interpréter le code temporel SEI comme étant aussi proche que possible de l'heure actuelle, mais pas plus tard.
Par exemple, supposons que l'API Live Stream reçoive un flux d'entrée à l'heure actuelle de 2021-12-06T21:00:00Z
en 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ée comme en heure locale | Interprétée comme 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
.