Manifestbearbeitung für VOD-Streams

Die Pod Serving API bietet Zugriff auf Videoanzeigen-Pods mit adaptiver Bitrate, die so vorbereitet wurden, dass sie direkt in eine HLS- oder MPEG-DASH-Mediaplaylist für Nutzer eingefügt werden können.

In dieser Anleitung geht es vorrangig um die Implementierung eines einfachen Servers zur Pod-Bereitstellung für die Manifestbearbeitung für VOD-Streams.

Anfragen für Streammanifeste erhalten

Die Manifestbearbeitung muss einen API-Endpunkt bereitstellen, um Manifestanfragen von der Client-App des Videoplayers zu erfassen. Dieser Endpunkt muss mindestens eine Stream-ID aus der Clientplayer-App erfassen. Diese Stream-ID wird verwendet, um in Ihren Anzeigen-Pod-Anfragen die Streamingsitzung an Ad Manager zu identifizieren.

Außerdem benötigen Sie einige weitere Informationen, z. B. eine Content-ID, um den entsprechenden Contentstream zu identifizieren.

Beispiel für Endpunkt einer Manifestanfrage

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Pfadparameter
stream_id Die Ad Manager-Stream-ID aus der Videoplayer-App des Clients.
content_id Eine hypothetische ID, die dem Content-Video in Ihrem System entspricht.
format Ein hypothetischer Parameter, der dem Streamformat entspricht. Eine der folgenden Möglichkeiten:
mpd Für MPEG-DASH-Streams
m3u8 Für HLS-Streams

Contentstream abrufen

Verwenden Sie die in der Manifestanfrage erfasste Content ID, um den Contentstream auszuwählen, der mit Anzeigen kombiniert werden soll.

Manifeste für Anzeigen-Pods anfordern

Wenn Sie Anzeigen von Ad Manager anfordern möchten, muss Ihr Server eine POST-Anfrage an den Endpunkt der Anzeigen-Pods senden. Dabei werden die angeforderten Codierungsprofile, das Anzeigen-Tag und die Targeting-Parameter übergeben. Diese Anfrage enthält auch die Stream-ID, die Sie in Schritt 1 erfasst haben.

Im Gegenzug erhalten Sie eine Liste von Anzeigen-Pod-Objekten, die Manifestdateien für die Anzeigen-Pods enthalten, die vom Anzeigen-Tag des Publishers angefordert werden, sowie Informationen darüber, wann und wo sie in den Inhalt eingefügt werden sollen.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Pfadparameter
network_code Ad Manager 360-Netzwerkcode des Publishers
stream_id Die Stream-ID aus der Videoplayer-App des Clients.

JSON-Text

Textparameter
encoding_profiles Required Eine Liste mit JSON-Darstellungen der Codierungsprofile, die du für jede Werbeunterbrechung erhalten möchtest. Zusätzliche Informationen

Für eine möglichst nahtlose Wiedergabe sollte dies mit dem Satz der Codierungsprofile übereinstimmen, die in deinem Contentstream verwendet werden.

ad_tag Required Ein Anzeigen-Tag zum Anfordern von VMAP-Anzeigen.
cuepoints Optional Eine Liste der Cue-Punkte im Contentstream, an denen Mid-Roll-Werbeunterbrechungen eingefügt werden. Cue-Punkte werden in Gleitkommasekunden gemessen.

Nur für VMAP-Antworten erforderlich, die Mid-Rolls mit positionsbezogenen Zeitverschiebungen enthalten. Das kommt jedoch selten vor.

content_duration_seconds Optional Die Contentdauer in Sekunden.

Nur für VMAP-Antworten erforderlich, die Mid-Rolls mit prozentuellen Zeitverschiebungen enthalten. Das kommt jedoch selten vor.

