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 für den Nutzer sichtbare HLS- oder MPEG-DASH-Medienplaylist eingefügt werden können.

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

Stream-Manifestanfragen erhalten

Die Manifestbearbeitung muss einen API-Endpunkt bereitstellen, um Manifestanfragen von der Client-App des Videoplayers zu erfassen. Der Endpunkt muss mindestens eine Stream-ID aus der Clientplayer-App erfassen. Anhand dieser Stream-ID wird in Ihren Anzeigen-Pod-Anfragen die Streamingsitzung für Ad Manager identifiziert.

Außerdem musst du einige weitere Informationen erfassen, um den entsprechenden Contentstream zu identifizieren, z. B. eine Content ID.

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 Contentvideo in Ihrem System entspricht.
format 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 Content ID aus der Manifestanfrage, um den Contentstream auszuwählen, der mit Anzeigen kombiniert werden soll.

Manifeste für Anzeigen-Pod anfordern

Wenn Sie Anzeigen von Ad Manager anfordern möchten, muss Ihr Server eine POST-Anfrage an den Endpunkt der Anzeigen-Pods senden und 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 mit Manifestdateien für die Anzeigen-Pods, die vom Anzeigen-Tag des Publishers angefordert wurden, sowie Informationen darüber, wann und wo die Objekte 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 Der 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 den Codierungsprofilen deines Contentstreams übereinstimmen.

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

Nur für VMAP-Antworten erforderlich, die Mid-Rolls mit positionsbasierten Zeitverschiebungen enthalten. Das kommt nicht häufig vor.

content_duration_seconds Optional Die Contentdauer in Sekunden.

Nur für VMAP-Antworten, die Mid-Rolls enthalten, mit prozentualen Zeitverschiebungen erforderlich. Das kommt nicht häufig vor.

manifest_type Optional Das Format der angeforderten Datenstreams, 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. Dieser Wert kann ein beliebiger String sein. 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. Die Inhaltstypen sind: media, iframe und subtitles.
container_type Required Das von diesem Codierungsprofil verwendete Containerformat. Containerformate: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional Erforderlich, wenn der Codierungsprofiltyp iframe ist. Andernfalls ist sie 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 Der Gleitkommawert pro Sekunde des Videos.
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 Audio-Bitrate 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 Audio-Abtastrate in Hertz darstellt.

Beispiel: 4800

Untertiteleinstellungen
format Required Das für In-Band-Untertitel verwendete Dateiformat. Unterstützte Werte sind webvtt und ttml.
language Optional Die Untertitelsprache als RFC5646-Sprachstring. Wenn dieser Wert angegeben ist, wird er 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 dieses Zeitraums 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 Schlüssel zur Fehlerbehebung an, mit dem Sitzungen in der Überwachung der Streamaktivität gesucht werden können.

Antwort

Antwortparameter
valid_for Dauer, für die diese Anzeigen-Pod-Playlists im Format dhms (Tage, Stunden, Minuten, Sekunden) gültig sind.
valid_until Das Datum und die Uhrzeit, bis zu der diese Anzeigen-Pod-Playlists gültig sind, als ISO8601-Datum/Uhrzeit-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. 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 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 anhand der Formatspezifikationen implementieren. Die folgenden Workflows sind Vorschläge für den Umgang mit diesem Prozess. 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 aus einer mehreren Varianten-Playlist mit Links zu separaten Streammanifesten – einer 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 an ein Content Delivery Network (CDN) zum Hosten zu übergeben. Die endgültige Playlist mit mehreren Varianten besteht aus Links zu diesen CDN-gehosteten Manifesten.

Über Codierungsprofile iterieren

Erfassen Sie für jedes Codierungsprofil alle zugehörigen Manifeste des Anzeigen-Pods aus der Ad Manager-Antwort zusammen mit den zugehörigen Startzeiten. Lege für Pre-Roll-Anzeigen-Pods die Startzeit auf 0 fest. Verwenden Sie bei Post-Rolls die Dauer des Inhalts als Startzeit des Anzeigen-Pods. Ermitteln Sie den Variantenstream in der Playlist mit mehreren Varianten, 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
    }
  ]
Beispielplaylist für Inhalte 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

Gehen Sie für jeden Variantenstream die Segmente des Inhaltsmanifests durch und halten Sie dabei die gesamte verstrichene Inhaltszeit aufrecht. 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. Wiederholen Sie diesen Vorgang, bis alle Anzeigen-Pods und Variantenstreams verarbeitet sind.

Die resultierenden Manifeste müssen dem HLS-Standard entsprechen. Je nachdem, welche Funktionen der Spezifikation in Ihrem Inhaltsmanifest enthalten sind, müssen Sie möglicherweise einen letzten Durchlauf für das kombinierte Manifest ausführen, um Mediensequenznummern, Inhaltsdauer, Diskontinuitätssequenznummern und andere 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 hinzufügen, um die Verschlüsselung vor dem ersten Segment jedes Anzeigen-Pods zu entfernen. Schließlich müssen Sie nach jedem Anzeigen-Pod vor dem ersten Inhaltssegment eine Kopie des gespeicherten #EXT-X-KEY-Tags einfü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 ist das resultierende kombinierte Variantenmanifest, 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 abgeschlossene Variantenmanifest zusammen mit den übereinstimmenden Codierungsprofildetails 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 ordnungsgemäß vorbereitete MPD-Datei (MPEG DASH Media präsentieren) sollte aus mehreren Zeiträumen bestehen, die jeweils mehrere Darstellungen enthalten. Jede Darstellung sollte einem Ihrer Codierungsprofile entsprechen. Jeder von Ad Manager zurückgegebene Anzeigen-Pod ist ebenfalls eine MPD-Datei, die eine Abfolge von Zeiträumen mit übereinstimmenden Darstellungen enthält.

Notieren Sie sich zum Zusammenfügen dieser MPD-Dateien die Startzeiten für jeden Anzeigen-Pod. Fügen Sie für Pre-Roll-Anzeigen die Zeiträume für Pre-Roll-Anzeigen vor einem beliebigen Inhaltszeitraum ein. Fügen Sie für Post-Roll-Anzeigen die Zeiträume für Post-Roll-Anzeigen nach allen Inhaltsperioden ein. Iterieren Sie die Zeiträume in der Inhalts-MPD und erfassen Sie die verstrichene Spielzeit für alle verarbeiteten Inhaltszeiträume. Wenn Sie eine Grenze zwischen Zeiträumen erreichen, die der Startzeit eines Anzeigen-Pods entsprechen, fügen Sie die Zeiträume aus der entsprechenden 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 die endgültige Datei iterieren, um die Startzeiten des Zeitraums zu korrigieren, die Dauer der Medienpräsentation für die neu eingefügten Anzeigenzeiträume anzupassen und alle anderen Konflikte zu beheben, die durch den Stitching-Prozess entstanden 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-MPD 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