Manipulator pliku manifestu w przypadku transmisji na żywo

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 odpowiednio HLS lub DASH.
  • 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ść logiczna unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis 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:
mpd Strumienie MPEG-DASH
m3u8 W przypadku strumieni HLS
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 milisekundach
  • last: 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 so, zakłada się, że poprzednie segmenty zostały wszystkie mają taki sam czas trwania, a przesunięcie segmentu jest obliczane na podstawie segment_number i sd.

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}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id={a-stream-id}&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;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&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;auth_token=$$token$$" media="$RepresentationID$/$Number$.mp4?stream_id=ç√&amp;sd=5000&pd=$$pod-duration$$&amp;cust_params=$$cust_params$$&amp;scte35=$$scte35$$&amp;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&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;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&amp;sd=5000&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;scte35=$$scte35$$" initialization="$RepresentationID$/init.mp4?stream_id=cc59197a-44c0-4be2-a8cc-9a6fdb80158f:DLS&amp;pd=30000&amp;cust_params=&amp;auth-token=&amp;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