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:
|
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: |
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: |
Ustawienia dźwięku | ||
codec |
Required |
Ciąg znaków kodeka RFC6381.
Przykład: |
bitrate |
Required |
Liczba całkowita określająca maksymalną szybkość transmisji dźwięku w tym profilu (w bajtach na sekundę).
Przykład: |
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: |
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: |
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ść
Wartość |
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
- Blok reklamowy wyświetlający odtwarzanie za pomocą pakietu IMA SDK:
- Blok reklamowy udostępniający odtwarzanie za pomocą interfejsu DAI API