این راهنما، توسعه یک برنامه کلاینت برای بارگذاری پخش زنده HLS یا DASH با API سرویسدهی Pod و کنترلکننده مانیفست شما را پوشش میدهد.
پیشنیازها
قبل از ادامه، باید موارد زیر را داشته باشید:
یک کلید دارایی سفارشی برای یک رویداد پخش زنده که با نوع DAI
Pod serving redirectپیکربندی شده است. برای دریافت این کلید، مراحل زیر را دنبال کنید:از یک کتابخانه کلاینت SOAP API برای فراخوانی متد
LiveStreamEventService.createLiveStreamEventsبا یک شیءLiveStreamEventو ویژگیdynamicAdInsertionTypeکه روی مقدار شمارشیPOD_SERVING_REDIRECTتنظیم شده است، استفاده کنید. برای مشاهده همه کتابخانههای کلاینت، به کتابخانههای کلاینت و کد نمونه مراجعه کنید.
بررسی کنید که آیا SDK تبلیغات رسانهای تعاملی (IMA) برای پلتفرم شما در دسترس است یا خیر. ما استفاده از IMA SDK را برای افزایش درآمد توصیه میکنیم. برای جزئیات بیشتر، به تنظیم IMA SDK برای DAI مراجعه کنید.
درخواست پخش جریانی بدهید
وقتی کاربر شما یک جریان را انتخاب میکند، موارد زیر را انجام دهید:
یک درخواست
POSTبه متد سرویس پخش زنده ارسال کنید. برای جزئیات بیشتر، به Method: stream مراجعه کنید.پارامترهای هدفگیری تبلیغات را در قالبهای
application/x-www-form-urlencodedیاapplication/jsonارسال کنید. این درخواست یک جلسه پخش جریانی را در Google DAI ثبت میکند.مثال زیر یک درخواست جریان ایجاد میکند:
کدگذاری فرم
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());رمزگذاری JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());در صورت موفقیت، خروجی مشابه زیر را مشاهده خواهید کرد:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }در پاسخ JSON، شناسه جلسه جریان را پیدا کنید و سایر دادهها را برای مراحل بعدی ذخیره کنید.
فرادادههای تبلیغات نظرسنجی
برای نظرسنجی در مورد متادیتای تبلیغات، موارد زیر را انجام دهید:
مقدار
metadata_urlرا از پاسخ ثبت جریان (stream registration response) بخوانید.یک درخواست اولیه
GETبه نقطه پایانیmetadata_urlارسال کنید.- پارامتر کوئری
delta_tokenحذف کنید. این فرآیند به سرور اجازه میدهد تا فراداده کامل مربوط به پنجره ضبطکننده ویدیوی دیجیتال (DVR) مربوط به پخش زنده را برگرداند. پنجره DVR شامل بازه زمانی پخش موجود برای بیننده جهت عقب و جلو بردن و پخش مجدد است. پاسخ شامل یک فیلدnext_delta_tokenاست.
- پارامتر کوئری
برای بهینهسازی پهنای باند، مقدار
next_delta_tokenرا از جدیدترین پاسخ ذخیره کنید.در درخواست بعدی خود، آن مقدار را به عنوان پارامتر کوئری
delta_tokenارسال کنید. سرور فقط فرادادههایی را که از زمان تولید آن توکن تغییر کردهاند، برمیگرداند. همیشه آخرین توکنی را که دریافت کردهاید ارسال کنید. سعی نکنید توکن را تجزیه، اصلاح یا بسازید. برای جزئیات بیشتر، به Method: metadata مراجعه کنید.مثال زیر متادیتای تبلیغات را دریافت میکند:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }در صورت موفقیت، پاسخ PodMetadata را دریافت میکنید. اگر پارامتر
delta_tokenرا وارد کنید، پاسخ فقط شامل تبلیغات، وقفههای تبلیغاتی و برچسبهایی است که سرور از زمان تولید توکن توسط سرور اضافه یا بهروزرسانی کرده است. پاسخ همچنین حاوی مقدار جدیدnext_delta_tokenاست. اگر هرگونه وقفه تبلیغاتی قدیمی باشد، پاسخ شامل لیستobsolete_ad_break_idsاز وقفههای تبلیغاتی برای حذف از حافظه پنهان شما نیز میشود.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }شیء
tagsرا ذخیره کنید و بهروزرسانیها را در حافظه پنهان محلی خود ادغام کنید. اگر پارامترobsolete_ad_break_idsوجود دارد، آن وقفههای تبلیغاتی و تبلیغات و برچسبهای مرتبط را از حافظه پنهان خود حذف کنید.با استفاده از مقدار
polling_frequencyیک تایمر تنظیم کنید تا مرتباً فراداده درخواست شود. در هر نظرسنجی، مقدارnext_delta_tokenبرگردانده شده در جدیدترین پاسخ فراداده را به عنوان پارامتر پرس و جویdelta_tokenارسال کنید.
پخش جریانی را در پخشکننده ویدیوی خود بارگذاری کنید
بعد از اینکه شناسه جلسه را از پاسخ ثبت نام دریافت کردید، شناسه را به کنترلکننده مانیفست خود منتقل کنید، یا یک URL مانیفست برای بارگذاری جریان در یک پخشکننده ویدیو بسازید.
برای ارسال شناسه جلسه، به مستندات دستکاریکننده مانیفست خود مراجعه کنید. اگر یک دستکاریکننده مانیفست ایجاد میکنید، برای پخش زنده به Manifest manipulator مراجعه کنید.
مثال زیر یک URL مانیفست را مونتاژ میکند:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
وقتی پخشکننده شما آماده شد، پخش را شروع کنید.
به رویدادهای تبلیغاتی گوش دهید
قالب کانتینر جریان خود را برای ابرداده زمانبندیشده بررسی کنید:
جریانهای HLS با کانتینرهای Transport Stream (TS) از برچسبهای ID3 زمانبندیشده برای حمل فرادادههای زمانبندیشده استفاده میکنند. برای جزئیات بیشتر، به «درباره قالب برنامه رسانهای مشترک با HTTP Live Streaming (HLS)» مراجعه کنید.
جریانهای DASH از عناصر
EventStreamبرای مشخص کردن رویدادها در مانیفست استفاده میکنند.جریانهای DASH از عناصر
InbandEventStreamاستفاده میکنند، زمانی که بخشها حاوی کادرهای پیام رویداد (emsg) برای دادههای بار داده، از جمله برچسبهای ID3، باشند. برای جزئیات بیشتر، به InbandEventStream مراجعه کنید.جریانهای CMAF، شامل DASH و HLS، از جعبههای
emsgحاوی برچسبهای ID3 استفاده میکنند.
برای بازیابی تگهای ID3 از پخش زنده خود، به راهنمای پخشکننده ویدیوی خود مراجعه کنید. برای جزئیات بیشتر، به راهنمای مدیریت فرادادههای زمانبندیشده مراجعه کنید.
برای بازیابی شناسه رویداد تبلیغ از برچسبهای ID3، موارد زیر را انجام دهید:
- رویدادها را بر اساس
scheme_id_uriباurn:google:dai:2018یاhttps://aomedia.org/emsg/ID3فیلتر کنید. آرایه بایت را از فیلد
message_dataاستخراج کن.مثال زیر دادههای
emsgرا به JSON رمزگشایی میکند:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }تگهای ID3 را با فرمت
TXXXgoogle_{ad_event_ID}فیلتر کنید:TXXXgoogle_1022389921
نمایش دادههای رویداد تبلیغ
برای یافتن شیء TagSegment ، مراحل زیر را انجام دهید:
شیء
tagsمربوط به متادیتای تبلیغات را از متادیتای تبلیغات Poll بازیابی کنید. شیءtagsآرایهای از اشیاءTagSegmentاست.از شناسه کامل رویداد تبلیغ برای یافتن یک شیء
TagSegmentبا نوعprogressاستفاده کنید.از ۱۷ کاراکتر اول شناسه رویداد تبلیغ برای یافتن یک شیء
TagSegmentاز انواع دیگر استفاده کنید.از آنجا که برنامهی کلاینت شما به صورت دورهای فرادادههای تبلیغاتی را جمعآوری میکند، ممکن است بین زمانی که پخشکنندهی ویدیوی شما با یک برچسب ID3 در جریان مواجه میشود و زمانی که فرادادهی مرتبط در دسترس قرار میگیرد، تأخیری رخ دهد. اگر برنامهی کلاینت شما برچسب ID3 را در برچسبهای ذخیرهشده پیدا نکرد، برچسب را در صف نگه دارید و پس از جمعآوری فرادادهی بعدی، برچسب را دوباره پردازش کنید. برچسب را تا زمان اتمام پردازش در صف نگه دارید.
بعد از اینکه
TagSegmentایجاد کردید، از ویژگیad_break_idبه عنوان کلید برای یافتن شیءAdBreakدر متادیتای تبلیغad_breaksاستفاده کنید.مثال زیر یک شیء
AdBreakرا پیدا میکند:{ "type":"mid", "duration":15, "ads":1 }از دادههای
TagSegmentوAdBreakبرای نمایش اطلاعات مربوط به موقعیت تبلیغ در متن تبلیغ استفاده کنید. برای مثال،Ad 1 of 3.
ارسال پینگهای تأیید رسانه
برای هر رویداد تبلیغاتی، به جز نوع progress ، یک پینگ تأیید رسانه ارسال کنید. Google DAI رویدادهای progress نادیده میگیرد و ارسال مکرر این رویدادها ممکن است بر عملکرد برنامه شما تأثیر بگذارد.
برای تولید URL تأیید رسانه کامل یک رویداد تبلیغاتی، موارد زیر را انجام دهید:
از پاسخ جریان، شناسه کامل رویداد تبلیغ را به مقدار
media_verification_urlاضافه کنید.یک درخواست
GETبا URL کامل ارسال کنید:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);در صورت موفقیت، کد وضعیت
202دریافت میکنید. در غیر این صورت، کد خطای404دریافت خواهید کرد.
شما میتوانید از ابزار نظارت بر فعالیت پخش زنده (SAM) برای بررسی گزارش تاریخچهی تمام رویدادهای تبلیغاتی استفاده کنید. برای جزئیات بیشتر، به بخش نظارت و عیبیابی پخش زنده مراجعه کنید.
،این راهنما، توسعه یک برنامه کلاینت برای بارگذاری پخش زنده HLS یا DASH با API سرویسدهی Pod و کنترلکننده مانیفست شما را پوشش میدهد.
پیشنیازها
قبل از ادامه، باید موارد زیر را داشته باشید:
یک کلید دارایی سفارشی برای یک رویداد پخش زنده که با نوع DAI
Pod serving redirectپیکربندی شده است. برای دریافت این کلید، مراحل زیر را دنبال کنید:از یک کتابخانه کلاینت SOAP API برای فراخوانی متد
LiveStreamEventService.createLiveStreamEventsبا یک شیءLiveStreamEventو ویژگیdynamicAdInsertionTypeکه روی مقدار شمارشیPOD_SERVING_REDIRECTتنظیم شده است، استفاده کنید. برای مشاهده همه کتابخانههای کلاینت، به کتابخانههای کلاینت و کد نمونه مراجعه کنید.
بررسی کنید که آیا SDK تبلیغات رسانهای تعاملی (IMA) برای پلتفرم شما در دسترس است یا خیر. ما استفاده از IMA SDK را برای افزایش درآمد توصیه میکنیم. برای جزئیات بیشتر، به تنظیم IMA SDK برای DAI مراجعه کنید.
درخواست پخش جریانی بدهید
وقتی کاربر شما یک جریان را انتخاب میکند، موارد زیر را انجام دهید:
یک درخواست
POSTبه متد سرویس پخش زنده ارسال کنید. برای جزئیات بیشتر، به Method: stream مراجعه کنید.پارامترهای هدفگیری تبلیغات را در قالبهای
application/x-www-form-urlencodedیاapplication/jsonارسال کنید. این درخواست یک جلسه پخش جریانی را در Google DAI ثبت میکند.مثال زیر یک درخواست جریان ایجاد میکند:
کدگذاری فرم
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());رمزگذاری JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());در صورت موفقیت، خروجی مشابه زیر را مشاهده خواهید کرد:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }در پاسخ JSON، شناسه جلسه جریان را پیدا کنید و سایر دادهها را برای مراحل بعدی ذخیره کنید.
فرادادههای تبلیغات نظرسنجی
برای نظرسنجی در مورد متادیتای تبلیغات، موارد زیر را انجام دهید:
مقدار
metadata_urlرا از پاسخ ثبت جریان (stream registration response) بخوانید.یک درخواست اولیه
GETبه نقطه پایانیmetadata_urlارسال کنید.- پارامتر کوئری
delta_tokenحذف کنید. این فرآیند به سرور اجازه میدهد تا فراداده کامل مربوط به پنجره ضبطکننده ویدیوی دیجیتال (DVR) مربوط به پخش زنده را برگرداند. پنجره DVR شامل بازه زمانی پخش موجود برای بیننده جهت عقب و جلو بردن و پخش مجدد است. پاسخ شامل یک فیلدnext_delta_tokenاست.
- پارامتر کوئری
برای بهینهسازی پهنای باند، مقدار
next_delta_tokenرا از جدیدترین پاسخ ذخیره کنید.در درخواست بعدی خود، آن مقدار را به عنوان پارامتر کوئری
delta_tokenارسال کنید. سرور فقط فرادادههایی را که از زمان تولید آن توکن تغییر کردهاند، برمیگرداند. همیشه آخرین توکنی را که دریافت کردهاید ارسال کنید. سعی نکنید توکن را تجزیه، اصلاح یا بسازید. برای جزئیات بیشتر، به Method: metadata مراجعه کنید.مثال زیر متادیتای تبلیغات را دریافت میکند:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }در صورت موفقیت، پاسخ PodMetadata را دریافت میکنید. اگر پارامتر
delta_tokenرا وارد کنید، پاسخ فقط شامل تبلیغات، وقفههای تبلیغاتی و برچسبهایی است که سرور از زمان تولید توکن توسط سرور اضافه یا بهروزرسانی کرده است. پاسخ همچنین حاوی مقدار جدیدnext_delta_tokenاست. اگر هرگونه وقفه تبلیغاتی قدیمی باشد، پاسخ شامل لیستobsolete_ad_break_idsاز وقفههای تبلیغاتی برای حذف از حافظه پنهان شما نیز میشود.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }شیء
tagsرا ذخیره کنید و بهروزرسانیها را در حافظه پنهان محلی خود ادغام کنید. اگر پارامترobsolete_ad_break_idsوجود دارد، آن وقفههای تبلیغاتی و تبلیغات و برچسبهای مرتبط را از حافظه پنهان خود حذف کنید.با استفاده از مقدار
polling_frequencyیک تایمر تنظیم کنید تا مرتباً فراداده درخواست شود. در هر نظرسنجی، مقدارnext_delta_tokenبرگردانده شده در جدیدترین پاسخ فراداده را به عنوان پارامتر پرس و جویdelta_tokenارسال کنید.
پخش جریانی را در پخشکننده ویدیوی خود بارگذاری کنید
بعد از اینکه شناسه جلسه را از پاسخ ثبت نام دریافت کردید، شناسه را به کنترلکننده مانیفست خود منتقل کنید، یا یک URL مانیفست برای بارگذاری جریان در یک پخشکننده ویدیو بسازید.
برای ارسال شناسه جلسه، به مستندات دستکاریکننده مانیفست خود مراجعه کنید. اگر یک دستکاریکننده مانیفست ایجاد میکنید، برای پخش زنده به Manifest manipulator مراجعه کنید.
مثال زیر یک URL مانیفست را مونتاژ میکند:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
وقتی پخشکننده شما آماده شد، پخش را شروع کنید.
به رویدادهای تبلیغاتی گوش دهید
قالب کانتینر جریان خود را برای ابرداده زمانبندیشده بررسی کنید:
جریانهای HLS با کانتینرهای Transport Stream (TS) از برچسبهای ID3 زمانبندیشده برای حمل فرادادههای زمانبندیشده استفاده میکنند. برای جزئیات بیشتر، به «درباره قالب برنامه رسانهای مشترک با HTTP Live Streaming (HLS)» مراجعه کنید.
جریانهای DASH از عناصر
EventStreamبرای مشخص کردن رویدادها در مانیفست استفاده میکنند.جریانهای DASH از عناصر
InbandEventStreamاستفاده میکنند، زمانی که بخشها حاوی کادرهای پیام رویداد (emsg) برای دادههای بار داده، از جمله برچسبهای ID3، باشند. برای جزئیات بیشتر، به InbandEventStream مراجعه کنید.جریانهای CMAF، شامل DASH و HLS، از جعبههای
emsgحاوی برچسبهای ID3 استفاده میکنند.
برای بازیابی تگهای ID3 از پخش زنده خود، به راهنمای پخشکننده ویدیوی خود مراجعه کنید. برای جزئیات بیشتر، به راهنمای مدیریت فرادادههای زمانبندیشده مراجعه کنید.
برای بازیابی شناسه رویداد تبلیغ از برچسبهای ID3، موارد زیر را انجام دهید:
- رویدادها را بر اساس
scheme_id_uriباurn:google:dai:2018یاhttps://aomedia.org/emsg/ID3فیلتر کنید. آرایه بایت را از فیلد
message_dataاستخراج کن.مثال زیر دادههای
emsgرا به JSON رمزگشایی میکند:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }تگهای ID3 را با فرمت
TXXXgoogle_{ad_event_ID}فیلتر کنید:TXXXgoogle_1022389921
نمایش دادههای رویداد تبلیغ
برای یافتن شیء TagSegment ، مراحل زیر را انجام دهید:
شیء
tagsمربوط به متادیتای تبلیغات را از متادیتای تبلیغات Poll بازیابی کنید. شیءtagsآرایهای از اشیاءTagSegmentاست.از شناسه کامل رویداد تبلیغ برای یافتن یک شیء
TagSegmentبا نوعprogressاستفاده کنید.از ۱۷ کاراکتر اول شناسه رویداد تبلیغ برای یافتن یک شیء
TagSegmentاز انواع دیگر استفاده کنید.از آنجا که برنامهی کلاینت شما به صورت دورهای فرادادههای تبلیغاتی را جمعآوری میکند، ممکن است بین زمانی که پخشکنندهی ویدیوی شما با یک برچسب ID3 در جریان مواجه میشود و زمانی که فرادادهی مرتبط در دسترس قرار میگیرد، تأخیری رخ دهد. اگر برنامهی کلاینت شما برچسب ID3 را در برچسبهای ذخیرهشده پیدا نکرد، برچسب را در صف نگه دارید و پس از جمعآوری فرادادهی بعدی، برچسب را دوباره پردازش کنید. برچسب را تا زمان اتمام پردازش در صف نگه دارید.
بعد از اینکه
TagSegmentایجاد کردید، از ویژگیad_break_idبه عنوان کلید برای یافتن شیءAdBreakدر متادیتای تبلیغad_breaksاستفاده کنید.مثال زیر یک شیء
AdBreakرا پیدا میکند:{ "type":"mid", "duration":15, "ads":1 }از دادههای
TagSegmentوAdBreakبرای نمایش اطلاعات مربوط به موقعیت تبلیغ در متن تبلیغ استفاده کنید. برای مثال،Ad 1 of 3.
ارسال پینگهای تأیید رسانه
برای هر رویداد تبلیغاتی، به جز نوع progress ، یک پینگ تأیید رسانه ارسال کنید. Google DAI رویدادهای progress نادیده میگیرد و ارسال مکرر این رویدادها ممکن است بر عملکرد برنامه شما تأثیر بگذارد.
برای تولید URL تأیید رسانه کامل یک رویداد تبلیغاتی، موارد زیر را انجام دهید:
از پاسخ جریان، شناسه کامل رویداد تبلیغ را به مقدار
media_verification_urlاضافه کنید.یک درخواست
GETبا URL کامل ارسال کنید:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);در صورت موفقیت، کد وضعیت
202دریافت میکنید. در غیر این صورت، کد خطای404دریافت خواهید کرد.
شما میتوانید از ابزار نظارت بر فعالیت پخش زنده (SAM) برای بررسی گزارش تاریخچهی تمام رویدادهای تبلیغاتی استفاده کنید. برای جزئیات بیشتر، به بخش نظارت و عیبیابی پخش زنده مراجعه کنید.
،این راهنما، توسعه یک برنامه کلاینت برای بارگذاری پخش زنده HLS یا DASH با API سرویسدهی Pod و کنترلکننده مانیفست شما را پوشش میدهد.
پیشنیازها
قبل از ادامه، باید موارد زیر را داشته باشید:
یک کلید دارایی سفارشی برای یک رویداد پخش زنده که با نوع DAI
Pod serving redirectپیکربندی شده است. برای دریافت این کلید، مراحل زیر را دنبال کنید:از یک کتابخانه کلاینت SOAP API برای فراخوانی متد
LiveStreamEventService.createLiveStreamEventsبا یک شیءLiveStreamEventو ویژگیdynamicAdInsertionTypeکه روی مقدار شمارشیPOD_SERVING_REDIRECTتنظیم شده است، استفاده کنید. برای مشاهده همه کتابخانههای کلاینت، به کتابخانههای کلاینت و کد نمونه مراجعه کنید.
بررسی کنید که آیا SDK تبلیغات رسانهای تعاملی (IMA) برای پلتفرم شما در دسترس است یا خیر. ما استفاده از IMA SDK را برای افزایش درآمد توصیه میکنیم. برای جزئیات بیشتر، به تنظیم IMA SDK برای DAI مراجعه کنید.
درخواست پخش جریانی بدهید
وقتی کاربر شما یک جریان را انتخاب میکند، موارد زیر را انجام دهید:
یک درخواست
POSTبه متد سرویس پخش زنده ارسال کنید. برای جزئیات بیشتر، به Method: stream مراجعه کنید.پارامترهای هدفگیری تبلیغات را در قالبهای
application/x-www-form-urlencodedیاapplication/jsonارسال کنید. این درخواست یک جلسه پخش جریانی را در Google DAI ثبت میکند.مثال زیر یک درخواست جریان ایجاد میکند:
کدگذاری فرم
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const params = new URLSearchParams({ cust_params: 'section=sports&page=golf,tennis' }).toString(); const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: params }); console.log(await response.json());رمزگذاری JSON
const url = `https://dai.google.com/ssai/pods/api/v1/` + `network/NETWORK_CODE/custom_asset/CUSTOM_ASSET_KEY/stream`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ cust_params: { section: 'sports', page: 'golf,tennis' } }) }); console.log(await response.json());در صورت موفقیت، خروجی مشابه زیر را مشاهده خواهید کرد:
{ "stream_id": "c4a5dad5-aaa8-4550-8acb-7cda3cdb21bb:DLS", "media_verification_url": "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/", "metadata_url": "https://dai.google.com/linear/pods/hls/.../metadata", "session_update_url": "https://dai.google.com/linear/.../session", "polling_frequency": 10 }در پاسخ JSON، شناسه جلسه جریان را پیدا کنید و سایر دادهها را برای مراحل بعدی ذخیره کنید.
فرادادههای تبلیغات نظرسنجی
برای نظرسنجی در مورد متادیتای تبلیغات، موارد زیر را انجام دهید:
مقدار
metadata_urlرا از پاسخ ثبت جریان (stream registration response) بخوانید.یک درخواست اولیه
GETبه نقطه پایانیmetadata_urlارسال کنید.- پارامتر کوئری
delta_tokenحذف کنید. این فرآیند به سرور اجازه میدهد تا فراداده کامل مربوط به پنجره ضبطکننده ویدیوی دیجیتال (DVR) مربوط به پخش زنده را برگرداند. پنجره DVR شامل بازه زمانی پخش موجود برای بیننده جهت عقب و جلو بردن و پخش مجدد است. پاسخ شامل یک فیلدnext_delta_tokenاست.
- پارامتر کوئری
برای بهینهسازی پهنای باند، مقدار
next_delta_tokenرا از جدیدترین پاسخ ذخیره کنید.در درخواست بعدی خود، آن مقدار را به عنوان پارامتر کوئری
delta_tokenارسال کنید. سرور فقط فرادادههایی را که از زمان تولید آن توکن تغییر کردهاند، برمیگرداند. همیشه آخرین توکنی را که دریافت کردهاید ارسال کنید. سعی نکنید توکن را تجزیه، اصلاح یا بسازید. برای جزئیات بیشتر، به Method: metadata مراجعه کنید.مثال زیر متادیتای تبلیغات را دریافت میکند:
// Initial request (returns full metadata and next_delta_token) let response = await fetch(metadata_url); let metadata = await response.json(); let deltaToken = metadata.next_delta_token; // Subsequent request (returns only changes since deltaToken) if (deltaToken) { const url = new URL(metadata_url); url.searchParams.append('delta_token', deltaToken); response = await fetch(url.toString()); const deltaMetadata = await response.json(); // Merge deltaMetadata into your local cache mergeMetadata(metadata, deltaMetadata); deltaToken = deltaMetadata.next_delta_token; }در صورت موفقیت، پاسخ PodMetadata را دریافت میکنید. اگر پارامتر
delta_tokenرا وارد کنید، پاسخ فقط شامل تبلیغات، وقفههای تبلیغاتی و برچسبهایی است که سرور از زمان تولید توکن توسط سرور اضافه یا بهروزرسانی کرده است. پاسخ همچنین حاوی مقدار جدیدnext_delta_tokenاست. اگر هرگونه وقفه تبلیغاتی قدیمی باشد، پاسخ شامل لیستobsolete_ad_break_idsاز وقفههای تبلیغاتی برای حذف از حافظه پنهان شما نیز میشود.{ "next_delta_token": "eyJyYW5nZXMiOlt7InMiOjEsImUiOjN9XX0", "obsolete_ad_break_ids": ["0003069407"], "tags":{ "google_1022389921":{ "ad":"0003069408_ad1", "ad_break_id":"0003069408", "type":"start" }, ... }, "ads":{ "0003069408_ad1":{ "ad_break_id":"0003069408", "position":1, "duration":10.01, "title":"External - Pod Midroll 1", "clickthrough_url":"https://.../", ... }, ... }, "ad_breaks":{ "0003069408":{ "type":"mid", "duration":30, "ads":3 }, ... } }شیء
tagsرا ذخیره کنید و بهروزرسانیها را در حافظه پنهان محلی خود ادغام کنید. اگر پارامترobsolete_ad_break_idsوجود دارد، آن وقفههای تبلیغاتی و تبلیغات و برچسبهای مرتبط را از حافظه پنهان خود حذف کنید.با استفاده از مقدار
polling_frequencyیک تایمر تنظیم کنید تا مرتباً فراداده درخواست شود. در هر نظرسنجی، مقدارnext_delta_tokenبرگردانده شده در جدیدترین پاسخ فراداده را به عنوان پارامتر پرس و جویdelta_tokenارسال کنید.
پخش جریانی را در پخشکننده ویدیوی خود بارگذاری کنید
بعد از اینکه شناسه جلسه را از پاسخ ثبت نام دریافت کردید، شناسه را به کنترلکننده مانیفست خود منتقل کنید، یا یک URL مانیفست برای بارگذاری جریان در یک پخشکننده ویدیو بسازید.
برای ارسال شناسه جلسه، به مستندات دستکاریکننده مانیفست خود مراجعه کنید. اگر یک دستکاریکننده مانیفست ایجاد میکنید، برای پخش زنده به Manifest manipulator مراجعه کنید.
مثال زیر یک URL مانیفست را مونتاژ میکند:
https://<your_manifest_manipulator_url>/manifest.m3u8?DAI_stream_ID=SESSION_ID&network_code=NETWORK_CODE&DAI_custom_asset_key=CUSTOM_ASSET_KEY"
وقتی پخشکننده شما آماده شد، پخش را شروع کنید.
به رویدادهای تبلیغاتی گوش دهید
قالب کانتینر جریان خود را برای ابرداده زمانبندیشده بررسی کنید:
جریانهای HLS با کانتینرهای Transport Stream (TS) از برچسبهای ID3 زمانبندیشده برای حمل فرادادههای زمانبندیشده استفاده میکنند. برای جزئیات بیشتر، به «درباره قالب برنامه رسانهای مشترک با HTTP Live Streaming (HLS)» مراجعه کنید.
جریانهای DASH از عناصر
EventStreamبرای مشخص کردن رویدادها در مانیفست استفاده میکنند.جریانهای DASH از عناصر
InbandEventStreamاستفاده میکنند، زمانی که بخشها حاوی کادرهای پیام رویداد (emsg) برای دادههای بار داده، از جمله برچسبهای ID3، باشند. برای جزئیات بیشتر، به InbandEventStream مراجعه کنید.جریانهای CMAF، شامل DASH و HLS، از جعبههای
emsgحاوی برچسبهای ID3 استفاده میکنند.
برای بازیابی تگهای ID3 از پخش زنده خود، به راهنمای پخشکننده ویدیوی خود مراجعه کنید. برای جزئیات بیشتر، به راهنمای مدیریت فرادادههای زمانبندیشده مراجعه کنید.
برای بازیابی شناسه رویداد تبلیغ از برچسبهای ID3، موارد زیر را انجام دهید:
- رویدادها را بر اساس
scheme_id_uriباurn:google:dai:2018یاhttps://aomedia.org/emsg/ID3فیلتر کنید. آرایه بایت را از فیلد
message_dataاستخراج کن.مثال زیر دادههای
emsgرا به JSON رمزگشایی میکند:{ "scheme_id_uri": "https://developer.apple.com/streaming/emsg-id3", "presentation_time": 27554, "timescale": 1000, "message_data": "ID3TXXXgoogle_1022389921", ... }تگهای ID3 را با فرمت
TXXXgoogle_{ad_event_ID}فیلتر کنید:TXXXgoogle_1022389921
نمایش دادههای رویداد تبلیغ
برای یافتن شیء TagSegment ، مراحل زیر را انجام دهید:
شیء
tagsمربوط به متادیتای تبلیغات را از متادیتای تبلیغات Poll بازیابی کنید. شیءtagsآرایهای از اشیاءTagSegmentاست.از شناسه کامل رویداد تبلیغ برای یافتن یک شیء
TagSegmentبا نوعprogressاستفاده کنید.از ۱۷ کاراکتر اول شناسه رویداد تبلیغ برای یافتن یک شیء
TagSegmentاز انواع دیگر استفاده کنید.از آنجا که برنامهی کلاینت شما به صورت دورهای فرادادههای تبلیغاتی را جمعآوری میکند، ممکن است بین زمانی که پخشکنندهی ویدیوی شما با یک برچسب ID3 در جریان مواجه میشود و زمانی که فرادادهی مرتبط در دسترس قرار میگیرد، تأخیری رخ دهد. اگر برنامهی کلاینت شما برچسب ID3 را در برچسبهای ذخیرهشده پیدا نکرد، برچسب را در صف نگه دارید و پس از جمعآوری فرادادهی بعدی، برچسب را دوباره پردازش کنید. برچسب را تا زمان اتمام پردازش در صف نگه دارید.
بعد از اینکه
TagSegmentایجاد کردید، از ویژگیad_break_idبه عنوان کلید برای یافتن شیءAdBreakدر متادیتای تبلیغad_breaksاستفاده کنید.مثال زیر یک شیء
AdBreakرا پیدا میکند:{ "type":"mid", "duration":15, "ads":1 }از دادههای
TagSegmentوAdBreakبرای نمایش اطلاعات مربوط به موقعیت تبلیغ در متن تبلیغ استفاده کنید. برای مثال،Ad 1 of 3.
ارسال پینگهای تأیید رسانه
برای هر رویداد تبلیغاتی، به جز نوع progress ، یک پینگ تأیید رسانه ارسال کنید. Google DAI رویدادهای progress نادیده میگیرد و ارسال مکرر این رویدادها ممکن است بر عملکرد برنامه شما تأثیر بگذارد.
برای تولید URL تأیید رسانه کامل یک رویداد تبلیغاتی، موارد زیر را انجام دهید:
از پاسخ جریان، شناسه کامل رویداد تبلیغ را به مقدار
media_verification_urlاضافه کنید.یک درخواست
GETبا URL کامل ارسال کنید:// media_verification_url: "https://dai.google.com/view/.../event/c14aZDWtQg-ZwQaEGl6bYA/media/" const completeUrl = `${media_verification_url}google_1022389921`; const response = await fetch(completeUrl);در صورت موفقیت، کد وضعیت
202دریافت میکنید. در غیر این صورت، کد خطای404دریافت خواهید کرد.
شما میتوانید از ابزار نظارت بر فعالیت پخش زنده (SAM) برای بررسی گزارش تاریخچهی تمام رویدادهای تبلیغاتی استفاده کنید. برای جزئیات بیشتر، به بخش نظارت و عیبیابی پخش زنده مراجعه کنید.