manifest_type Optional Das Format der angefragten Anzeigenstreams, entweder hls oder dash. Der Standardwert ist hls.
dai_options Optional Zusätzliche Optionen, mit denen Aspekte der Darstellung der Manifeste gesteuert werden. Zusätzliche Informationen
Codierungsprofil
profile_name Required Eine Kennung für dieses Codierungsprofil. Sie können diesen Wert beliebig festlegen. Es ist jedoch nicht möglich, mehrere Codierungsprofile mit demselben Namen im selben Stream zu haben.
type Required Der Codierungstyp des in diesem Codierungsprofil beschriebenen Streams. Inhaltstypen sind: media, iframe, subtitles.
container_type Required Das von diesem Codierungsprofil verwendete Containerformat. Für Containerformate gilt: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional Erforderlich, wenn der Codierungsprofiltyp iframe ist. Andernfalls ist er nur zulässig, wenn der Medientyp „Video“ enthält. Weitere Informationen finden Sie unten.
audio_settings Optional Erforderlich, wenn das Codierungsprofil Audiodaten enthält. Nur zulässig, wenn der Typ „Medien“ ist. Zusätzliche Informationen
subtitle_settings Optional Erforderlich, wenn das Codierungsprofil Untertitel enthält. Zusätzliche Informationen
Videoeinstellungen
codec Required Der RFC6381-Codec-String.

Beispiel: avc1.4d000c

bitrate Required Eine Ganzzahl, die die maximale Videobitrate dieses Profils in Byte pro Sekunde darstellt.
frames_per_second Required Die Framerate des Videos als Gleitkommazahl.
resolution Required Ein JSON-codierter Wert, der „Breite“ und „Höhe“ des Videos in Pixeln enthält.

Beispiel: {"width": 640, "height": 320}

Audioeinstellungen
codec Required Der RFC6381-Codec-String.

Beispiel: mp4a.40.5

bitrate Required Eine Ganzzahl, die die maximale Audiobitrate dieses Profils in Byte pro Sekunde darstellt.

Beispiel: 300000

channels Required Eine Ganzzahl, die die Anzahl der Audiokanäle einschließlich Niederfrequenzkanälen darstellt.
sample_rate Required Ganzzahl, die die Audioabtastrate in Hertz darstellt.

Beispiel: 4800

Untertiteleinstellungen
format Required Das für In-Band-Untertitel verwendete Dateiformat. Unterstützte Werte sind webvtt oder ttml.
language Optional Die Untertitelsprache als RFC5646-Sprachstring. Falls angegeben, wird dieser Wert nur für das DASH-Rendering verwendet.

Beispiel: en-us

Optionen für die dynamische Anzeigenbereitstellung
dash_profile Optional Das MPEG-DASH-Profil, das auf Anzeigen-Pod-Manifeste angewendet werden soll. Diese Einstellung wird nur für DASH-Manifeste verwendet. Zulässige Werte sind live und on-demand. Der Standardwert ist on-demand.

Der Wert live entspricht dem MPEG-DASH-Profil "urn:mpeg:dash:profile:isoff-live:2011".

Der Wert on-demand entspricht dem MPEG-DASH-Profil urn:mpeg:dash:profile:isoff-on-demand:2011.

ad_pod_timeout Optional Die maximale Zeit, die für die Auswahl von Anzeigen und die Erstellung von Anzeigen-Pods benötigt wird, in Gleitkommasekunden. Nach Ablauf dieser Zeit werden in Ad Manager alle Anzeigen zurückgegeben, die bereits in der ad_pods-Antwort ausgewählt wurden, und die Verarbeitung wird beendet.
sam_id Optional Gibt einen alternativen Fehlerbehebungsschlüssel an, der zum Nachschlagen von Sitzungen in der Überwachung der Streamingaktivitäten verwendet werden kann.

Antwort

Antwortparameter
valid_for Dauer im Format dhms (Tage, Stunden, Minuten, Sekunden), während der diese Anzeigen-Pod-Playlists gültig sind.
valid_until Das Datum und die Uhrzeit, bis zu der diese Anzeigen-Pod-Playlists gültig sind, als ISO8601-Datetime-String im Format yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm.
ad_pods Eine Liste der für diesen Stream ausgewählten Anzeigen-Pods.
Anzeigen-Pod
manifest_uris Nur für HLS-Streams. Eine Zuordnung von Codierungsprofil-IDs zu HLS-Manifest-URIs.
mpd_uri Nur für DASH-Streams. Der URI der DASH-MPD-Datei
type Der Typ des Anzeigen-Pods. Die Anzeigen-Pod-Typen sind pre, mid oder post.
start Nur für Mid-Roll-Anzeigen-Pods. Die Position im Stream, an der dieser Anzeigen-Pod eingefügt werden soll, in Gleitkommasekunden.
duration Das ist die Dauer dieses Anzeigen-Pods in Gleitkommasekunden.
midroll_index Nur für Mid-Roll-Anzeigen-Pods. Der Index des aktuellen Mid-Roll-Anzeigen-Pods Die Indexierung beginnt mit 1.

