Canlı yayınlar için manifest düzenleyici

Kapsül Yayınlama API'si, doğrudan kullanıcıya yönelik HLS veya MPEG-DASH medya oynatma listesine eklenebilecek şekilde hazırlanmış, kodlanmış ve koşullandırılmış reklam segmentlerine erişim sağlar. MPEG-DASH için Kapsül Yayınlama API'si bu reklam segmentleri için ek bilgi ve bağlam sağlamak amacıyla bir manifest şablonu da sağlar.

Bu rehber, canlı yayınlar için temel bir Kapsül Yayınlama manifest düzenleme sunucusunun uygulanmasına odaklanmıştır.

Ön koşul: Google Ad Manager'da canlı yayın etkinliklerini yapılandırma

Kapsül yayınlama API'sinden istekte bulunmadan önce, işlediğiniz her akış için bir Ad Manager canlı yayın etkinliği oluşturmanız gerekir. LiveStreamEventService API veya Google Ad Manager web arayüzünü kullanarak canlı yayın etkinliği oluşturabilirsiniz.

Bir canlı yayın etkinliğinin kapsül sunma API'siyle kullanılabilmesi için etkinliğinizin birkaç özelliğini doldurmanız gerekir:

  • customAssetKey: Bu Etkinlik için kullanılacak özel tanımlayıcı. Ağa ilişkin tüm Etkinliklerde benzersiz olmalıdır.
  • adTags - Ad Manager trafik işlemleri iş akışı tarafından oluşturulan birincil reklam etiketi URL'si.
  • dynamicAdInsertionType - POD_SERVING_REDIRECT olarak ayarlanmalıdır.
  • streamingFormat: Uygun şekilde HLS veya DASH olarak ayarlayın.
  • segmentUrlAuthenticationKeyIds - reklam segmenti isteklerini imzalamak için en az bir HMAC anahtarı kullanılır.
  • daiEncodingProfileIds - Bu etkinlik için etkinleştirilen DAIEncodingProfile kimliklerinin listesi.
  • startDateTime - Etkinliğin başlangıç tarihi ve saati
  • endDateTime - Bu etkinliğin planlanan bitiş tarihi ve saati. Bu özellik, unlimitedEndDateTimeis false and ignored ifunlimitedEndDateTimeis true.unlimitedEndDateTime" hem de Boole türündeyse gereklidir. Yukarıya bakın.

Akış manifesti isteklerini alma

Manifest düzenleyicinizin, video oynatıcı istemci uygulamasından gelen manifest isteklerini dinlemek için bir API uç noktası sağlaması gerekir. En azından, bu uç noktanın istemci oynatıcı uygulamasından akış kimliği toplaması ve birleştirilmiş bir akış manifesti döndürmesi gerekir. Akış kimliği, akış oturumunu Ad Manager'a tanımlamak için kullanılır.

Ayrıca, uygun içerik akışını tanımlamak için Content ID gibi başka bilgiler de toplamanız gerekir.

Potansiyel manifest isteği uç noktası örneği

GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Yol parametreleri
asset_key Sisteminizde istenen canlı yayına karşılık gelen varsayımsal bir kimlik.
format Akış biçimine karşılık gelen varsayımsal bir parametre. Şunlardan biri:
mpd MPEG-DASH akışları için
m3u8 HLS akışları için
Sorgu parametreleri
stream_id İstemci video oynatıcı uygulamasındaki Ad Manager akış kimliği.

İçerik akışını alma

Reklamlarla birleştirilecek içerik akışını seçmek için manifest isteğinden toplanan Content ID'yi kullanın.

Reklam segmentlerini içerik akışında birleştirme

Reklam segmenti URL'lerini birleştirme işlemi, yayın biçiminize bağlı olarak farklılık gösterir.

HLS akışları

HLS akışları genellikle çok değişkenli manifest olarak sunulur. Bu manifest, kodlama profillerinin her birine karşılık gelen varyant manifestlerinin bir dizi bağlantısını içerir.

Not: Kolaylık sağlaması açısından bu kılavuz, HLS medyanızın sesi ve videoyu aynı segment dosyasına birleştiren bir biçimde kodlandığını varsaymaktadır.

Proxy çok değişkenli oynatma listeleri

Oynatıcının seçilen varyant manifestini işlemek için orijinal çok değişkenli oynatma listesindeki her varyant oynatma listesi URL'sini, düzenleyiciye yapılan başka bir uç nokta çağrısıyla değiştirmeniz gerekir.

HLS'yi birleştirmek için gereken diğer adımlar, tek bir varyant manifestin işlenmekte olduğunu varsayar.

