Manipulator pliku manifestu w przypadku strumieni VOD

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

Ten przewodnik koncentruje się na implementacji podstawowej manipulacji plikiem manifestu udostępniania podów serwera do transmisji strumieni VOD.

Otrzymuj żądania pliku manifestu strumienia

Manipulator manifestu musi udostępniać punkt końcowy interfejsu API, aby można było nasłuchiwać pliku manifestu żądania z aplikacji klienckiej odtwarzacza wideo. Ten punkt końcowy musi pobrać identyfikator strumienia z aplikacji klienckiej odtwarzacza. Ten identyfikator strumienia jest używany do: identyfikować sesję przesyłania strumieniowego z Ad Managerem w żądaniach bloku reklamowego.

Musisz też zebrać dodatkowe informacje, aby zidentyfikować odpowiednie strumienia 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 Ad Managera z aplikacji odtwarzacza wideo klienta.
content_id Hipotetyczny identyfikator odpowiadający filmowi treści w Twoim systemie.
format Hipotetyczny parametr odpowiadający formatowi strumienia. Jedna z tych możliwości:
mpd Strumienie MPEG-DASH
m3u8 W przypadku strumieni HLS

Pobieranie strumienia treści

Użyj identyfikatora treści zebranego w żądaniu pliku manifestu, aby wybrać treści i łączyć go z reklamami.

Żądanie plików manifestu podów reklamowych

Aby móc żądać reklam z Ad Managera, serwer musi wysłać do reklamy żądanie POST punktów końcowych podów, które przekazują żądane profile kodu, tag reklamy oraz ustawienia kierowania. . To żądanie zawiera też identyfikator strumienia zebrany w kroku 1.

W zamian otrzymasz listę obiektów bloków reklamowych, które zawierają pliki manifestu dla: bloki reklamowe żądane przez tag reklamy wydawcy oraz informacje o tym, kiedy i w których należy je wstawić.

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 wydawcy w usłudze Ad Manager 360.
stream_id Identyfikator strumienia z aplikacji klienckiej odtwarzacza.

Treść JSON

Parametry ciała
encoding_profiles Required Lista reprezentacji JSON profili kodujących, które chcesz otrzymywać dla każdej przerwy na reklamę. Poniżej dowiesz się więcej na ten temat.

Aby zapewnić możliwie płynne odtwarzanie, parametr ten powinien pasować do zestawu profili kodujących 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 mogą pojawić się przerwy na reklamę w trakcie filmu. zostaną wstawione. Punkty wstawienia reklamy są mierzone w sekundach zmiennoprzecinkowych.

Wymagane tylko w przypadku odpowiedzi VMAP, które zawierają reklamy w trakcie filmu z zastosowaniem positional. Jest to rzadkie zjawisko.

content_duration_seconds Optional Czas trwania treści w sekundach.

Wymagane tylko w przypadku odpowiedzi VMAP, które zawierają reklamy w trakcie filmu z zastosowaniem procentowe przesunięcia czasu. Jest to rzadkie zjawisko.

manifest_type Optional Format żądanych strumieni reklam: hls lub dash Wartością domyślną jest hls.
dai_options Optional Opcje dodatkowe kontrolujące aspekty renderowania plików manifestu. Poniżej dowiesz się więcej na ten temat.
Profil kodujący
profile_name Required Identyfikator tego profilu kodowania. Może to być dowolny ciąg znaków, wybrać, ale nie można mieć wielu profili kodujących o tej samej nazwie ten sam strumień.
type Required Typ kodowania strumienia opisany przez ten profil kodujący. Content (sieć partnerska), typy: media, iframe oraz subtitles.
container_type Required Format kontenera używany przez ten profil kodujący. Formaty kontenerów: mpeg2ts, fmp4cmaf, hls_packed_audio
video_settings Optional Wymagane, jeśli typ profilu kodowania to iframe. W przeciwnym razie dozwolone tylko wtedy, gdy typ multimediów zawiera wideo. Zobacz .
audio_settings Optional Wymagany, jeśli profil kodujący zawiera dźwięk. Dozwolone tylko wtedy, gdy typ to multimediów. Poniżej dowiesz się więcej na ten temat.
subtitle_settings Optional Wymagany, jeśli profil kodowania zawiera napisy. Poniżej dowiesz się więcej na ten temat.
Ustawienia wideo
codec Required Ciąg kodeka RFC6381.