Beispielanfrage (cURL)

curl -X POST \
     -d '@request-body.json' \
     -H 'Content-Type: application/json' \
  https://dai.google.com/ondemand/pods/api/v1/network/21775744923/streams/6e69425c-0ac5-43ef-b070-c5143ba68541:CHS/adpods

Beispiel für den Anfragetext

Dies ist der Inhalt von request_body.json, auf den im obigen cURL-Aufruf verwiesen wird.

{
  "encoding_profiles": [
   {
     "profile_name": "1080p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000c",
       "bitrate": 5000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 1920,
         "height": 1080
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 300000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "360p",
     "type": "media",
     "container_type": "mpeg2ts",
     "video_settings": {
       "codec": "avc1.4d000d",
       "bitrate": 1000000,
       "frames_per_second": 30.0,
       "resolution": {
         "width": 640,
         "height": 360
       }
     },
     "audio_settings": {
       "codec": "mp4a.40.5",
       "bitrate": 64000,
       "channels": 2,
       "sample_rate": 48000
     }
   },
   {
     "profile_name": "subtitles-webvtt",
     "type": "subtitles",
     "subtitle_settings": {
       "format": "webvtt"
     }
   }
 ],
 "ad_tag": "https://pubads.g.doubleclick.net/gampad/ads?...",
 "manifest_type": "hls"
}

Beispielantwort

{
  "valid_for": "8h0m0s",
  "valid_until": "2023-03-24T08:30:26.839717986-07:00",
  "ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/1/profile/subtitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        ]"1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile.m3u8",
        "subtitles-webvtt": "https://{...}/pod/0/profile/subtitles-en.vtt""
      },
      "type": "post",
      "duration": 10.0
    }
  ]
}

Anzeigen-Pods in Content einfügen

Wie Anzeigen-Pods in Contentstreams eingefügt werden, hängt von Ihrer Implementierung, dem Streamformat und den Funktionen ab, die Sie aus den Formatspezifikationen implementieren möchten. Die folgenden Workflows sind Vorschläge für die Handhabung dieses Prozesses. Die genauen Details Ihrer Implementierung können je nach Ihren Geschäftsanforderungen und Ihren Inhaltsstreams variieren.

HLS-Streams

Wenn Sie einen Stream im HLS-Format zusammenfügen, besteht der Contentstream eine mehrere Variantenplaylist von Links zu separaten Streammanifesten, eines für jedes Codierungsprofil. Ihre Anzeigen-Pods müssen in jedes dieser Variantenmanifeste eingefügt werden. Eine Möglichkeit besteht darin, alle Variantenmanifeste vorzubereiten und zum Hosten an ein Content Delivery Network (CDN) zu übergeben. Die endgültige Playlist mit mehreren Varianten besteht aus einer Reihe von Links zu diesen CDN-gehosteten Manifesten.

Über Codierungsprofile iterieren

Erfassen Sie für jedes Codierungsprofil alle zugehörigen Anzeigen-Pod-Manifeste aus der Ad Manager-Antwort zusammen mit den zugehörigen Startzeiten. Legen Sie für Pre-Roll-Anzeigen-Pods die Startzeit auf 0 fest. Verwenden Sie bei Post-Rolls die Dauer des Contents als Startzeit des Anzeigen-Pods. Ermitteln Sie in der Playlist mit mehreren Varianten den Variantenstream, der den Audio- und Videoeinstellungen jedes Codierungsprofils entspricht.

Beispiel für ein Array mit Anzeigen-Pods
"ad_pods": [
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/0/profile/1080p.m3u8",
        "360p": "https://{...}/pod/0/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/0/profile/subitles-en.vtt"
      },
      "type": "pre",
      "duration": 10.0
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/1/profile/1080p.m3u8",
        "360p": "https://{...}/pod/1/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/1/profile/subitles-en.vtt"
      },
      "type": "mid",
      "start": 15.0,
      "duration": 15.0,
      "midroll_index": 1
    },
    {
      "manifest_urls":{
        "1080p": "https://{...}/pod/2/profile/1080p.m3u8",
        "360p": "https://{...}/pod/2/profile/360p.m3u8",
        "subtitles-en": "https://{...}/pod/2/profile/subitles-en.vtt"
      },
      "type": "post",
      "duration": 10.0
    }
  ]
