Manipulator pliku manifestu w przypadku strumieni VOD

Interfejs Pod Wyświetlanie API zapewnia dostęp do bloków reklam wideo z adaptacyjną szybkością transmisji bitów, przygotowanych w taki sposób, że można je połączyć bezpośrednio z widoczną dla użytkowników playlistą multimediów HLS lub MPEG-DASH.

Ten przewodnik koncentruje się na implementowaniu podstawowego serwera do manipulacji plikami manifestu z podami na potrzeby strumieni VOD.

Odbieranie żądań manifestu strumienia

Manipulator manifestu musi udostępniać punkt końcowy API, aby nasłuchiwać żądań pliku manifestu z aplikacji klienckiej odtwarzacza wideo. Ten punkt końcowy musi zbierać co najmniej identyfikator strumienia z aplikacji odtwarzacza klienckiego. Służy on do identyfikowania sesji strumieniowego przesyłania danych do Ad Managera w żądaniach bloku reklamowego.

Musisz też zebrać inne informacje, aby zidentyfikować odpowiedni strumień treści, np. identyfikator treści.

Przykładowy punkt końcowy żądania pliku manifestu

GET /api/stream_id/{stream_id}/video/{content_id}.{format}
Host: {your_domain}
Parametry ścieżki
stream_id Identyfikator strumienia w usłudze Ad Manager z klienckiej aplikacji odtwarzacza wideo.
content_id Hipotetyczny identyfikator odpowiadający treści wideo w Twoim systemie.
format Hipotetyczny parametr odpowiadający formatowi strumienia. Jedna z tych opcji:
mpd Strumienie MPEG-DASH
m3u8 Strumienie HLS

Pobieranie strumienia treści

Użyj identyfikatora treści pobranego z żądania pliku manifestu, aby wybrać strumień treści do połączenia z reklamami.

Pliki manifestu żądań bloków reklamowych

Aby można było wysyłać żądania reklam do Ad Managera, serwer musi wysłać żądanie POST do punktu końcowego bloku reklamowego, przekazując żądane profile kodujące, tag reklamy i parametry kierowania. To żądanie zawiera też identyfikator strumienia zebrany w kroku 1.

W zamian otrzymujesz listę obiektów bloków reklamowych zawierających pliki manifestu, które są powiązane z blokami reklamowymi żądanymi przez tag reklamy wydawcy, oraz informacje o tym, kiedy i gdzie należy wstawić te elementy do treści.

POST /ondemand/pods/api/v1/network/{network_code}/streams/{stream_id}/adpods
Host: dai.google.com
Content-Type: application/json
Parametry ścieżki
network_code Kod sieci Ad Managera 360 wydawcy.
stream_id Identyfikator strumienia danych z klienckiej aplikacji odtwarzacza wideo.

Treść JSON

Parametry treści
encoding_profiles Required Lista reprezentacji JSON profili kodujących, które chcesz otrzymać w przypadku każdej przerwy na reklamę. Poniżej dowiesz się więcej na ten temat.

Aby odtwarzanie było jak najpłynniejsze, ten parametr powinien być zgodny z zestawem profili kodowania używanych w strumieniu treści.

ad_tag Required Tag reklamy do żądania reklam VMAP.
cuepoints Optional Lista punktów wstawienia reklamy w strumieniu treści, w których będą wstawiane przerwy na reklamy w trakcie filmu. Punkty wstawienia reklamy są mierzone w sekundach zmiennoprzecinkowych.

Wymagane tylko w przypadku odpowiedzi VMAP, które zawierają reklamy w trakcie filmu korzystające z przesunięcia czasu w funkcji pozycjonowania. Jest to rzadko spotykane.

content_duration_seconds Optional Czas trwania treści w sekundach.

Wymagane tylko w przypadku odpowiedzi VMAP, które zawierają reklamy w trakcie filmu korzystające z procentowego przesunięcia czasu. Jest to rzadko spotykane.