Przykład: avc1.4d000c.

bitrate Required Liczba całkowita określająca maksymalną szybkość transmisji wideo tego profilu (w bajtach na) sekunda.
frames_per_second Required Zmiennoprzecinkowa liczba klatek na sekundę filmu.
resolution Required Zakodowana w formacie JSON wartość zawierająca parametry „width” i „height” w pikselach filmu.

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) sekunda.

Przykład: 300000.

channels Required Liczba całkowita określająca liczbę kanałów audio, w tym niską częstotliwość kanałów.
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 lub ttml.
language Optional Język napisów jako ciąg znaków języka RFC5646. Jeśli ta wartość jest podana jest używany 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 dla: Tylko pliki 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 poświęcany na wybieranie reklam i tworzenie bloków reklamowych w formacie pływającym sekund. Po upływie tego czasu Ad Manager zwraca dowolną wartość reklamy zostały już wybrane w odpowiedzi ad_pods i przestaną o przetwarzaniu danych.
sam_id Optional Określa alternatywny klucz debugowania, którego można używać do wyszukiwania sesji w aktywność w strumieniu monitorowania.

Odpowiedź

Parametry odpowiedzi
valid_for Czas, przez jaki te playlisty bloku reklamowego są prawidłowe (dhms) (dni, godziny, minuty, sekundy).
valid_until Data i godzina, do których playlisty bloków reklamowych są zgodne ze standardem ISO8601 ciąg tekstowy daty i godziny w 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 Dotyczy tylko strumieni HLS. Mapa identyfikatorów profili kodowania na identyfikatory URI pliku manifestu HLS.
mpd_uri Dotyczy tylko strumieni DASH. Identyfikator URI pliku MPD DASH.
type Typ bloku reklamowego. Typy bloków reklamowych: pre, mid lub post
start Tylko dla bloków reklamowych w trakcie filmu. Pozycja w strumieniu, w której ten blok reklamowy powinien zostać wstawiony w postaci liczby zmiennoprzecinkowej w sekundach.
duration Czas trwania tego bloku reklamowego w sekundach zmiennoprzecinkowych.
midroll_index Tylko dla 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ładowa treść żądania

To jest zawartość pliku request-body.json, do którego odwołuje się wywołanie 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
    }
  ]
}

Połącz bloki reklamowe z treścią

Proces łączenia bloków reklamowych ze strumieniami treści różni się w zależności od tego, wdrożenia, formatu strumienia i wybranych funkcji zgodnie ze specyfikacją formatu. Te przepływy pracy są sugestii na temat tego, jak obsłużyć ten proces. Dokładne informacje o implementacja może się różnić w zależności od potrzeb biznesowych i zawartości witryny. strumienie.

Strumienie HLS

Jeśli łączysz strumień w formacie HLS, strumień treści jest wielowariant playlista linków do osobnych plików manifestu strumienia, po jednym na każdy profil kodujący. Twoja reklama pody należy wstawić do każdego z tych plików manifestu wariantów. W jedną stronę trzeba przygotować wszystkie pliki manifestu wariantów i przekazać je do narzędzia Content Sieć dostarczania (CDN) – . Ostatnia playlista z wieloma wariantami to zestaw linków do tych hostowanych w sieci CDN, plików manifestu.

Wykonanie iteracji na profilach kodujących

W przypadku każdego profilu kodującego zbieraj wszystkie powiązane pliki manifestu powiązane z blokami reklamowymi z: Odpowiedź Ad Managera z powiązanymi z nimi czasami rozpoczęcia. Do reklamy przed filmem podów, ustaw czas rozpoczęcia na 0. W przypadku reklam po filmie użyj czasu trwania treści: czasu rozpoczęcia bloku reklamowego. Określ strumień wariantów w wielu wariantach która pasuje do ustawień dźwięku i obrazu w każdym profilu kodowania.

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 każdego pliku manifestu wariantu

