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

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

Bu kılavuzda, canlı yayınlar için temel bir kapsül yayınlama manifesti değiştirme sunucusu uygulamaya odaklanılmıştır.

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

Kapsül yayınlama API'sinden istek göndermeden önce, işlediğiniz her akış için bir Ad Manager canlı yayın etkinliği oluşturmanız gerekir. Web sitemiz g.co/newsinitiative/labs üzerinden canlı yayın etkinliğinde LiveStreamEventService API veya Google Ad Manager web arayüzü.

Canlı yayın etkinliğinin kapsül sunma API'siyle kullanılması için şunları yapmanız gerekir: etkinliğinizin çeşitli özelliklerini doldurun:

  • customAssetKey: Bu Etkinlik için kullanılacak özel tanımlayıcı. Ağdaki 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 - en az bir HMAC anahtarı reklam segmenti isteklerini imzalamak için kullanılır.
  • daiEncodingProfileIds - DAIEncodingProfile Bu etkinlik için kimlikler etkinleştirildi.
  • 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` - Boole değeri belirlenmişse gereklidir. Yukarıya bakın.

Akış manifesti isteklerini alma

Manifest düzenleyiciniz, manifesti dinlemek için bir API uç noktası sağlamalıdır. video oynatıcı istemci uygulamasından gelen isteklerle ilgilidir. Bu uç nokta, en azından istemci oynatıcı uygulamasından bir akış kimliği almalı ve birleştirilmiş bir akış manifesti. Akış kimliği, akış oturumunu Reklam'a tanımlamak için kullanılır Yönetici'yi seçin.

Ayrıca, uygun türleri belirlemek için başka bilgiler de toplamanız gerekir. bir içerik kimliği oluşturabilirsiniz.

Olası bir 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ışına ekleyin

Reklam segmenti URL'lerinin birleştirilmesi, yayın biçiminize bağlı olarak değişiklik gösterir.

HLS akışları

HLS akışları genellikle çok değişkenli bir manifest olarak yayınlanır. Bu manifest, kodlama profillerinin her birine karşılık gelen varyant manifestlerine ait bir bağlantı grubu içerir.

not: Bu kılavuzda, basitlik açısından HLS medyanızın ses ve videoyu aynı segment dosyasında birleştiren bir biçimde kodlandığı varsayılmıştır.

Proxy çok değişkenli oynatma listeleri

Oynatıcının seçtiği varyant manifestini işlemek için orijinal çok varyantlı oynatma listesindeki her varyant oynatma listesi URL'sini, manipülatöre yapılan başka bir uç nokta çağrısıyla değiştirmeniz gerekir.

HLS'yi birleştirme işleminin kalan adımlarında, tek bir varyant manifestinin işleniyor.

Olası bir 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 kimlik.
variant Belirli bir varyantın tanımlayıcısını içeren varsayımsal bir parametre bir şablondur.
Sorgu parametreleri
stream_id İstemci video oynatıcı uygulamasındaki Ad Manager akış kimliği. şu amaçlarla kullanılır: manifest düzenleyiciyle bir kullanıcı oturumunu tanımlama.
İş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 belirleme ve süreksizlikler ekleme

Varyant manifestini işlerken başlangıç zamanını, süreyi ve dinamik manifest işlenene kadar, bir sonraki reklam arasının dizini yerleştirilecek segmentleri reklam içeriğiyle değiştirecektir.

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

Google tarafından barındırılan reklam aralarını içerik segmentlerinizden ayırmak için Her reklam arasının başında ve sonunda #EXT-X-DISCONTINUITY etiket. Bu Süreksizlik etiketleri nihai manifestte görünmez, oynatma başarısız olur.

Eklenen reklam segmenti URI'leri şifrelenmemiştir. İçeriğiniz şifrelenmişse her reklam arasının ilk reklam segmentinden önce #EXT-X-KEY:METHOD=NONE'yi belirterek şifrelemeyi kaldırmanız ve ardından 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şleme

Bir reklam kapsülü içindeki her segment için birkaç ek değeri izlemeniz gerekir:

  • segment_number: Reklam kapsülündeki segment dizini (sıfırdan başlar). Ya da "init" bölümüne göz atın.
  • segment_duration: Mevcut 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 segment eklenerek hesaplanan segment ofseti segmentin segment ofsetine kadar olan süresi (milisaniye cinsinden)
  • last: Bir reklam kapsülünde son segmenti tanımlayan boole değeri. Varsayılan değer yanlıştır.

Reklam segmenti URL'leri oluşturma

Reklam arası içindeki her segmenti şu biçime sahip bir URL ile değiştirin:

/linear/pods/v1/seg/network/{network_code}/custom_asset/{custom_asset_key}/{pod_identifier}/profile/{profile_name}/{segment_number}.(ts|mp4|vtt|aac|ac3|eac3)
Yol parametreleri
network_code Bu ağın Ad Manager 360 ağ kodu.
custom_asset_key LiveStreamEventService'te belirtilen özel canlı yayın öğe anahtarı veya Ad Manager 360 web arayüzündeki canlı yayın sayfasında gösterilebilir.
pod_identifier

Aşağıdaki biçimler desteklenir:

pod/{integer}

Geçerli reklam arasının sayısal tanımlayıcısı. Reklam kapsülü kimlikleri: her reklam arası etkinliğine artımlı olarak atanır. Bu değer, 1

ad_break_id/{string}

Mevcut reklam arasının dize tanımlayıcısı.

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

so eksikse önceki segmentlerin hepsinin aynı süreye sahip olduğu varsayılır ve segment ofseti segment_number ile sd'den hesaplanır.

pd Süresiz reklam aralarının etkin olduğu etkinlikler hariç zorunludur Reklam arasının süresi (milisaniye cinsinden). ad_pod_duration olarak da adlandırılır.
auth-token Zorunlu İmzalanmış, url kodlamalı bir HMAC jetonu oluşturmanız gerekir.
last İsteğe bağlı Reklam arasının son segmentini belirten boole değeri. Varsayılan değer yanlıştır.

Sorgu parametresi değerleri, URL için uygun olacak şekilde doğru şekilde kodlanmalıdır. Bu, /, + ve = karakterleri içerebileceğinden özellikle auth-token alanı için önemlidir.

Örnek manifest (segment değiştirildikten 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/ad_break_id/adbreak1/profile/devrel4628000/0.ts?sd=5005&so=0&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/1.ts?sd=5005&so=5005&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/2.ts?sd=5005&so=10010&pd=18015&auth-token=ad_break_id%3adbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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/ad_break_id/adbreak1/profile/devrel4628000/3.ts?sd=3000&so=15015&pd=18015&auth-token=ad_break_id%3Dadbreak1~custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~cust_params%3D~exp%3D1489680000~network_code%3D6062~pd%3D180000~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 yayıncının sağladığı reklam segmentlerini içeren bir canlı yayın yapıyorsunuz DAI Kapsül Yayınlama API'si.

DASH akışları

DASH akışları, tüm akış kodlamalarını tek bir dosyada içeren bir MPD dosyası olarak sağlanır. Bu dosyada içerik, bir dizi nokta olarak temsil edilir.

İstek dönemi şablonu

Google Ad Manager'dan dönem şablonu isteyin. Bu şablon, reklam arası dönemini belirler.

Bu şablonu her akış oturumu için yalnızca bir kez istemeli ve aşağıdaki süre boyunca önbelleğe almalısınız yeniden kullanabilirsiniz.

Dönem şablonu istek uç noktasıhjf
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ıdaki Ad Manager akış kimliği.
Yanıt JSON'u
dash_period_template Dönem şablonu XML dizesi.
segment_duration_ms Tireli dönem şablonundaki her reklam medyası 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 doldurun

Dönem şablonu, her reklam için değiştirmeniz gereken birkaç makro içerir mola verin. Tüm makroların değiştirilmesi gerekiyor. Kullanılmayan makrolar boş bir dize ("") ile 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ülle 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. ###, 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$$ Reklam döneminin tamamının süresi. duration="###" ile değiştirilmesi gereken isteğe bağlı bir özelliktir. ###, standart DASH süre biçiminde reklam döneminin süresidir. Dönem süresinin belirtilmemesi durumunda bu makro boş bir diziyle değiştirilmelidir. duration="PT15S"
$$pod-duration$$ Bu kapsül için karar verilecek reklamların beklenen süresi milisaniye cinsinden ayarlanır. 15000
$$number-of-repeated-segments$$ Bu değer, reklam dönemi süresinin (milisaniye cinsinden) segment_duration_ms değerine bölünmesi ve en yakın tam sayıya yuvarlanması ile hesaplanır. 3
$$cust_params$$ Bu makro, geçerli reklam arasını gösterir. sağlar. Değer, bu Ad Manager Yardım Merkezi makalesinde açıklandığı şekilde biçimlendirilmelidir. Özel parametre gerekmiyorsa bu makronun yerine boş bir dize. &cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
$$scte35$$ Bu makronun, söz konusu reklam arasına özel bir scte35 değeriyle değiştirilmesi gerekir. e-posta adresini kullanabilirsiniz. scte35 bilgisi gerekmiyorsa bu makro boş bir dizeyle değiştirilir. /DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
$$token$$ İmzalı, URL kodlamalı HMAC jetonu. Bu jeton gereklidir. custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
Makro 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>
Doldurulmuş 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 manifestine ekleme

Son olarak, ham manifestinizdeki uygun dönemi yeni doldurulan reklam dönemiyle değiştirin ve oynatılmak üzere nihai birleştirilmiş manifesti istek gönderen video istemciye döndürün.

Ham içerik manifesti ö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 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>
Örnek birleştirilmiş manifest
<?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 reklam segmentleri sağlanan bir DASH canlı yayını yayınlıyorsunuz bunu DAI Kapsül Yayınlama API'si ile gerçekleştirebilirsiniz.

Ek kaynaklar