L'API Pod Serving permet d'accéder à des segments d'annonces encodés et conditionnés, préparés de telle sorte qu'ils puissent être assemblés directement dans un flux HLS destiné à l'utilisateur ; ou MPEG-DASH. Pour MPEG-DASH, l'API Pod Serving fournit également une modèle de fichier manifeste afin de fournir des informations supplémentaires et du contexte pour ces annonces segments.
Ce guide est axé sur l'implémentation d'une manipulation de base du fichier manifeste pour la diffusion de séries d'annonces. pour les diffusions en direct.
Conditions préalables: Configurer des événements de diffusion en direct dans Google Ad Manager
Avant d'envoyer une demande à partir de l'API de diffusion de séries d'annonces, vous devez créer une annonce
Événement de diffusion en direct géré par l'administrateur pour chaque diffusion que vous traitez. Vous pouvez créer un
diffusion en direct
LiveStreamEventService API
ou
Interface Web de Google Ad Manager
Pour utiliser un événement diffusé en direct avec l'API de diffusion de pods, vous devez : renseigner plusieurs attributs de votre événement:
customAssetKey
: identifiant personnalisé à utiliser pour cet événement. Doit être uniques parmi tous les événements du réseau.adTags
– URL du tag d'emplacement publicitaire principal générée par le trafficking dans Ad Manager du workflow.dynamicAdInsertionType
: doit être défini surPOD_SERVING_REDIRECT
.streamingFormat
: à définir surHLS
ouDASH
en conséquence.segmentUrlAuthenticationKeyIds
- au moins un Clé HMAC servant à signer les demandes de segments d'annonces.daiEncodingProfileIds
: liste des DAIEncodingProfile ID 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 pour écouter le fichier manifeste à partir de l'application cliente du lecteur vidéo. Ce point de terminaison doit au minimum collecter un ID de flux à partir de l'application du lecteur client et renvoyer un le fichier manifeste de flux. L'ID de flux permet d'identifier la session de streaming sur l'annonce. Gestionnaire.
Vous devez également recueillir d'autres informations pour identifier flux de contenu (par exemple, un système d'identification de contenu).
Exemple de point de terminaison de requête de fichier manifeste potentiel
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Paramètres de chemin d'accès | |||||
---|---|---|---|---|---|
asset_key |
Un ID fictif correspondant à la diffusion en direct demandée dans votre système | ||||
format |
Paramètre hypothétique correspondant au format du flux. Au choix:
|
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager provenant de l'application de lecteur vidéo cliente. |
Récupérer le flux de contenu
Utiliser l'ID de contenu collecté dans la demande du fichier manifeste pour sélectionner le contenu pour ajouter des annonces.
Assembler les segments d'annonces dans le flux de contenu
L'association des URL de segments d'annonces varie en fonction du format de votre flux.
Flux HLS
Les flux HLS sont généralement diffusés sous la forme d'un fichier manifeste multivariante, qui contient une Ensemble de liens vers des fichiers manifestes de variantes, qui correspondent à chacun des types d'encodage profils.
Remarque: Par souci de simplicité, ce guide part du principe que votre contenu HLS est encodé au format qui combine l'audio et la vidéo dans le même fichier segment.
Playlists de multivariantes avec proxy
Vous devez remplacer l'URL de la playlist de chaque variante dans la multivariante d'origine playlist avec un autre appel du point de terminaison au manipulateur pour traiter les fichier manifeste de la variante sélectionnée.
Les étapes restantes pour l'assemblage du HLS supposent qu'un fichier manifeste de variante unique 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 de chemin d'accès | |
---|---|
asset_key |
Un ID fictif correspondant à la diffusion en direct demandée dans votre système |
variant |
Paramètre fictif contenant un identifiant pour la variante spécifique en cours de traitement. |
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager provenant 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 multivariantes non traités
#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 multivariantes avec 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 coupure publicitaire et insérer les discontinuités
Lorsque vous traitez le fichier manifeste de la variante, notez l'heure de début, la durée et index de la prochaine coupure publicitaire à venir, jusqu'à ce que le fichier manifeste dynamique soit en cours de traitement contient des segments qui seront remplacés par le contenu de l'annonce.
Les coupures publicitaires peuvent être différenciées des segments de contenu de différentes manières,
sur votre encodeur. Pour délimiter une coupure publicitaire, le plus souvent, il faut faire précéder l'annonce
à l'aide d'une balise #EXT-X-CUE-OUT
et ensuite 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 tags #EXT-X-DISCONTINUITY
au début et à la fin de chaque coupure publicitaire. Si ces
les 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 devrez également supprimer le chiffrement en spécifiant #EXT-X-KEY:METHOD=NONE
avant le premier segment d'annonces de chaque coupure publicitaire, puis ajoutez-le de nouveau après la
la coupure publicitaire.
Exemple de fichier manifeste (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 des discontinuités insérées
#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éries d'annonces
Pour chaque segment d'une série d'annonces, vous devez effectuer le suivi de quelques valeurs supplémentaires:
segment_number
: indexe 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. Ce doit être identique pour tous les segments, à l'exception du dernier de la série d'annonces.segment_offset
: décalage du segment calculé en ajoutant les valeurs durée du segment par rapport au décalage de son segment en millisecondeslast
: valeur booléenne identifiant le dernier segment d'une série d'annonces. Valeurs par défaut sur "false".
Créer des URL de segment 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 de 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 LiveStreamEventService ou sur la page de diffusion en direct dans l'interface Web d'Ad Manager 360. |
pod_id
|
Identifiant de la coupure publicitaire. La valeur doit être un nombre entier commençant à
1 , puis augmenter d'une unité pour chaque coupure publicitaire.
<ph type="x-smartling-placeholder"></ph> Cette valeur doit être identique pour tous les utilisateurs qui voient 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. Lorsque 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 fonctionnalité de création de flux
requête.
|
sd
|
Obligatoire | segment_duration
|
so
|
Facultatif | segment_offset
Si |
pd
|
Obligatoire, sauf pour les événements pour lesquels des coupures publicitaires sans durée sont activées | Durée de la coupure publicitaire (en millisecondes). Également appelé
ad_pod_duration
|
auth-token
|
Obligatoire | Une clé-valeur signée, encodée au format URL Jeton HMAC 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 pouvoir être utilisées sans risque pour les URL. C'est
C'est particulièrement important pour le champ auth-token
, car il peut contenir /
,
+
et =
.
Exemple de fichier manifeste (après le remplacement d'un 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 pods.
Flux DASH
Les flux DASH sont fournis sous la forme d'un fichier MPD contenant tous les encodages de flux au format dans un fichier unique, dans lequel 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 de la coupure publicitaire, une fois que les macros qu'elle contient ont é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 à réutiliser avec chaque coupure publicitaire.
Point de terminaison de la requête du 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 de chemin d'accès | |
---|---|
network_code |
Le code de réseau Ad Manager 360 de l'éditeur. |
custom_asset |
Clé d'élément personnalisé de l'événement en direct dans Google Ad Manager. |
Paramètres de requête | |
---|---|
stream_id |
ID de flux Ad Manager indiqué dans le 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 média publicitaire dans le modèle de période tiret, au format 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 des valeurs dans le modèle de période
Le modèle de période contient plusieurs macros que vous devez remplacer pour chaque annonce. casser. Toutes les macros doivent être remplacées. Les macros inutilisées doivent être remplacées par un Chaîne vide ("").
Macro | Description | Exemple |
---|---|---|
$$pod-id$$ |
Indice de la série d'annonces représentée par cette période. Cette valeur doit correspondre pour la même série d'annonces dans toutes les sessions de visionnage. | 1 |
$$period-start$$ |
Heure à laquelle la période commence dans la description de la présentation du média actuelle. Un 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 diffusion de l'annonce. Un attribut facultatif qui doit
être remplacé par duration="###" , où ### est le
durée de la période de l'annonce au format de durée standard DASH. Si le
n'est pas spécifiée, cette macro doit être remplacée par
une chaîne vide.
|
duration="PT15S" |
$$pod-duration$$ |
Durée prévue des annonces devant être définie pour cette série d'annonces, dans millisecondes. | 15000 |
$$number-of-repeated-segments$$ |
Cette valeur est calculée en divisant la durée de la période de l'annonce (en millisecondes) par la valeur de segment_duration_ms, et en arrondissant à le nombre entier le plus proche. | 3 |
$$cust_params$$ |
Elle peut être remplacée par les paramètres de ciblage personnalisé propres à la coupure publicitaire en cours, si. fournies. La valeur doit respecter le format décrit dans cette documentation Ad Manager cet article du Centre d'aide. Si aucun paramètre personnalisé n'est nécessaire, cette macro doit être remplacée par une valeur . |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
Elle doit être remplacée par une valeur scte35 propre à cette coupure publicitaire. le cas échéant. Si aucune information scte35 n'est nécessaire, cette macro doit par une chaîne vide. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
Une clé-valeur signée, encodée au format URL Jeton HMAC : Veuillez indiquer ce jeton. |
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 d'annonces renseignée
<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 vos règles renseignées dans le fichier manifeste DASH
Enfin, remplacez le point approprié dans votre fichier manifeste brut par le nouveau d'une période d'annonce insérée, puis renvoyer le fichier manifeste final assemblé au gestionnaire 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 désormais une diffusion en direct DASH avec des segments d'annonces par l'API d'insertion dynamique de pods.
Ressources supplémentaires
- Diffusion de séries d'annonces avec le SDK IMA: <ph type="x-smartling-placeholder">
- Lecture de la diffusion de séries d'annonces avec l'insertion dynamique d'annonce API