Potansiyel varyant isteği uç noktası örneği
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Yol parametreleri
asset_key Sisteminizde istenen canlı yayına karşılık gelen varsayımsal bir kimlik.
variant İşlenen belirli bir varyantın tanımlayıcısını içeren varsayımsal bir parametre.
Sorgu parametreleri
stream_id Manifest düzenleyiciyle kullanıcı oturumunu tanımlamak için burada kullanılan, istemci video oynatıcı uygulamasındaki Ad Manager akış kimliği.
İşlenmemiş çok değişkenli manifest örneği
#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
Proxy kullanılan çok değişkenli manifest örneği
#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

Reklam arası segmentlerini belirleyin ve süreksizlikler ekleyin

Varyant manifestini işlerken, işlenen dinamik manifestte reklam içeriğiyle değiştirilecek segmentler içerene kadar yaklaşan reklam arasının başlangıç zamanını, süresini ve dizinini takip edin.

Reklam araları, kodlayıcınıza bağlı olarak içerik segmentlerinden farklı şekillerde tanımlanabilir. Reklam arası tanımlamanın yaygın bir yolu, reklam segmentlerinin önüne bir #EXT-X-CUE-OUT etiketi eklemek ve ardından #EXT-X-CUE-IN etiketi uygulamaktır.

Google tarafından barındırılan reklam aralarını içerik segmentlerinizden ayırmak için her reklam arasının başına ve sonuna #EXT-X-DISCONTINUITY etiketleri eklemeniz gerekir. Bu süreksizlik etiketleri son manifestte görünmezse oynatma başarısız olur.

Eklenen reklam segmenti URI'ları şifrelenmemiş. İçeriğiniz şifrelenmişse her bir reklam arasının ilk reklam segmentinden önce #EXT-X-KEY:METHOD=NONE değerini belirterek şifrelemeyi kaldırmanız ve reklam arasından sonra tekrar eklemeniz gerekir.

Örnek manifest (orijinal)
#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
Süreksizlikler eklenmiş manifest
#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

Reklam kapsülü segmentlerini işleyin

Reklam kapsülü içindeki her segment için birkaç ek değer izlemeniz gerekir:

  • segment_number: Reklam kapsülü içindeki segment dizini, sıfırdan başlayan. Veya mp4 başlatma segmenti için "init".
  • segment_duration: Geçerli segmentin milisaniye cinsinden süresi. Bu değer, kapsüldeki son segment hariç tüm segmentler için aynı olmalıdır.
  • segment_offset: Önceki segmentin süresi, milisaniye cinsinden segment ofsetine eklenerek segment ofseti hesaplanır
  • last: Reklam kapsülündeki son segmenti tanımlayan Boole değeri. Varsayılan olarak false değerine ayarlanır.

Reklam segmenti URL'leri oluşturma

Reklam arasındaki her segmenti şu biçimdeki bir URL ile değiştirin:

/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)
Yol parametreleri
network_code Bu ağ için Ad Manager 360 ağ kodu.
custom_asset_key LiveStreamEventService API'de veya Ad Manager 360 web arayüzündeki canlı yayın sayfasında belirtilen özel canlı yayın öğesi anahtarı.
pod_id Reklam arasının tanımlayıcısı. 1 ile başlayan ve her reklam arası için bir artan bir tam sayı olmalıdır.

Bu değer, geçerli etkinlikte aynı reklam arasını görüntüleyen tüm kullanıcılar arasında aynı olmalıdır.

profile_name İstenen profilin tanımlayıcısı,
segment_number Geçerli reklam kapsülünde bulunan bu segmentin sıfırdan başlayan dizini.
MP4 kapsayıcı kullanılırken segment_numarası "init" olarak ayarlanarak başlatma segmenti istenebilir.
Sorgu parametreleri
stream_id Gerekli Kullanıcının stream_id parametresi, Akış Oluşturma isteğinden döndürüldü.
sd Gerekli segment_duration
so İsteğe bağlı segment_offset

so yoksa önceki segmentlerin tamamının aynı süreye sahip olduğu ve segment ofsetinin segment_number ile sd değerlerinden hesaplandığı varsayılır.

pd Süresiz reklam aralarının etkinleştirildiği etkinlikler hariç zorunlu Reklam arasının süresi (milisaniye cinsinden). ad_pod_duration olarak da adlandırılır.
auth-token Gerekli Bu reklam kapsülü için imzalı ve URL kodlamalı bir HMAC jetonu.
last İsteğe bağlı Reklam arasındaki son segmenti gösteren boole değeri. Varsayılan olarak false değerine ayarlanır.