Beispiel für eine Playlist mit mehreren Varianten
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://{...}/subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{...}/360p.m3u8
Beispiele für erfasste Variantendaten
Encoding profile: "1080p"
Profile settings: {...}
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://{...}/pod/0/profile/1080p.m3u8
   15 -> https://{...}/pod/1/profile/1080p.m3u8
  600 -> https://{...}/pod/2/profile/1080p.m3u8

Anzeigen in jedes Variantenmanifest einfügen

Prüfen Sie für jeden Variantenstream die Segmente des Inhaltsmanifests und behalten Sie die laufende Inhaltszeit bei. Wenn Sie die Startposition eines Anzeigen-Pods erreichen, extrahieren Sie die Liste der Segmente aus dem Manifest des Anzeigen-Pods, umschließen Sie die Liste der Segmente in zwei #EXT-X-DISCONTINUITY-Tags und fügen Sie die Liste an der aktuellen Position im Inhaltsmanifest ein. Fahren Sie mit diesem Vorgang fort, bis alle Anzeigen-Pods und Variantenstreams verarbeitet wurden.

Die resultierenden Manifeste müssen dem HLS-Standard entsprechen. Daher müssen Sie je nachdem, welche Funktionen der Spezifikation Ihr Inhaltsmanifest enthält, möglicherweise einen letzten Durchlauf für das kombinierte Manifest ausführen, um Mediensequenznummern, die Inhaltsdauer, Diskontinuitätssequenznummern und alle anderen Tags zu korrigieren, die aktualisiert werden müssen, um die neuen Anzeigensegmente zu berücksichtigen. Sobald etwaige Abweichungen mit dem Standard behoben wurden, übertragen Sie jedes nutzerspezifische Variantenmanifest zum Hosting an Ihr CDN.

Wenn das Inhaltsmanifest verschlüsselt ist, müssen Sie den letzten Verschlüsselungsschlüssel, der vor dem Start des aktuellen Anzeigen-Pods gefunden wurde, in einem #EXT-X-KEY-Tag speichern. Anschließend müssen Sie das Tag #EXT-X-KEY:METHOD=NONE vor dem ersten Segment jedes Anzeigen-Pods hinzufügen, um die Verschlüsselung zu entfernen. Abschließend müssen Sie nach jedem Anzeigen-Pod eine Kopie des gespeicherten #EXT-X-KEY-Tags vor dem ersten Contentsegment hinzufügen, um die Inhaltsverschlüsselung wiederherzustellen.

Beispiele für erfasste Variantendaten
Encoding profile: "1080p"
Content manifest: https://{...}/1080p.m3u8
Ad pods (start time -> manifest):
    0 -> https://dai.google.com/{...}pod/0/profile/1080p.m3u8
   15 -> https://dai.google.com/{...}pod/1/profile/1080p.m3u8
  600 -> https://dai.google.com/{...}pod/2/profile/1080p.m3u8
Beispiel für ein Inhaltsmanifest

Dies ist der Inhalt des Manifests https://{...}/1080p.m3u8, das in den erfassten Variantendaten aufgeführt ist.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}
Beispiel für ein Manifest eines Anzeigen-Pods

Dies ist der Inhalt des Manifests https://dai.google.com/{...}/pod/1/profile/1080p.m3u8, das in den erfassten Variantendaten aufgeführt ist.

#EXTM3U
{...}
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
Beispielmanifest für zusammengefügte Varianten

Dies wäre das resultierende Manifest der kombinierten Variante, das an das CDN übergeben und unter https://cdn.{...}/{userid}/1080p.m3u8 gehostet wird.

#EXTM3U
{...}
#EXTINF:5.000,
https://{...}/1080p/content-segment-0.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-1.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://dai.google.com/{...}/0.ts
#EXTINF:5.000,
https://dai.google.com/{...}/1.ts
#EXTINF:5.000,
https://dai.google.com/{...}/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.000,
https://{...}/1080p/content-segment-3.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-4.ts
#EXTINF:5.000,
https://{...}/1080p/content-segment-5.ts
{...}

