Pod Serve API menyediakan akses ke segmen iklan yang dienkode dan dikondisikan, yang disiapkan sedemikian rupa sehingga dapat digabungkan langsung menjadi playlist media HLS atau MPEG-DASH yang ditampilkan kepada pengguna. Untuk MPEG-DASH, Pod Serve API juga menyediakan template manifes untuk memberikan informasi dan konteks tambahan untuk segmen iklan ini.
Panduan ini berfokus pada penerapan server manipulasi manifes Penayangan Pod dasar untuk live stream.
Prasyarat: Mengonfigurasi peristiwa livestream di Google Ad Manager
Sebelum membuat permintaan apa pun dari API penayangan pod, Anda harus membuat peristiwa livestream Ad
Manager untuk setiap streaming yang diproses. Anda dapat membuat
acara livestream menggunakan
LiveStreamEventService API
atau
antarmuka web Google Ad Manager.
Agar peristiwa livestream dapat digunakan dengan API penayangan pod, Anda harus mengisi beberapa atribut peristiwa:
customAssetKey
- ID kustom yang akan digunakan untuk Peristiwa ini. Harus unik di seluruh Peristiwa untuk jaringan.adTags
- URL tag iklan utama yang dihasilkan oleh alur kerja proses iklan Ad Manager.dynamicAdInsertionType
- Harus ditetapkan kePOD_SERVING_REDIRECT
.streamingFormat
- Setel keHLS
atauDASH
sebagaimana mestinya.segmentUrlAuthenticationKeyIds
- setidaknya satu kunci HMAC yang digunakan untuk menandatangani permintaan segmen iklan.daiEncodingProfileIds
- Daftar ID DAIEncodingProfile yang diaktifkan untuk peristiwa ini.startDateTime
- Tanggal dan waktu acara dimulaiendDateTime
- Tanggal dan waktu akhir yang dijadwalkan untuk acara ini. Atribut ini diperlukan jikaunlimitedEndDateTime
is false and ignored if
unlimitedEndDateTimeis true.
unlimitedEndDateTime` - Boolean. Lihat di atas.
Menerima permintaan manifes streaming
Manipulator manifes Anda harus menyediakan endpoint API untuk memproses permintaan manifes dari aplikasi klien pemutar video. Setidaknya, endpoint ini harus mengumpulkan ID streaming dari aplikasi pemutar klien, dan harus menampilkan manifes streaming yang digabungkan. ID streaming digunakan untuk mengidentifikasi sesi streaming ke Ad Manager.
Anda juga perlu mengumpulkan beberapa informasi lain untuk mengidentifikasi streaming konten yang sesuai, misalnya, Content ID.
Contoh endpoint permintaan manifes potensial
GET /api/video/{asset_key}/manifest.{format}
Host: {your_domain}
Parameter jalur | |||||
---|---|---|---|---|---|
asset_key |
ID hipotetis yang sesuai dengan livestream yang diminta di sistem Anda. | ||||
format |
Parameter hipotetis yang sesuai dengan format streaming. Salah satu dari:
|
Parameter kueri | |
---|---|
stream_id |
ID streaming Ad Manager dari aplikasi pemutar video klien. |
Mengambil streaming konten
Gunakan ID konten yang dikumpulkan dari permintaan manifes untuk memilih aliran konten yang akan digabungkan dengan iklan.
Menggabungkan segmen iklan ke dalam streaming konten
Penggabungan URL segmen iklan akan berbeda, bergantung pada format streaming Anda.
Streaming HLS
Streaming HLS biasanya ditayangkan sebagai manifes multi-varian, yang akan berisi serangkaian link ke manifes varian, yang sesuai dengan setiap profil encoding.
catatan: Agar lebih mudah, panduan ini mengasumsikan bahwa media HLS Anda dienkode dalam format yang menggabungkan audio dan video ke dalam file segmen yang sama.
Playlist multi-varian proxy
Anda harus mengganti setiap URL playlist varian di playlist multi-varian asli dengan panggilan endpoint lain ke manipulator untuk memproses manifes varian yang dipilih oleh pemain.
Langkah yang tersisa untuk menggabungkan HLS akan mengasumsikan bahwa satu manifes varian sedang diproses.
Contoh endpoint permintaan varian potensial
GET /api/video/{asset_key}/variant/{variant_id}.m3u8
Host: {your_domain}
Parameter jalur | |
---|---|
asset_key |
ID hipotetis yang sesuai dengan livestream yang diminta di sistem Anda. |
variant |
Parameter hipotetis yang berisi ID untuk varian tertentu yang sedang diproses. |
Parameter kueri | |
---|---|
stream_id |
ID streaming Ad Manager dari aplikasi pemutar video klien. yang digunakan di sini untuk mengidentifikasi sesi pengguna dengan manipulator manifes. |
Contoh manifes multi-varian yang belum diproses
#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
Contoh manifes multi-varian melalui 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
Identifikasi segmen jeda iklan dan masukkan diskon
Saat Anda memproses manifes varian, lacak waktu mulai, durasi, dan indeks jeda iklan mendatang berikutnya, hingga manifes dinamis yang diproses berisi segmen yang akan diganti dengan konten iklan.
Jeda iklan dapat digambarkan dari segmen konten dengan berbagai cara, bergantung
pada encoder Anda. Salah satu cara umum untuk menunjukkan jeda iklan adalah dengan mengawali segmen
iklan dengan tag #EXT-X-CUE-OUT
dan diikuti dengan tag #EXT-X-CUE-IN
.
Untuk memisahkan jeda iklan yang dihosting Google dari segmen konten, Anda harus memasukkan tag #EXT-X-DISCONTINUITY
di awal dan akhir setiap jeda iklan. Jika
tag penghentian ini tidak muncul dalam manifes akhir, pemutaran akan gagal.
URI segmen iklan yang dimasukkan tidak dienkripsi. Jika konten dienkripsi,
Anda juga harus menghapus enkripsi dengan menentukan #EXT-X-KEY:METHOD=NONE
sebelum segmen iklan pertama di setiap jeda iklan, lalu menambahkannya kembali setelah
jeda iklan.
Contoh manifes (asli)
#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
Manifes dengan diskontinuitas yang disisipkan
#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
Memproses segmen pod iklan
Untuk setiap segmen dalam pod iklan, Anda harus melacak beberapa nilai tambahan:
segment_number
: Indeks segmen dalam pod iklan, dimulai dengan nol. Atau "init" untuk segmen inisialisasi mp4.segment_duration
: Durasi segmen saat ini dalam milidetik. Nilai ini harus sama untuk semua segmen kecuali yang terakhir dalam pod.segment_offset
: Offset segmen dihitung dengan menambahkan durasi segmen sebelumnya ke offset segmennya dalam milidetiklast
: Nilai Boolean yang mengidentifikasi segmen terakhir di pod iklan. Nilai defaultnya adalah false (salah).
Buat URL segmen iklan
Ganti setiap segmen dalam jeda iklan dengan URL berformat:
/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)
Parameter jalur | |
---|---|
network_code
|
Kode jaringan Ad Manager 360 untuk jaringan ini. |
custom_asset_key
|
Kunci aset livestream kustom yang ditentukan di LiveStreamEventService API atau di halaman livestream di antarmuka web Ad Manager 360. |
pod_id
|
ID untuk jeda iklan. Harus berupa bilangan bulat yang dimulai dari
1 dan bertambah satu untuk setiap jeda iklan.
Nilai ini harus sama untuk semua pengguna yang melihat jeda iklan yang sama pada peristiwa saat ini. |
profile_name
|
ID untuk profil yang diminta, |
segment_number
|
Indeks segmen ini dalam pod iklan saat ini, mulai dari nol. Saat menggunakan penampung MP4, segmen inisialisasi dapat diminta dengan menetapkan Segment_number ke "init". |
Parameter kueri | ||
---|---|---|
stream_id
|
Wajib | Parameter stream_id pengguna ditampilkan dari permintaan Pembuatan Streaming.
|
sd
|
Wajib | segment_duration
|
so
|
Opsional | segment_offset
Jika |
pd
|
Wajib, kecuali untuk acara yang mengaktifkan jeda iklan tanpa durasi | Durasi (dalam milidetik) jeda iklan. Juga disebut sebagai
ad_pod_duration .
|
auth-token
|
Wajib | Token HMAC yang ditandatangani dan dienkode URL untuk pod iklan ini. |
last
|
Opsional | Boolean yang menunjukkan segmen terakhir dalam jeda iklan. Nilai defaultnya adalah false (salah). |
Nilai parameter kueri harus dienkode dengan benar agar aman untuk URL. Hal ini
sangat penting untuk kolom auth-token
, karena dapat berisi karakter /
,
+
, dan =
.
Contoh manifes (setelah penggantian segmen)
#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
Selamat! Anda kini menayangkan livestream dengan segmen iklan yang disediakan oleh DAI Pod Serve API.
Aliran DASH
Streaming DASH disediakan sebagai file MPD, yang berisi semua encoding streaming dalam satu file, dengan konten direpresentasikan sebagai serangkaian periode.
Template periode permintaan
Minta template periode dari Google Ad Manager. Template ini akan menjadi periode jeda iklan Anda, setelah makro di dalamnya terisi.
Anda hanya boleh meminta template ini sekali per sesi streaming, dan meng-cache-nya untuk digunakan kembali setiap kali jeda iklan.
Endpoint permintaan template periode
GET /linear/pods/v1/dash/network/{network_code}/custom_asset/{custom_asset}/pods.json
Host: dai.google.com
Content-Type: application/json
Parameter jalur | |
---|---|
network_code |
Kode jaringan Ad Manager 360 penayang. |
custom_asset |
Kunci aset kustom dari peristiwa live streaming di Google Ad Manager. |
Parameter kueri | |
---|---|
stream_id |
ID streaming Ad Manager dari pemutar video klien. |
Tanggapan JSON | |
---|---|
dash_period_template |
String XML template periode. |
segment_duration_ms |
Durasi setiap segmen media iklan di template titik pisah, dalam milidetik. |
Contoh permintaan (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
Contoh respons
{"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}
Isi template periode
Template periode berisi beberapa makro yang harus Anda ganti untuk setiap jeda iklan. Semua makro harus diganti. Makro yang tidak digunakan harus diganti dengan string kosong ("").
Macro | Deskripsi | Contoh |
---|---|---|
$$pod-id$$ |
Indeks pod iklan yang diwakili oleh periode ini. Nilai ini harus cocok untuk pod yang sama di semua sesi pelihat. | 1 |
$$period-start$$ |
Waktu saat periode dimulai dalam MPD saat ini. Atribut opsional
yang harus diganti dengan start="###" , dengan
### adalah waktu presentasi saat jeda iklan dimulai. Jika waktu mulai periode tidak diberikan, makro ini harus diganti dengan string kosong.
|
start="PT2H33M30S" |
$$period-duration$$ |
Durasi periode iklan lengkap. Atribut opsional yang harus diganti dengan duration="###" , dengan ### adalah durasi periode iklan dalam format durasi DASH standar. Jika durasi periode tidak diberikan, makro ini harus diganti dengan string kosong.
|
duration="PT15S" |
$$pod-duration$$ |
Perkiraan durasi iklan yang akan ditentukan untuk pod ini, dalam milidetik. | 15000 |
$$number-of-repeated-segments$$ |
Nilai ini dihitung dengan membagi durasi periode iklan (dalam milidetik) dengan nilai Segment_duration_ms, dan dibulatkan ke bilangan bulat terdekat. | 3 |
$$cust_params$$ |
Makro ini dapat diganti dengan parameter penargetan kustom yang unik untuk jeda iklan saat ini, jika tersedia. Nilai harus diformat seperti yang dijelaskan di artikel Pusat Bantuan Ad Manager ini. Jika parameter kustom tidak diperlukan, makro ini harus diganti dengan string kosong. |
&cust_params=section%3Dblog%26anotherKey%3Dvalue1%2Cvalue2
|
$$scte35$$ |
Makro ini perlu diganti dengan nilai scte35 yang unik untuk jeda iklan tersebut, jika ada. Jika informasi scte35 tidak diperlukan, makro ini harus diganti dengan string kosong. |
/DAqAAAAAAAA///wDwVAAAT2f0/+ecF1mQABC/8ACgAIQ1VFSQAAAAsuZVlR
|
$$token$$ |
Token HMAC yang ditandatangani dan dienkode URL. Token ini diperlukan. |
custom_asset_key%3DiYdOkYZdQ1KFULXSN0Gi7g~exp%3D1489680000~network_code%3D6062~pd%3D180000~pod_id%3D5~hmac%3D6a8c44c72e4718ff63ad2284edf2a8b9e319600b430349d31195c99b505858c9
|
Template periode mentah, yang berisi makro
<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>
Periode iklan yang terisi
<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>
Memasukkan periode yang terisi ke Manifes DASH
Terakhir, ganti periode yang sesuai dalam manifes mentah dengan periode iklan yang baru diisi, dan tampilkan manifes akhir yang digabungkan ke klien video yang meminta, untuk diputar.
Contoh manifes konten mentah
<?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>
Contoh manifes gabungan
<?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>
Selamat! Anda kini menayangkan livestream DASH dengan segmen iklan yang disediakan oleh DAI Pod Serve API.
Referensi tambahan
- Pod yang menayangkan pemutaran dengan IMA SDK:
- Pod yang menayangkan pemutaran dengan DAI API