Manipulator pliku manifestu w przypadku strumieni VOD

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

Ten przewodnik dotyczy wdrożenia podstawowego serwera do manipulacji plikiem manifestu wyświetlania podów w przypadku strumieni VOD.

Odbieranie żądań manifestu strumienia

Manipulator pliku manifestu musi zawierać punkt końcowy interfejsu API nasłuchujący żądań pliku manifestu z aplikacji klienckiej odtwarzacza wideo. Ten punkt końcowy musi co najmniej zbierać identyfikator strumienia z aplikacji odtwarzacza klienckiego. Ten identyfikator strumienia służy 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 danych z Ad Managera 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 W przypadku strumieni HLS

Pobieranie strumienia treści

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

Żądaj plików manifestu bloków reklamowych

Aby móc wysyłać żądania reklam do Ad Managera, Twój serwer musi wysłać żądanie POST do punktu końcowego bloku reklamowego, przekazując żądane profile kodowania, tag reklamy i parametry kierowania. To żądanie zawiera też identyfikator strumienia zebrany w kroku 1.

W zamian otrzymujesz listę obiektów bloków reklamowych, które zawierają pliki manifestu bloków reklamowych żądanych przez tag reklamy wydawcy, oraz informacje o tym, kiedy i gdzie powinny zostać wstawione 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 kodowania, które chcesz otrzymywać w przypadku każdej przerwy na reklamę. Poniżej dowiesz się więcej na ten temat.

Aby odtwarzanie przebiegło jak najpłynniej, powinny być one zgodne z zestawem profili kodowania używanych w strumieniu treści.

ad_tag Required Tag reklamy wysyłający żądanie reklam VMAP.
cuepoints Optional Lista punktów wstawienia reklamy w strumieniu treści, w których zostaną wstawione 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 położenia. Zdarza się to rzadko.

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 czasowego. Zdarza się to rzadko.

manifest_type Optional Format żądań strumieni reklam: hls lub dash. Wartością domyślną jest hls.
dai_options Optional Dodatkowe opcje sterujące sposobem 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 oraz 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 kodowania to iframe. W przeciwnym razie jest dozwolone tylko wtedy, gdy typ multimediów zawiera wideo. Poniżej dowiesz się więcej na ten temat
audio_settings Optional Wymagany, jeśli profil kodowania zawiera dźwięk. Dozwolona tylko wtedy, gdy typ to „Media”. 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 filmu
codec Required Ciąg znaków kodeka RFC6381.

Przykład: avc1.4d000c

bitrate Required Liczba całkowita określająca maksymalną szybkość transmisji bitów wideo w tym profilu (w bajtach na sekundę).
frames_per_second Required Liczba zmiennoprzecinkowych klatek na sekundę dla filmu.
resolution Required Zakodowana w formacie JSON wartość zawierająca atrybuty „width” i „height” wideo w pikselach.

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

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

Przykład: mp4a.40.5

bitrate Required Liczba całkowita określająca maksymalną szybkość transmisji dźwięku w tym 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 języka RFC5646. Jeśli zostanie podana, będzie używana tylko do renderowania DASH.

Przykład: en-us

Opcje DAI
dash_profile Optional Profil MPEG-DASH, który ma być stosowany 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 trwania wybierania reklam i tworzenia bloków reklamowych (w sekundach zmiennoprzecinkowych). Po upływie tego czasu Ad Manager zwraca wszystkie reklamy wybrane już w odpowiedzi ad_pods i przestaje przetwarzać.
sam_id Optional Określa alternatywny klucz debugowania, którego można używać do wyszukiwania sesji w monitorze aktywności strumienia.

Odpowiedź