W przypadku każdego strumienia wariantów przejrzyj segmenty pliku manifestu treści, zachowując przy tym w całości czasu, który upłynął. Po przejściu do pozycji początkowej bloku reklamowego, wyodrębnij listę segmentów z pliku manifestu bloku reklamowego, dodaj tagi listę segmentów w dwóch tagach #EXT-X-DISCONTINUITY i wstaw listę w polu w pliku manifestu treści. Kontynuuj ten proces, aż wszystkie reklamy pody i strumienie wariantów zostały przetworzone.

Otrzymane pliki manifestu muszą być zgodne ze standardem HLS. W związku z tym, w zależności które cechy specyfikacji zawiera Twój plik manifestu, może wymagać ostatecznego przejścia na połączony plik manifestu, aby naprawić multimedia numery sekwencyjne, czas trwania treści, numery sekwencyjne nieciągłości i inne inne tagi, które trzeba zaktualizować, by uwzględnić nowe segmenty reklam. Po naprawieniu wszelkich rozbieżności ze standardami prześlij wszystkie plik manifestu wariantu dla konkretnego użytkownika do Twojej sieci CDN na potrzeby hostingu.

Jeśli plik manifestu treści jest zaszyfrowany, musisz zachować ostatnie szyfrowanie znaleziono klucz przed rozpoczęciem bieżącego bloku reklamowego w tagu #EXT-X-KEY. Następnie: musisz dodać tag #EXT-X-KEY:METHOD=NONE, aby usunąć szyfrowanie przed pierwszego segmentu każdego bloku reklamowego. Na koniec dodaj kopię przechowywanej #EXT-X-KEY przed pierwszym segmentem treści po każdym bloku reklamowym, aby i przywróć szyfrowanie treści.

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 zebrane dane wariantów.

#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ść Plik manifestu https://dai.google.com/{...}/pod/1/profile/1080p.m3u8 są uwzględniane w zbieranych danych wersji.

#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

Będzie to powstały zszyty plik manifestu wariantu przekazywany do CDN i hostowana w domenie 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 gotowego pliku manifestu wariantu, a także dopasowujących szczegóły profilu kodowania i grupować wyniki w nowy plik manifestu z wieloma wariantami. Ten plik manifestu użytkownika jest zwracany jako odpowiedź do żądania pliku manifestu otrzymanego w kroku 1.

Przykładowa końcowa playlista 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 wygenerować w jednym pliku. Dzięki temu możesz łatwiej łączyć strumienie DASH niż HLS.

Prawidłowo przygotowany plik MPEG DASH prezentacja opisu (MPD) powinien składają się z kilku okresów, z których każdy zawiera wiele reprezentacji. Każdy reprezentacja powinna być zgodna z jednym z profili kodujących. Każdy blok reklamowy zwrócił z Ad Managera to również plik MPD zawierający sekwencję kropek z reprezentacji dopasowywania.

Aby połączyć te pliki MPD, najpierw zwróć uwagę na czas rozpoczęcia dla w każdym bloku reklamowym. W przypadku reklam przed filmem wstaw przedziały reklamowe przed filmem, zanim pojawią się jakiekolwiek treści okresu przejściowego. W przypadku reklam po filmie wstaw przedziały reklamowe po filmie po całej treści okresu. Powtarzaj okresy w MPD treści, śledząc czas odtwarzania dla wszystkich okresów przetworzonych treści. Gdy dotrzesz do granicy między okresami odpowiadającymi czasowi rozpoczęcia bloku reklamowego, wstaw kropki z odpowiedniego pliku MPD bloku reklamowego w trakcie filmu na tej granicy.

Końcowy zszyty plik MPD musi być w pełni zgodny ze specyfikacją MPEG_DASH. W takim przypadku konieczne może być powtórzenie wszystkich zmian w pliku i poprawienie czas trwania prezentacji multimedialnej. nowo wstawionych okresów wyświetlania reklam i rozwiązywać inne konflikty, powstałych w wyniku procesu łączenia.

Przykładowy opis treści (MPD)

<?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 element prezentacji multimedialnej (MPD) bloku reklamowego

To jest zawartość pola mpd_uri z powyższego kodu 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 zszytego MPD

Podaj ją jako odpowiedź na wstępne żą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 materiały