L'API Pod Serving permet d'accéder à des segments d'annonces encodés et fractionnés, préparés de manière à pouvoir les assembler directement dans une playlist de contenus multimédias HLS ou MPEG-DASH visible par l'utilisateur. Pour MPEG-DASH, l'API Pod Serving fournit également un modèle de fichier manifeste afin de fournir des informations et du contexte supplémentaires pour ces segments d'annonces.
Ce guide est axé sur la mise en œuvre d'un serveur de manipulation de fichier manifeste de diffusion de séries d'annonces de base pour les diffusions en direct.
Condition préalable: Configurer des événements de diffusion en direct dans Google Ad Manager
Avant d'envoyer des demandes à l'API de diffusion de pods, vous devez créer un événement de diffusion en direct Ad Manager pour chaque flux que vous traitez. Vous pouvez créer un événement de diffusion en direct à l'aide de LiveStreamEventService API
ou de l'interface Web de Google Ad Manager.
Pour qu'un événement diffusé en direct puisse être utilisé avec l'API de diffusion de pods, vous devez renseigner plusieurs attributs de votre événement:
customAssetKey
: identifiant personnalisé à utiliser pour cet événement. Ils doivent être uniques pour tous les événements du réseau.adTags
: URL du tag d'emplacement publicitaire principal générée par le processus de trafficking Ad Manager.dynamicAdInsertionType
: doit être défini surPOD_SERVING_REDIRECT
.streamingFormat
: définissez ce paramètre surHLS
ouDASH
en conséquence.segmentUrlAuthenticationKeyIds
: au moins une clé HMAC utilisée pour signer les requêtes de segment d'annonces.daiEncodingProfileIds
: liste des ID DAIEncodingProfile activés pour cet événement.startDateTime
: date et heure de début de l'événementendDateTime
: date et heure de fin prévues de cet événement. Cet attribut est obligatoire siunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime - booléen. Voir ci-dessus
Recevoir des demandes de fichier manifeste de flux
Votre outil de manipulation du fichier manifeste doit fournir un point de terminaison d'API permettant d'écouter les requêtes de fichier manifeste de l'application cliente du lecteur vidéo. Au minimum, ce point de terminaison doit collecter un ID de flux à partir de l'application du lecteur client et doit renvoyer un fichier manifeste de flux combiné. L'ID de flux permet d'identifier la session de streaming auprès d'Ad Manager.
Vous devez également collecter d'autres informations (par exemple, un ID de contenu) pour identifier le flux de contenu approprié.
Exemple de point de terminaison potentiel d'une requête de fichier manifeste
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Paramètres du chemin d'accès | |||||
---|---|---|---|---|---|
asset_key |
Un identifiant fictif correspondant à la diffusion en direct demandée dans votre système. | ||||
format |
Paramètre hypothétique correspondant au format du flux. L'une des options suivantes:
|
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager de l'application de lecteur vidéo cliente. |
Récupérer le flux de contenu
Utilisez l'ID de contenu collecté à partir de la requête de fichier manifeste pour sélectionner le flux de contenu à assembler avec les annonces.
Assembler des segments d'annonces dans un flux de contenu
L'assemblage des URL des segments d'annonces diffère selon le format de votre flux.
Flux HLS
Les flux HLS sont généralement diffusés sous la forme d'un fichier manifeste de multivariantes, qui contient un ensemble de liens vers des fichiers manifestes de variantes, qui correspondent à chacun des profils d'encodage.
Remarque: Par souci de simplicité, ce guide suppose que votre support HLS est encodé dans un format qui multiplie l'audio et la vidéo dans le même fichier de segment.
Proxy les playlists de multivariantes
Vous devez remplacer chaque URL de playlist de variantes dans la playlist de multivariantes d'origine par un autre appel de point de terminaison au manipulateur pour traiter le fichier manifeste de variantes sélectionné par le lecteur.
Les étapes restantes pour l'assemblage du HLS supposent qu'un seul fichier manifeste de variante est en cours de traitement.
Exemple de point de terminaison de requête de variante potentiel
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Paramètres du chemin d'accès | |
---|---|
asset_key |
Un identifiant fictif correspondant à la diffusion en direct demandée dans votre système. |
variant |
Paramètre hypothétique contenant un identifiant pour la variante spécifique en cours de traitement. |
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager de l'application de lecteur vidéo cliente, utilisé ici pour identifier une session utilisateur à l'aide du manipulateur du fichier manifeste. |
Exemple de fichier manifeste de multivariante non traité
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
Exemple de fichier manifeste de multivariante transmis par proxy
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
Identifier les segments de coupures publicitaires et insérer les discontinuités
Lorsque vous traitez le fichier manifeste de la variante, effectuez le suivi de l'heure de début, de la durée et de l'index de la prochaine coupure publicitaire à venir, jusqu'à ce que le fichier manifeste dynamique en cours de traitement contienne des segments qui seront remplacés par le contenu de l'annonce.
En fonction de votre encodeur, les coupures publicitaires peuvent être délimitées de différentes manières dans les segments de contenu. Une façon courante de délimiter une coupure publicitaire consiste à ajouter une balise #EXT-X-CUE-OUT
devant les segments d'annonces, puis à la faire suivre d'une balise #EXT-X-CUE-IN
.
Pour séparer les coupures publicitaires hébergées par Google de vos segments de contenu, vous devez insérer des balises #EXT-X-DISCONTINUITY
au début et à la fin de chaque coupure publicitaire. Si ces balises de discontinuité n'apparaissent pas dans le fichier manifeste final, la lecture échouera.
Les URI des segments d'annonces insérés ne sont pas chiffrés. Si votre contenu est chiffré, vous devez également supprimer le chiffrement en spécifiant #EXT-X-KEY:METHOD=NONE
avant le premier segment d'annonce de chaque coupure publicitaire, puis en l'ajoutant à nouveau après la coupure.
Exemple de fichier manifeste (version d'origine)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Fichier manifeste avec discontinuités inséré
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Traiter les segments de série d'annonces
Pour chaque segment d'une série d'annonces, vous devez effectuer le suivi de quelques valeurs supplémentaires:
segment_number
: index de segment dans la série d'annonces, en commençant par zéro. Ou "init" pour le segment d'initialisation MP4.segment_duration
: durée du segment actuel en millisecondes. Cette valeur doit être identique pour tous les segments, à l'exception du dernier du pod.segment_offset
: décalage du segment calculé en ajoutant la durée du segment précédent à son décalage de segment en millisecondeslast
: valeur booléenne identifiant le dernier segment d'une série d'annonces. La valeur par défaut est "false".
Créer des URL de segments d'annonces
Remplacez chaque segment de la coupure publicitaire par une URL au format suivant:
/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
Paramètres du chemin d'accès | |
---|---|
network_code
|
Code Ad Manager 360 de ce réseau. |
custom_asset_key
|
Clé de l'élément de diffusion en direct personnalisée spécifiée dans l'API LiveStreamEventService ou sur la page de la diffusion en direct dans l'interface Web d'Ad Manager 360. |
pod_id
|
Identifiant de la coupure publicitaire. Il doit s'agir d'un nombre entier commençant par 1 et augmentant d'une unité pour chaque coupure publicitaire.
Cette valeur doit être identique pour tous les utilisateurs qui visualisent la même coupure publicitaire dans l'événement en cours. |
profile_name
|
Identifiant du profil demandé |
segment_number
|
Index de ce segment dans la série d'annonces actuelle, à partir de zéro. Si vous utilisez un conteneur MP4, vous pouvez demander le segment d'initialisation en définissant segment_number sur "init". |
Paramètres de requête | ||
---|---|---|
stream_id
|
Obligatoire | Paramètre stream_id de l'utilisateur renvoyé par la requête de création de flux.
|
sd
|
Obligatoire | segment_duration
|
so
|
Facultatif | segment_offset
Si |
pd
|
Obligatoire, sauf pour les événements où les coupures publicitaires sans durée sont activées | Durée (en millisecondes) de la coupure publicitaire. Également appelé ad_pod_duration .
|
auth-token
|
Obligatoire | Jeton HMAC signé et encodé en URL pour cette série d'annonces. |
last
|
Facultatif | Booléen indiquant le dernier segment de la coupure publicitaire. Valeur par défaut : "false". |
Les valeurs des paramètres de requête doivent être correctement encodées pour être compatibles avec les URL. Ceci est particulièrement important pour le champ auth-token
, car il peut contenir les caractères /
, +
et =
.
Exemple de fichier manifeste (après remplacement du segment)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Félicitations ! Vous diffusez maintenant une diffusion en direct avec des segments d'annonces fournis par l'API d'insertion dynamique de séries d'annonces.
Flux DASH
Les flux DASH sont fournis sous la forme d'un fichier MPD contenant tous les encodages de flux dans un seul fichier, où le contenu est représenté par une série de points.
Modèle de période de demande
Demandez un modèle de période à Google Ad Manager. Ce modèle deviendra votre période de coupure publicitaire, une fois que les macros qu'il contient auront été insérées.
Vous ne devez demander ce modèle qu'une seule fois par session de diffusion et le mettre en cache pour être réutilisé à chaque coupure publicitaire.
Point de terminaison de la demande de modèle de période
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Paramètres du chemin d'accès | |
---|---|
network_code |
Code de réseau Ad Manager 360 de l'éditeur. |
custom_asset |
Clé de l'élément personnalisé de l'événement diffusé en direct dans Google Ad Manager. |
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager du lecteur vidéo client. |
Réponse JSON | |
---|---|
dash_period_template |
Chaîne XML du modèle de période. |
segment_duration_ms |
Durée de chaque segment de support publicitaire dans le modèle de période en tirets, en millisecondes. |
Exemple de requête (cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
Exemple de réponse
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>",
"segment_duration_ms":5000}
Insérer le modèle de période
Le modèle de période contient plusieurs macros que vous devez remplacer à chaque coupure publicitaire. Toutes les macros doivent être remplacées. Les macros inutilisées doivent être remplacées par une chaîne vide ("").
Macro | Description | Exemple |
---|---|---|
$$pod-id$$ |
Index de la série d'annonces représentée au cours de cette période. Cette valeur doit correspondre pour le même pod dans toutes les sessions de visionnage. | 1 |
$$period-start$$ |
Heure de début de la période dans la description de la présentation du média actuelle. Attribut facultatif qui doit être remplacé par start="###" , où ### correspond à l'heure de présentation à laquelle la coupure publicitaire commence. Si l'heure de début de la période n'est pas indiquée, cette macro doit être remplacée par une chaîne vide.
|
start="PT2H33M30S" |
$$period-duration$$ |
Durée de la période complète de l'annonce. Attribut facultatif qui doit être remplacé par duration="###" , où ### correspond à la durée de la période de l'annonce au format de durée DASH standard. Si la durée de la période n'est pas indiquée, cette macro doit être remplacée par une chaîne vide.
|
duration="PT15S" |
$$pod-duration$$ |
Durée prévue des annonces à prendre pour cette série d'annonces, en millisecondes. | 15000 |
$$number-of-repeated-segments$$ |
Cette valeur est calculée en divisant la durée de la période d'annonce (en millisecondes) par la valeur de segment_duration_ms, puis en arrondissant le résultat à l'entier le plus proche. | 3 |
$$cust_params$$ |
Le cas échéant, cette macro peut être remplacée par les paramètres de ciblage personnalisés propres à la coupure publicitaire en cours. La valeur doit respecter le format décrit dans cet article du Centre d'aide Ad Manager. Si aucun paramètre personnalisé n'est nécessaire, cette macro doit être remplacée par une chaîne vide. |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
Cette macro doit être remplacée par une valeur scte35 propre à cette coupure publicitaire, le cas échéant. Si aucune information scte35 n'est nécessaire, remplacez cette macro par une chaîne vide. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
Jeton HMAC signé, encodé au format URL. Ce jeton est obligatoire. |
custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
|
Modèle de période brute contenant des macros
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>
Période glissante de l'annonce
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
Insérer les points renseignés dans le fichier manifeste DASH
Enfin, remplacez la période appropriée dans votre fichier manifeste brut par la nouvelle période de l'annonce, puis renvoyez le fichier manifeste assemblé final au client vidéo à l'origine de la demande pour la lecture.
Exemple de fichier manifeste de contenu brut
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period start="PT0S">
<AdaptationSet bitstreamSwitching="true">
<Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
<SegmentBase>
<Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
<SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
<SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
<SegmentBase>
<Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
<SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
<SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
<SegmentBase>
<Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
<SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
<SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
...
</SegmentList>
</Representation>
...
</AdaptationSet>
</Period end>
</MPD>
Exemple de fichier manifeste assemblé
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Félicitations ! Vous diffusez maintenant une diffusion en direct DASH avec des segments d'annonces fournis par l'API d'insertion dynamique de séries d'annonces.
Ressources supplémentaires
- Lecture de séries d'annonces avec le SDK IMA :
- Diffusion de séries d'annonces via l'API d'insertion dynamique d'annonce