Parametry odpowiedzi
valid_for Czas trwania tych playlist w blokach reklamowych w formacie dhms (dni, godziny, minuty, sekundy).
valid_until Data i godzina, do których playlisty w blokach 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 do tego strumienia.
Blok reklamowy
manifest_uris Tylko w przypadku strumieni HLS. Mapa identyfikatorów profili kodowania na identyfikatory URI pliku manifestu HLS.
mpd_uri Dotyczy tylko transmisji DASH. Identyfikator URI elementu MPD DASH.
type Typ bloku reklamowego. Typy bloków reklamowych: pre, mid i post.
start Tylko w przypadku bloków reklamowych w trakcie filmu. Pozycja w strumieniu, w której ma zostać wstawiony ten blok reklamowy, podana w sekundach zmiennoprzecinkowych.
duration Czas trwania tego bloku reklamowego w sekundach zmiennoprzecinkowych.
midroll_index Tylko w przypadku 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ść elementu request-body.json, do której odwołuje się 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 implementacji, formatu strumienia i funkcji wybranych przez Ciebie ze specyfikacji formatu. Poniższe przepływy pracy zawierają sugestie, jak radzić sobie z tym procesem. Dokładne szczegóły implementacji mogą się różnić w zależności od Twoich potrzeb biznesowych i strumieni treści.

Strumienie HLS

Jeśli łączysz strumień w formacie HLS, stanie się on wielowymiarową playlistą z linkami prowadzącymi do osobnych plików manifestu strumienia – po jednym dla każdego profilu kodowania. Bloki reklamowe musisz wstawić do każdego z tych plików manifestu wariantów. Jednym ze sposobów jest przygotowanie wszystkich plików manifestu wariantów i przekazanie ich do sieci dostarczania treści (CDN) na potrzeby hostingu. Końcowa playlista z wieloma wariantami to zbiór linków do tych plików manifestu hostowanych przez CDN.

Powtórzenie profili kodowania

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 jako czasu rozpoczęcia bloku reklamowego użyj czasu trwania treści. Na playliście z wieloma wariantami znajdź strumień wariantów, który 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 z treściami 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 wariantów
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 wariantów

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

Powstałe pliki manifestu muszą być zgodne ze standardem HLS. Dlatego, w zależności od funkcji specyfikacji zawartych w pliku manifestu treści, konieczne może być ponowne przekazanie całego pliku manifestu, by poprawić numery sekwencji multimediów, czas trwania treści, numery sekwencji ciągłości i wszystkie inne tagi, które należy zaktualizować w celu uwzględnienia nowych segmentów reklam. Po naprawieniu rozbieżności ze standardem prześlij do swojej sieci CDN plik manifestu każdego wariantu zależnie od użytkownika na potrzeby hostingu.

Jeśli 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 też dodać kopię zapisanego tagu #EXT-X-KEY przed pierwszym segmentem treści po każdym bloku reklamowym.

Przykładowe zebrane dane wariantów
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 treść pliku manifestu https://{...}/1080p.m3u8 wymienionego w zebranych danych wariantu.

#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 dotyczących wariantów.

#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

Jest to wynikowy złączony plik manifestu wariantu przekazywany do CDN i hostowany pod adresem 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 pasującymi szczegółami profilu kodowania i połącz wyniki w nowy plik manifestu z wieloma wariantami. Ten plik manifestu konkretnego użytkownika jest zwracany jako odpowiedź na żądanie pliku manifestu otrzymane w kroku 1.

Przykładowa playlista ostatecznej wersji 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 zszywasz strumień w formacie MPEG DASH, wystarczy, że utworzysz 1 plik. Może to ułatwić łączenie strumieni DASH niż HLS.

Odpowiednio przygotowany plik MPEG DASH Media Presentation description (MPD) powinien składać się z kilku kropek, z których każda może być reprezentowana przez różne osoby. 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ę okresów z pasującymi reprezentacjami.

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

Końcowy złączony plik MPD musi być w pełni zgodny ze specyfikacją MPEG_DASH, więc konieczne może być ponowne powtórzenie końcowego pliku, poprawienie czasu rozpoczęcia wyświetlania, poprawienie czasu trwania prezentacji multimedialnej z uwzględnieniem nowo wstawionych okresów reklamowych i wyeliminowanie innych konfliktów, które mogły wyniknąć z procesu łączenia.

Przykładowa treść 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 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 złączonego opisu prezentacji multimedialnej (MPD)

Podaj tę wartość jako odpowiedź 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 materiały