Playlist mit mehreren Varianten erstellen

Erfassen Sie die CDN-Adressen für jedes ausgefüllte Variantenmanifest zusammen mit den übereinstimmenden Details des Codierungsprofils und stellen Sie die Ergebnisse in einem neuen Manifest mit mehreren Varianten zusammen. Dieses nutzerspezifische Manifest wird als Antwort auf die Manifestanfrage zurückgegeben, die Sie in Schritt 1 erhalten haben.

Beispiel für eine finale Playlist mit mehreren Varianten
#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs0",LANGUAGE="en",NAME="English",AUTOSELECT=YES,DEFAULT=YES,URI="https://cdn.{...}-subitles-en.vtt"
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/{userid}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/{userid}/360p.m3u8

MPEG DASH-Streams

Wenn Sie einen Stream im MPEG DASH-Format zusammenfügen, müssen Sie nur eine einzelne Datei erstellen. Dadurch lassen sich DASH-Streams einfacher zusammenfügen als HLS.

Eine korrekt vorbereitete MPD-Datei (MPEG DASH Media Presentation Description) sollte aus mehreren Punkten bestehen, die jeweils mehrere Darstellungen enthalten. Jede Darstellung sollte einem Ihrer Codierungsprofile entsprechen. Jeder von Ad Manager zurückgegebene Anzeigen-Pod ist auch eine MPD-Datei, die eine Abfolge von Zeiträumen mit übereinstimmenden Darstellungen enthält.

Um diese MPD-Dateien zusammenzufügen, notieren Sie sich zuerst die Startzeiten für jeden Anzeigen-Pod. Fügen Sie für Pre-Rolls die Zeiträume des Pre-Roll-Anzeigen-Pods vor einem Inhaltszeitraum ein. Fügen Sie bei Post-Rolls die Post-Roll-Anzeigen-Pod-Zeiträume nach allen Inhaltszeiträumen ein. Iterieren Sie über die Zeiträume in der Inhalts-MPD und verfolgen Sie die verstrichene Spielzeit für alle verarbeiteten Inhaltszeiträume. Wenn Sie eine Grenze zwischen Zeiträumen erreichen, die der Startzeit eines Anzeigen-Pods entspricht, fügen Sie die Zeiträume aus der passenden MPD-Datei des Mid-Roll-Anzeigen-Pods an dieser Grenze ein.

Die fertige zusammengefügte MPD-Datei muss vollständig den MPEG_DASH-Spezifikationen entsprechen. Sie müssen also möglicherweise noch einmal über die endgültige Datei iterieren, um die Startzeiten des Zeitraums zu korrigieren, die Dauer der Medienpräsentation für die neu eingefügten Werbezeiträume anzupassen und alle anderen Konflikte zu beheben, die beim Stitching-Prozess aufgetreten sein könnten.

MPD-Datei mit Beispielinhalt

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M00.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Beispiel für JSON-Anzeigen-Pod

[{
  "mpd_uri": "https://{...}pod/1.mpd",
  "type": "mid",
  "start": 15.0,
  "duration": 15.0,
  "midroll_index": 1
}]

Beispiel für MPD-Datei für einen Anzeigen-Pod

Dies ist der Inhalt von mpd_uri aus der JSON-Datei des Anzeigen-Pods oben.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H0M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Ad Pod 1</Title>
  </ProgramInformation>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  ...
</MPD>

Beispiel für zusammengefügte MPD-Datei

Liefere dies als Antwort auf die ursprüngliche Stream-Manifest-Anfrage.

<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H10M15.000S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
  <ProgramInformation moreInformationURL="http://.../info">
    <Title>Example Stream</Title>
  </ProgramInformation>
  <Period duration="PT0H0M15.000S" id="content-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-1">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-2">
    ...
  </Period>
  <Period duration="PT0H0M5.000S" id="ad-pod-1-period-3">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-2">
    ...
  </Period>
  <Period duration="PT0H0M15.000S" id="content-period-3">
    ...
  </Period>
  ...
</MPD>

Zusätzliche Ressourcen