Sorgu parametresi değerleri URL için güvenli olacak şekilde doğru biçimde kodlanmalıdır. Bu alan; /, + ve = karakter içerebileceği için özellikle auth-token alanı için önemlidir.

Örnek manifest (segment değişiminden sonra)
#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

Tebrikler! Şu anda DAI Kapsül Yayınlama API'si tarafından sağlanan reklam segmentleriyle canlı yayın yapıyorsunuz.

DASH Akışları

DASH Akışları, tüm akış kodlamalarını tek bir dosyada içeren ve içeriğin bir dizi nokta olarak gösterildiği bir MPD dosyası olarak sağlanır.

İstek dönemi şablonu

Google Ad Manager'dan dönem şablonu isteyin. Bu şablon, içerdiği makrolar doldurulduktan sonra reklam arası döneminiz olacak.

Bu şablonu akış oturumu başına yalnızca bir kez istemeli ve her reklam arasında yeniden kullanmak üzere önbelleğe almalısınız.

Dönem şablonu isteği Endpointhjf
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Yol parametreleri
network_code Yayıncının Ad Manager 360 ağ kodu.
custom_asset Google Ad Manager'daki canlı yayın etkinliğinin özel öğe anahtarı.
Sorgu parametreleri
stream_id İstemci video oynatıcısındaki Ad Manager akış kimliği.
Yanıt JSON
dash_period_template Dönem şablonu XML dizesi.
segment_duration_ms Kısa çizgi dönemi şablonundaki her bir reklam medya segmentinin milisaniye cinsinden süresi.
Örnek istek (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
Örnek yanıt
{"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}

Dönem şablonunu doldur

Dönem şablonu, her reklam arası için değiştirmeniz gereken birkaç makro içerir. Tüm makrolar değiştirilmelidir. Kullanılmayan makrolar boş bir dizeyle ("") değiştirilmelidir.

Makro Açıklama Örnek
$$pod-id$$ Bu dönemin temsil ettiği reklam kapsülünün dizini. Bu değer, tüm izleyici oturumlarında aynı kapsül için eşleşmelidir. 1
$$period-start$$ Geçerli MPD'de dönemin başladığı zaman. start="###" ile değiştirilmesi gereken isteğe bağlı bir özellik. Burada ###, reklam arasının başladığı sunum zamanıdır. Dönemin başlangıç zamanı sağlanmazsa bu makro boş bir dizeyle değiştirilmelidir. start="PT2H33M30S"
$$period-duration$$ Tam reklam döneminin süresi. duration="###" ile değiştirilmesi gereken isteğe bağlı bir özellik. Burada ###, standart DASH süresi biçimindeki reklam döneminin süresidir. Dönem süresi belirtilmezse bu makro boş bir dizeyle değiştirilmelidir. duration="PT15S"
$$pod-duration$$ Bu kapsül için karar verilecek reklamların beklenen süresi (milisaniye cinsinden). 15000
$$number-of-repeated-segments$$ Bu değer, reklam dönemi süresini (milisaniye cinsinden) segment_duration_ms değerine bölüp en yakın tam sayıya yuvarlanarak hesaplanır. 3
$$cust_params$$ Bu makro, sağlanırsa geçerli reklam arasına özgü özel hedefleme parametreleriyle değiştirilebilir. Değer, bu Ad Manager Yardım Merkezi makalesinde açıklandığı gibi biçimlendirilmelidir. Özel parametreye gerek yoksa bu makro boş bir dizeyle değiştirilmelidir. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Sağlanmışsa bu makronun, reklam arasına özel bir scte35 değeriyle değiştirilmesi gerekir. Scte35 bilgisi gerekmiyorsa bu makro boş bir dizeyle değiştirilmelidir. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ İmzalı ve URL kodlu bir HMAC jetonu. Bu jeton gereklidir. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Makroları içeren işlenmemiş dönem şablonu
<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>
Doldurulan reklam dönemi
<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>

Doldurulan döneminizi DASH Manifest'ine ekleyin

Son olarak, ham manifest'inizdeki uygun dönemi yeni doldurulan reklam dönemiyle değiştirin ve birleştirilmiş, nihai manifesti oynatma için istekte bulunan video istemcisine döndürün.

Örnek ham içerik manifesti
<?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>
Birleştirilmiş manifest örneği
<?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>

Tebrikler! Şu anda DAI Kapsül Yayınlama API'si tarafından sağlanan reklam segmentlerini içeren bir DASH canlı akışı yayınlıyorsunuz.

Ek kaynaklar