manifest_type Optional Format żądań strumieni reklam: hls lub dash. Wartością domyślną jest hls.
dai_options Optional Dodatkowe opcje sterujące aspektami renderowania plików manifestu. Poniżej dowiesz się więcej na ten temat.
Profil kodowania
profile_name Required Identyfikator tego profilu kodowania. Ta wartość może być dowolnym ciągiem znaków, ale w jednym strumieniu nie możesz mieć wielu profili kodujących o tej samej nazwie.
type Required Typ kodowania strumienia opisany w tym profilu kodowania. Typy treści: media, iframe i subtitles.
container_type Required Format kontenera używany przez ten profil kodujący. Formaty kontenerów to: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional Wymagany, jeśli typ profilu kodującego to iframe. W przeciwnym razie dozwolone tylko wtedy, gdy typ multimediów zawiera wideo. Zobacz szczegóły poniżej
audio_settings Optional Wymagany, jeśli profil kodujący zawiera dźwięk. Dozwolone tylko wtedy, gdy typ to media. Poniżej dowiesz się więcej na ten temat.
subtitle_settings Optional Wymagany, jeśli profil kodujący zawiera napisy. Poniżej dowiesz się więcej na ten temat.
Ustawienia filmu
codec Required Ciąg kodeka RFC6381.

Przykład: avc1.4d000c

bitrate Required Liczba całkowita określająca maksymalną szybkość transmisji wideo dla tego profilu w bajtach na sekundę.
frames_per_second Required Liczba zmiennoprzecinkowych FPS filmu.
resolution Required Zakodowana w formacie JSON wartość zawierająca atrybuty `width` i `height` w pikselach.

Przykład: {"width": 640, "height": 320}

Ustawienia dźwięku
codec Required Ciąg kodeka RFC6381.

Przykład: mp4a.40.5

bitrate Required Liczba całkowita określająca maksymalną szybkość transmisji dźwięku dla tego profilu (w bajtach na sekundę).

Przykład: 300000

channels Required Liczba całkowita określająca liczbę kanałów audio, w tym kanałów o niskiej częstotliwości.
sample_rate Required Liczba całkowita określająca częstotliwość próbkowania audio w hercach.

Przykład: 4800

Ustawienia napisów
format Required Format pliku używany przez napisy w pasku. Obsługiwane wartości to webvtt i ttml.
language Optional Język napisów jako ciąg znaków języka zgodny ze standardem RFC5646. Jeśli podasz tę wartość, będzie ona używana tylko do renderowania DASH.

Przykład: en-us

Opcje DAI
dash_profile Optional Profil MPEG-DASH do stosowania w plikach manifestu bloków reklamowych. To ustawienie jest używane tylko w przypadku plików manifestu DASH. Dozwolone wartości to live lub on-demand. Wartością domyślną jest on-demand.

Wartość live odpowiada profilu MPEG-DASH "urn:mpeg:dash:profile:isoff-live:2011".

Wartość on-demand odpowiada profilu MPEG-DASH urn:mpeg:dash:profile:isoff-on-demand:2011.

ad_pod_timeout Optional Maksymalny czas potrzebny na wybór reklam i tworzenie bloków reklamowych (w sekundach zmiennoprzecinkowych). Po upływie tego czasu Ad Manager zwraca wszystkie reklamy, które zostały już wybrane w odpowiedzi ad_pods, i zatrzymuje przetwarzanie.
sam_id Optional Określa alternatywny klucz debugowania, którego można używać do wyszukiwania sesji w narzędziu do monitorowania strumienia aktywności.

Odpowiedź

