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 şekildeHLS
veyaDASH
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 saatiendDateTime
- Bu etkinliğin planlanan bitiş tarihi ve saati. Bu özellik,unlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis 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:
|
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ırlast
: 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
|
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}&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}
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&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>
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&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>
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&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>
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
- IMA SDK ile kapsül yayınlama:
- DAI API ile oynatma olanağı sunan kapsül