Interfejs Pod Serving API zapewnia dostęp do zakodowanych i uwarunkowanych segmentów reklam, przygotowane w taki sposób, że można je połączyć bezpośrednio z plikiem HLS przeznaczonym dla użytkowników lub playlistę MPEG-DASH. W przypadku MPEG-DASH interfejs Pod Serving API udostępnia też szablon pliku manifestu, który zawiera dodatkowe informacje i kontekst dotyczący tej reklamy segmentów niestandardowych.
Ten przewodnik koncentruje się na implementacji podstawowej manipulacji plikiem manifestu udostępniania podów do transmisji na żywo.
Warunek wstępny: skonfiguruj wydarzenia na żywo w usłudze Google Ad Manager
Przed wysłaniem żądań z interfejsu API bloków reklamowych do wyświetlania reklam musisz utworzyć
Zdarzenie na żywo w ramach menedżera każdej transmisji, którą przetwarzasz. Możesz utworzyć
transmisji na żywo za pomocą
LiveStreamEventService API
lub
Interfejs internetowy Google Ad Managera.
Aby używać zdarzenia transmisji na żywo za pomocą interfejsu API podów, musisz wykonać te czynności: wypełnij kilka atrybutów Twojego wydarzenia:
customAssetKey
– identyfikator niestandardowy używany w przypadku tego zdarzenia. Musi być unikalne dla wszystkich zdarzeń w sieci.adTags
– podstawowy adres URL tagu reklamy wygenerowany przez trafikowanie w usłudze Ad Manager procesu tworzenia kampanii.dynamicAdInsertionType
– musi mieć wartośćPOD_SERVING_REDIRECT
.streamingFormat
– ustaw odpowiednioHLS
lubDASH
.segmentUrlAuthenticationKeyIds
– co najmniej 1 Klucz HMAC używane do podpisywania żądań segmentów reklam.daiEncodingProfileIds
– lista wartości DAIEncodingProfile Identyfikatory włączone dla tego zdarzenia.startDateTime
– data i godzina rozpoczęcia wydarzenia.endDateTime
– zaplanowana data i godzina zakończenia wydarzenia. Ten atrybut jest wymagany, jeśli wartość logicznaunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime`. Patrz wyżej.
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 pobierać identyfikator strumienia z aplikacji klienckiej i musi zwracać połączone źródło pliku manifestu strumienia. Identyfikator strumienia służy do identyfikowania sesji przesyłania strumieniowego z reklamą. Menedżer.
Musisz też zebrać dodatkowe informacje, aby zidentyfikować odpowiednie strumienia treści, np. identyfikator treści.
Przykład potencjalnego punktu końcowego żądania pliku manifestu
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Parametry ścieżki | |||||
---|---|---|---|---|---|
asset_key |
Hipotetyczny identyfikator odpowiadający żądanej transmisji na żywo w Twoim systemie. | ||||
format |
Hipotetyczny parametr odpowiadający formatowi strumienia. Jedna z tych możliwości:
|
Parametry zapytania | |
---|---|
stream_id |
Identyfikator strumienia Ad Managera z aplikacji odtwarzacza wideo klienta. |
Pobieranie strumienia treści
Użyj identyfikatora treści zebranego w żądaniu pliku manifestu, aby wybrać treści i łączyć go z reklamami.
Łączenie segmentów reklam ze strumieniem treści
Łączenie adresów URL segmentów reklam będzie się różnić w zależności od formatu strumienia.
Strumienie HLS
Strumienie HLS są zwykle wyświetlane w pliku manifestu z wieloma wariantami, który zawiera plik manifestu zestaw linków do plików manifestu wariantów, które odpowiadają każdemu kodowaniu profili.
Uwaga: dla uproszczenia w tym przewodniku przyjęto, że multimedia HLS są zakodowane który łączy dźwięk i obraz w jeden plik segmentu.
Playlisty z wieloma wariantami serwera proxy
Musisz zastąpić adres URL każdej playlisty wariantu w pierwotnym wielowariancie. z innym wywołaniem punktu końcowego do manipulatora, wybranego pliku manifestu wariantu.
W pozostałych krokach łączenia HLS zakłada się, że pojedynczy plik manifestu wariantu jest przetwarzany.
Przykład potencjalnego punktu końcowego żądania wariantu
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Parametry ścieżki | |
---|---|
asset_key |
Hipotetyczny identyfikator odpowiadający żądanej transmisji na żywo w Twoim systemie. |
variant |
Hipotetyczny parametr zawierający identyfikator konkretnego wariantu w trakcie przetwarzania danych. |
Parametry zapytania | |
---|---|
stream_id |
Identyfikator strumienia Ad Managera z aplikacji odtwarzacza wideo klienta. co tutaj wskazać sesję użytkownika za pomocą manipulatora pliku manifestu. |
Przykładowy nieprzetworzony plik manifestu z wieloma wariantami
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/1080p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://cdn.{...}/720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://cdn.{...}/360p.m3u8
Przykładowy plik manifestu wielowariantów przesyłany przez serwer proxy
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/1080p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.4d000c,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/720p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.4d000d,mp4a.40.5"
https://{manifest_manipulator}/api/video/tears_of_steel/variant/360p.m3u8?stream_id=6e69425c-0ac5-43ef-b070-c5143ba68541:CHS
Określ segmenty przerw na reklamę i wstaw nieciągłości
Przetwarzając plik manifestu wariantu, śledź godzinę rozpoczęcia, czas trwania i indeks następnej przerwy na reklamę, do momentu przetworzenia dynamicznego pliku manifestu zawiera segmenty, które zostaną zastąpione treścią reklamy.
Przerwy na reklamy mogą być oddzielone od segmentów treści na różne sposoby, w zależności
w koderze. Częstym sposobem na określenie przerwy na reklamę jest napisanie jej na początku
użyj tagu #EXT-X-CUE-OUT
i następuj po nim, używając tagu #EXT-X-CUE-IN
.
Aby oddzielić przerwy na reklamy hostowane przez Google od segmentów treści, musisz wstawić
Tagi #EXT-X-DISCONTINUITY
na początku i na końcu każdej przerwy na reklamę. Jeśli
W ostatecznej wersji pliku manifestu nie ma tagów nieciągłości, odtwarzanie się nie uda.
Wstawione identyfikatory URI segmentów reklam nie są zaszyfrowane. Jeśli treści są szyfrowane,
musisz też usunąć szyfrowanie, określając #EXT-X-KEY:METHOD=NONE
przed pierwszym segmentem każdej przerwy na reklamę, a potem dodaj go z powrotem po tagu
na reklamę.
Przykładowy plik manifestu (pierwotny)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-CUE-OUT:15.000
#EXTINF:5.005,
contentorigin.com/3.ts
#EXTINF:5.005,
contentorigin.com/4.ts
#EXTINF:5.005,
contentorigin.com/5.ts
#EXTINF:5.000,d
contentorigin.com/6.ts
#EXT-X-CUE-IN
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Wstawiono plik manifestu z nieciągłościami
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXTINF:5.005,
#EXT-X-DISCONTINUITY
{... New segments will go here ...}
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Przetwarzanie segmentów bloków reklamowych
W przypadku każdego segmentu w bloku reklamowym musisz śledzić kilka dodatkowych wartości:
segment_number
: indeks segmentów w bloku reklamowym, zaczynając od zera. Lub „init” dla segmentu inicjowania pliku mp4.segment_duration
: czas trwania bieżącego segmentu w milisekundach. Ten powinna być taka sama we wszystkich segmentach z wyjątkiem ostatniego.segment_offset
: przesunięcie segmentu obliczone przez dodanie poprzedniej wartości czas trwania segmentu do przesunięcia segmentu w milisekundachlast
: wartość logiczna określająca ostatni segment w bloku reklamowym. Domyślne na fałsz.
Tworzenie adresów URL segmentów reklam
Zastąp każdy segment w przerwie na reklamę adresem URL w formacie:
/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/pod/{pod_id}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
Parametry ścieżki | |
---|---|
network_code
|
Kod sieci Ad Managera 360 dla tej sieci. |
custom_asset_key
|
Niestandardowy klucz zasobu transmisji na żywo określony w usłudze LiveStreamEventService API lub na stronie transmisji na żywo w interfejsie internetowym Ad Managera 360. |
pod_id
|
Identyfikator przerwy na reklamę. Musi być liczbą całkowitą, zaczynając od
1 i zwiększa się o 1 na każdą przerwę na reklamę.
Ta wartość musi być taka sama u wszystkich użytkowników, którzy wyświetlają tę samą przerwę na reklamę w: bieżące wydarzenie. |
profile_name
|
identyfikator żądanego profilu; |
segment_number
|
Indeks tego segmentu w bieżącym bloku reklamowym, zaczynając od 0. Jeśli korzystasz z kontenera MP4, możesz zażądać segmentu inicjowania, ustawiając parametr segment_number na „init”. |
Parametry zapytania | ||
---|---|---|
stream_id
|
Wymagane | Parametr stream_id użytkownika zwrócony z narzędzia Stream Create
użytkownika.
|
sd
|
Wymagane | segment_duration
|
so
|
Opcjonalnie | segment_offset
Jeśli brakuje parametru |
pd
|
Wymagane z wyjątkiem zdarzeń z włączonymi bezterminowymi przerwami na reklamę | Czas trwania przerwy na reklamę (w milisekundach). Inna nazwa:
ad_pod_duration
|
auth-token
|
Wymagane | Podpisany, zakodowany w adresie URL Token HMAC dla tego bloku reklamowego. |
last
|
Opcjonalnie | Wartość logiczna wskazująca ostatni segment w przerwie na reklamę. Wartość domyślna to fałsz. |
Wartości parametrów zapytania muszą być odpowiednio zakodowane, aby można było ich używać w adresach URL. To jest
szczególnie ważne w przypadku pola auth-token
, bo może ono zawierać /
,
+
i =
znaków.
Przykładowy plik manifestu (po zastąpieniu segmentu)
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5.005,
contentorigin.com/1.ts
#EXTINF:5.005,
contentorigin.com/2.ts
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:5.005,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2
#EXTINF:3.000,
https://dai.google.com/linear/pods/v1/seg/network/6062/custom_asset/iYdOkYZdQ1KFULXSN0Gi7g/pod/1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D44bf78223c240cbc5bae3cdfd794bfc6971b6583cd296f44ef3a46944605cf9a&stream_id=fe6c9136-09a4-4ff6-862e-daee1dea0e1b:MRN2&last=true
#EXT-X-DISCONTINUITY
#EXTINF:5.005,
contentorigin.com/7.mp4
#EXTINF:5.005,
contentorigin.com/8.mp4
Gratulacje! Wyświetlasz transmisję na żywo z segmentami reklam dostarczonymi przez: za pomocą DAI Pod Serving API.
Strumienie DASH
Strumienie DASH są dostarczane w postaci pliku MPD, który zawiera wszystkie kodowanie strumieni w w pojedynczym pliku, w którym treść jest przedstawiona jako seria kropek.
Szablon okresu prośby
Poproś Google Ad Managera o szablon dotyczący okresu. Szablon zostanie utworzony okresu przerwy na reklamę po uzupełnieniu zawartych w nim makr.
Wysyłaj ten szablon tylko raz na sesję strumienia i buforuj go przez z każdą przerwą na reklamę.
Punkt końcowy żądania szablonu okresu hjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Parametry ścieżki | |
---|---|
network_code |
Kod sieci wydawcy w usłudze Ad Manager 360. |
custom_asset |
Niestandardowy klucz pliku zdarzenia transmisji na żywo w usłudze Google Ad Manager. |
Parametry zapytania | |
---|---|
stream_id |
Identyfikator strumienia Ad Managera z odtwarzacza wideo klienta. |
Plik JSON odpowiedzi | |
---|---|
dash_period_template |
Ciąg znaków XML szablonu okresu. |
segment_duration_ms |
Czas trwania każdego segmentu multimediów reklamy w szablonie okresu przerwy, w polu milisekund. |
Przykładowe żądanie (cURL)
curl https://dai.google.com/linear/pods/v1/dash/network/21775744923/custom_asset/tears_of_steel/pods.json?stream-id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS
Przykładowa odpowiedź
{"dash_period_template":"<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$> <BaseURL>https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>",
"segment_duration_ms":5000}
Wypełnij szablon okresu
Szablon kropki zawiera kilka makr, które musisz zastąpić w każdej reklamie przerwania. Trzeba zastąpić wszystkie makra. Nieużywane makra należy zastąpić tagiem pusty ciąg znaków („”).
Makro | Opis | Przykład |
---|---|---|
$$pod-id$$ |
Indeks bloku reklamowego w tym okresie. Ta wartość musi pasować do: ten sam blok reklamowy we wszystkich sesjach widza. | 1 |
$$period-start$$ |
Godzina rozpoczęcia okresu w bieżącym MPD. Atrybut opcjonalny
które powinno zostać zastąpione przez start="###" , gdzie
### to czas prezentacji, w którym rozpoczyna się przerwa na reklamę. Jeśli
czas rozpoczęcia okresu nie jest podany, należy zastąpić to makro
pustym ciągiem znaków.
|
start="PT2H33M30S" |
$$period-duration$$ |
Czas trwania całego okresu reklamowego. Atrybut opcjonalny, który powinien
zostanie zastąpione przez duration="###" , gdzie ### to wartość
w standardowym formacie czasu trwania DASH. Jeśli
okresu trwania okresu nie jest podana, należy zastąpić to makro
pusty ciąg znaków.
|
duration="PT15S" |
$$pod-duration$$ |
Przewidywany czas trwania reklam, które mają być podejmowane w przypadku tego bloku reklamowego (w ujęciu czasowym) milisekund. | 15000 |
$$number-of-repeated-segments$$ |
Wartość tę oblicza się, dzieląc czas trwania okresu reklamowego (w milisekund) przez wartość segment_duration_ms i zaokrąglone w górę do najbliższą liczbą całkowitą. | 3 |
$$cust_params$$ |
To makro można zastąpić parametrami kierowania niestandardowego unikalnymi dla bieżącej przerwy na reklamę, jeśli. dostępna. Wartość musi być sformatowana jako opisane w tym artykule Artykuł w Centrum pomocy. Jeśli nie są potrzebne żadne parametry niestandardowe, makro należy zastąpić pustym ciągu znaków. |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
To makro należy zastąpić wartością scte35 unikalną dla tej przerwy na reklamę, jeśli taki istnieje. Jeśli nie są potrzebne informacje scte35, makro powinno zostanie zastąpiony pustym ciągiem. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
Podpisany, zakodowany w adresie URL Token HMAC. Ten token jest wymagany. |
custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
|
Szablon nieprzetworzonego okresu zawierający makra
<Period id="adpod-$$pod-id$$" $$period-start$$ $$period-duration$$>
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/{event_code}/pods/$$pod-id$$/profile/
</BaseURL>
<SegmentTemplate initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&sd=5000&pd=$$pod-duration$$&cust_params=$$cust_params$$&scte35=$$scte35$$&auth_token=$$token$$" startNumber="1" presentationTimeOffset="0">
<SegmentTimeline>
<S t="0" d="5" r="$$number-of-repeated-segments$$"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet id="0" width="1280" height="720" frameRate="30" contentType="video" subsegmentAlignment="true" startWithSAP="1">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="a943ff679a2f3e71d9181a21b7542122g" bandwidth="3200000"/>
<Representation mimeType="video/mp4" codecs="avc1.640029" id="abbbd80q4w5ce2fs28308rd1f4g4bat0" bandwidth="1500000"/>
</AdaptationSet>
<AdaptationSet id="1" contentType="audio"> <Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="a87ff679a2f3e71d9181a67b7542122c" bandwidth="95000"/>
<Representation audioSamplingRate="48000" mimeType="audio/mp4" codecs="mp4a.40.2" id="eccbc87e4b5ce2fe28308fd9f2a7baf3" bandwidth="127000"/>
</AdaptationSet>
</Period>
Wypełniony okres reklamy
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
Wstaw zapełnioną kropkę do pliku manifestu DASH
Na koniec zastąp odpowiedni przedział czasu w nieprzetworzonym pliku manifestu nowym wypełnionego okresu reklamy i wysyłanie ostatecznego połączonego pliku manifestu do żądania klienta wideo.
Przykładowy plik manifestu z nieprzetworzoną treścią
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period start="PT0S">
<AdaptationSet bitstreamSwitching="true">
<Representation id="0" codecs="avc1" mimeType="video/mp4" width="1920" height="1080" startWithSAP="1" bandwidth="500000">
<SegmentBase>
<Initialization sourceURL="segments/1080/1.m4s" range="0-862"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/1080p/2.m4s" mediaRange="863-7113"/>
<SegmentURL media="segments/1080p/3.m4s" mediaRange="7114-14104"/>
<SegmentURL media="segments/1080p/4.m4s" mediaRange="14105-17990"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="1280" height="720" startWithSAP="1" bandwidth="250000">
<SegmentBase>
<Initialization sourceURL="segments/720p/1.m4s" range="0-864"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segments/720p/2.m4s" mediaRange="865-11523"/>
<SegmentURL media="segments/720p/3.m4s" mediaRange="11524-25621"/>
<SegmentURL media="segments/720p/4.m4s" mediaRange="25622-33693"/>
...
</SegmentList>
</Representation>
<Representation id="1" codecs="avc1" mimeType="video/mp4" width="640" height="480" startWithSAP="1" bandwidth="100000">
<SegmentBase>
<Initialization sourceURL="segment/480p/1.m4s" range="0-865"/>
</SegmentBase>
<SegmentList duration="15">
<SegmentURL media="segment/480p/2.m4s" mediaRange="866-26970"/>
<SegmentURL media="segment/480p/3.m4s" mediaRange="26971-72543"/>
<SegmentURL media="segment/480p/4.m4s" mediaRange="72544-95972"/>
...
</SegmentList>
</Representation>
...
</AdaptationSet>
</Period end>
</MPD>
Przykładowy połączony plik manifestu
<?xml version="1.0"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" mediaPresentationDuration="PT0H9M56.46S">
<BaseURL>
http://example.com/tears_of_steel/
</BaseURL>
<Period id="pod-0" start="PT5H50M12S">
<BaseURL>
https://dai.google.com/linear/pods/v1/seg/event/M-nTcApTRTi6CEGIt4GYMw/pod/0/profile/
</BaseURL>
<SegmentTemplate startNumber="0" media="1080p/0.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&sd=5000&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&pd=30000&cust_params=&auth-token=&scte35=$$scte35$$">
<SegmentTimeline>
<S d="5" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
<AdaptationSet mimeType="video/mp4" scanType="progressive" contentType="video">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation width="768" height="432" frameRate="30" codecs="avc1.42c01e" id="fmp4-video-1200k" bandwidth="1300000">
<InbandEventStream schemeIdUri="https://developer.apple.com/streaming/emsg-id3"/>
</Representation>
</AdaptationSet>
<AdaptationSet mimeType="audio/mp4" scanType="progressive" contentType="audio">
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation audioSamplingRate="48000" codecs="mp4a.40.2" id="fmp4-audio-128kbps" bandwidth="128000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
</Representation>
</AdaptationSet>
</Period>
</MPD>
Gratulacje! Wyświetlasz transmisję na żywo DASH z dostarczonymi segmentami reklam za pomocą DAI Pod Serving API.
Dodatkowe materiały
- Blok reklamowy wyświetlający odtwarzanie z pakietem IMA SDK:
- Blok reklamowy obsługujący odtwarzanie z DAI Interfejs API