Parametry odpowiedzi
valid_for Czas trwania tych playlist bloków reklamowych w formacie dhms (dni, godziny, minuty, sekundy).
valid_until Data i godzina, do których te playlisty bloków reklamowych są prawidłowe jako ciąg znaków daty i godziny ISO8601 w formacie yyyy-MM-dd'T'hh:mm:ss.sssssssss[+|-]hh:mm.
ad_pods Lista bloków reklamowych wybranych na potrzeby tego strumienia.
Blok reklamowy
manifest_uris Tylko w przypadku strumieni HLS. Mapa identyfikatorów profili kodujących na identyfikatory URI pliku manifestu HLS.
mpd_uri Tylko w przypadku strumieni DASH. Identyfikator URI elementu MPD DASH.
type Typ bloku reklamowego. Typy bloków reklamowych: pre, mid i post.
start Dotyczy tylko bloków reklamowych w trakcie filmu. Pozycja w strumieniu, w której należy wstawić ten blok reklamowy, podana w sekundach zmiennoprzecinkowych.
duration Czas trwania tego bloku reklamowego w sekundach zmiennoprzecinkowych.
midroll_index Dotyczy tylko bloków reklamowych w trakcie filmu. Indeks bieżącego bloku reklamowego w trakcie filmu. Indeksowanie zaczyna się od 1.

Przykładowe żądanie (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

Przykładowy tekst żądania

To jest zawartość tagu request_body.json, do której odwołuje się dyrektywa cURL powyżej.

{
  "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"
}

Przykładowa odpowiedź

{
  "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
    }
  ]
}

Łączenie bloków reklamowych z treścią

Proces łączenia bloków reklamowych ze strumieniami treści różni się w zależności od implementacji, formatu strumienia i funkcji wybranych do implementacji ze specyfikacji formatu. Poniższe przepływy pracy zawierają sugestie dotyczące tego procesu. Szczegółowe informacje o wdrożeniu mogą się różnić w zależności od potrzeb biznesowych i strumieni treści.

Strumienie HLS

Jeśli łączysz strumień w formacie HLS, strumień treści będzie playlistą z wieloma wariantami z linkami prowadzącymi do osobnych plików manifestu strumienia – po jednym dla każdego profilu kodującego. Bloki reklamowe musisz umieścić w każdym z tych plików manifestu wariantów. Jednym ze sposobów jest przygotowanie wszystkich plików manifestu wariantów i przekazanie ich do sieci dystrybucji treści (CDN) na potrzeby hostowania. Końcowa playlista z wieloma wariantami to zbiór linków do tych plików manifestu hostowanych w sieci CDN.

Powtarzanie profili kodujących

W przypadku każdego profilu kodowania zbierz wszystkie powiązane pliki manifestu bloków reklamowych z odpowiedzi Ad Managera wraz z powiązanymi czasami rozpoczęcia. W przypadku bloków reklamowych przed filmem ustaw czas rozpoczęcia na 0. W przypadku reklam po filmie użyj czasu trwania treści jako czasu rozpoczęcia bloku reklamowego. Zidentyfikuj na playliście z wieloma wariantami strumień wariantów, który pasuje do ustawień dźwięku i obrazu w każdym profilu kodującym.

Przykładowa tablica bloków reklamowych
"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
    }
  ]
Przykładowa playlista treści z wieloma wariantami
#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
Przykładowe zebrane dane wersji
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

Wstaw reklamy do pliku manifestu każdego wariantu

W przypadku każdego strumienia wariantów przejdź przez segmenty w pliku manifestu treści, aby uzyskać łączny czas trwania treści. Gdy dotrzesz do pozycji początkowej bloku reklamowego, wyodrębnij listę segmentów z pliku manifestu tego bloku reklamowego, umieść listę segmentów w 2 tagach #EXT-X-DISCONTINUITY i wstaw listę w bieżącej lokalizacji w pliku manifestu treści. Kontynuuj ten proces, aż wszystkie bloki reklamowe i strumienie wariantów zostaną przetworzone.

Powstałe pliki manifestu muszą być zgodne ze standardem HLS. Dlatego też, w zależności od funkcji specyfikacji zawartych w pliku manifestu treści, konieczne może być ponowne przekazanie pliku manifestu w celu poprawienia numerów sekwencyjnych multimediów, czasu trwania treści, numerów sekwencji nieciągłości i innych tagów, które musisz zaktualizować w celu uwzględnienia nowych segmentów reklam. Po naprawieniu rozbieżności ze standardem prześlij plik manifestu każdego wariantu odpowiedniego dla użytkownika do swojej sieci CDN na potrzeby hostowania.

Jeśli Twój plik manifestu treści jest zaszyfrowany, musisz zapisać w tagu #EXT-X-KEY ostatni klucz szyfrowania znaleziony przed rozpoczęciem bieżącego bloku reklamowego. Następnie musisz dodać tag #EXT-X-KEY:METHOD=NONE, aby usunąć szyfrowanie przed pierwszym segmentem każdego bloku reklamowego. Aby przywrócić szyfrowanie treści, musisz dodać kopię zapisanego tagu #EXT-X-KEY przed pierwszym segmentem treści po każdym bloku reklamowym.

Przykładowe zebrane dane wersji
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
Przykładowy plik manifestu treści

To jest zawartość pliku manifestu https://{...}/1080p.m3u8 wymienionego w zebranych danych o wariantach.

#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
{...}
Przykładowy plik manifestu bloku reklamowego

To jest zawartość pliku manifestu https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 wymienionego w zbieranych danych o wariantach.

#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
Przykładowy plik manifestu połączonego wariantu

To wynikowy połączony plik manifestu wariantu przekazywany do CDN i hostowany na https://cdn.{...}/{userid}/1080p.m3u8.

#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
{...}

Utwórz playlistę z wieloma wariantami

Zbierz adresy CDN dla każdego ukończonego pliku manifestu wariantu wraz z informacjami o pasującym profilu kodowania i połącz wyniki w nowy plik manifestu z wieloma wariantami. Ten plik manifestu jest zwracany jako odpowiedź na żądanie pliku manifestu otrzymane w kroku 1.

Przykładowa playlista z końcową playlistą z wieloma wariantami
#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

Strumienie MPEG DASH

Jeśli łączysz strumień w formacie MPEG DASH, wystarczy, że utworzysz 1 plik. Może to ułatwić łączenie strumieni DASH niż HLS.

Prawidłowo przygotowany plik MPEG DASH z prezentacją multimediów (MPD) powinien składać się z kilku kropek, z których każda może zawierać wiele reprezentacji. Każda reprezentacja powinna pasować do jednego z Twoich profili kodujących. Każdy blok reklamowy zwrócony z Ad Managera jest też plikiem MPD zawierającym sekwencję kropek z pasującymi reprezentacjami.

Aby połączyć te pliki MPD, zacznij od zanotowania czasów rozpoczęcia każdego bloku reklamowego. W przypadku reklam przed filmem wstawiaj okresy bloków reklamowych przed filmem. W przypadku reklam po filmie wstaw okresy bloków reklamowych po filmie po wszystkich przedziałach czasu treści. Powtarzaj okresy w MPD treści, aby śledzić czas odtwarzania dla wszystkich przetworzonych okresów. Gdy osiągniesz granicę między okresami odpowiadającymi czasowi rozpoczęcia bloku reklamowego, wstaw przedziały z odpowiedniego pliku MPD bloku reklamowego w trakcie filmu na tej granicy.

Ostateczny połączony plik MPD musi być w pełni zgodny ze specyfikacją MPEG_DASH, więc konieczne może być ponowne powtórzenie ostatecznego pliku, poprawienie wszystkich czasów rozpoczęcia i poprawienie czasu trwania prezentacji multimediów, tak aby uwzględnić nowo wstawione okresy reklamowe, i wyeliminowanie wszelkich konfliktów, które mogły powstać w wyniku procesu łączenia.

Przykładowa zawartość prezentacji multimedialnej

<?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>

Przykładowy plik JSON bloku reklamowego

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

Przykładowy MPD bloku reklamowego

To jest zawartość pola mpd_uri z powyższego pliku JSON bloku reklamowego.

<?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>

Przykład połączonego opisu prezentacji multimedialnej (MPD)

Używaj go jako odpowiedzi na początkowe żądanie pliku manifestu strumienia.

<?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>

Dodatkowe zasoby