راه حل DAI مورد علاقه خود را انتخاب کنید
سرو پاد DAI
IMA SDK ادغام تبلیغات چندرسانه ای را در وب سایت ها و برنامه های شما ساده می کند.
IMA SDK میتواند از هر سرور تبلیغاتی سازگار با VAST آگهی درخواست کند و پخش آگهی را در برنامههای شما مدیریت کند.
با IMA DAI SDK، برنامهها درخواست پخش جریانی برای آگهی و ویدیوی محتوا برای محتوای VOD یا محتوای زنده ارائه میکنند. سپس SDK یک جریان ویدیوی ترکیبی را برمیگرداند، به طوری که نیازی به مدیریت جابجایی بین آگهی و ویدیوی محتوا در برنامه خود ندارید.
این راهنما نحوه پخش جریان DAI Pod Serving را با استفاده از IMA DAI SDK برای CAF نشان میدهد.
قبل از استفاده از این راهنما، با پروتکل گیرنده وب Chromecast Application Framework آشنا شوید. این راهنما درک پایه ای از مفاهیم گیرنده CAF، مانند رهگیرهای پیام و اشیاء اطلاعات رسانه ، و آشنایی با استفاده از ابزار فرمان و کنترل Cast ، برای تقلید از فرستنده CAF را فرض می کند.
برای استفاده از IMA DAI Pod Serving، باید با یک شریک Pod Serving کار کنید و باید یک حساب Ad Manager 360 Advanced داشته باشید. اگر حساب Ad Manager دارید، برای جزئیات بیشتر با مدیر حساب خود تماس بگیرید. برای کسب اطلاعات در مورد ثبت نام در Ad Manager، از مرکز راهنمای Ad Manager دیدن کنید.
برای کسب اطلاعات در مورد ادغام با سایر پلتفرمها یا استفاده از کیت توسعه نرمافزارهای سمت سرویس گیرنده IMA، به کیتهای توسعه نرمافزار تبلیغات رسانهای تعاملی مراجعه کنید.
نمای کلی سرویس IMA DAI Pod
اجرای Pod Serving با استفاده از IMA CAF DAI SDK شامل دو جزء اصلی است که در این راهنما نشان داده شده است:
-
StreamRequest
: شیئی که یک درخواست جریان را به سرورهای تبلیغاتی Google تعریف می کند. درخواست ها یک کد شبکه، کلید دارایی سفارشی و یک کلید API اختیاری و همچنین سایر پارامترهای اختیاری را مشخص می کنند. -
StreamManager
: شیای که ارتباط بین جریان ویدئو و IMA DAI SDK را کنترل میکند، مانند شلیک پینگهای ردیابی و ارسال رویدادهای جریان به ناشر.
پیش نیازها
- یک حساب Cast Developer Console با دستگاههای آزمایشی ثبتشده.
- یک برنامه گیرنده وب میزبانی شده که در Cast Developer Console شما ثبت شده است و می توان آن را برای میزبانی کد ارائه شده توسط این راهنما تغییر داد.
- یک برنامه ارسال که برای استفاده از برنامه گیرنده وب شما پیکربندی شده است. برای اهداف این مثال، از ابزار Cast Command and Control به عنوان فرستنده خود استفاده کنید.
اشیاء MediaInfo فرستنده را پیکربندی کنید
ابتدا، شی MediaInfo
برنامه فرستنده خود را طوری پیکربندی کنید که شامل فیلدهای زیر باشد:
میدان | مطالب | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
contentId | یک شناسه منحصر به فرد برای این آیتم رسانه ای. CONTENT_ID | ||||||||||
contentUrl | اختیاری. از URL جریان پشتیبان تهیه کنید تا اگر جریان DAI بارگیری نشد، پخش شود. BACKUP_STREAM_URL | ||||||||||
contentType | اختیاری. نوع Mimet از جریان های پشتیبان محتوا. فقط برای جریان های DASH مورد نیاز است. CONTENT_STREAM_MIMETYPE | ||||||||||
streamType | رشته یا ثابت مورد استفاده برای این مقدار بر اساس پلت فرم فرستنده متفاوت است. | ||||||||||
customData | فیلد customData حاوی یک ذخیره کلید-مقدار از فیلدهای اضافی مورد نیاز است. در این نمونه، شامل پارامترهای جریان DAI شما است. در یک برنامه تولیدی میتوانید در عوض شناسهای را ارسال کنید که برنامه گیرنده بازیگری شما از آن برای بازیابی این پارامترها با درخواست سمت سرور استفاده میکند.
|
در اینجا چند نمونه کد برای کمک به شروع کار آورده شده است:
وب
برای پیکربندی این مقادیر در فرستنده وب Cast، ابتدا یک شی MediaInfo
با داده های مورد نیاز ایجاد کنید، سپس یک درخواست بارگذاری به گیرنده وب ارائه دهید.
// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
daiStreamType: "DAI_STREAM_TYPE",
networkCode: "NETWORK-CODE",
customAssetKey: "CUSTOM_ASSET_KEY",
apiKey: "API_KEY"
};
// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
() => { console.log('Load succeed'); },
(errorCode) => { console.log('Error code: ' + errorCode); });
اندروید
برای پیکربندی این مقادیر در فرستنده وب Cast، ابتدا یک شی MediaInfo با داده های مورد نیاز ایجاد کنید، سپس یک درخواست بارگذاری به گیرنده وب ارائه دهید.
JSONObject customData = new JSONObject()?
.put("daiStreamType", "DAI_STREAM_TYPE")
.put("networkCode", "NETWORK-CODE")
.put("customAssetKey", "CUSTOM_ASSET_KEY")
.put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
.setContentUrl("BACKUP_STREAM_URL")
.setContentType("CONTENT_STREAM_MIMETYPE")
.setStreamType(MediaInfo.STREAM_TYPE_LIVE)
.setCustomData(customData)
.build();
RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());
iOS (Obj-C)
برای پیکربندی این مقادیر در فرستنده وب Cast، ابتدا یک شیء GCKMediaInformation
با داده های مورد نیاز ایجاد کنید، سپس یک درخواست بارگذاری به گیرنده وب ارائه دهید.
NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
@"daiStreamType": @"DAI_STREAM_TYPE",
@"networkCode": @"NETWORK-CODE",
@"customAssetKey": @"CUSTOM_ASSET_KEY",
@"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;
GCKMediaInformationBuilder *mediaInfoBuilder =
[[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];
GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
request.delegate = self;
}
iOS (Swift)
برای پیکربندی این مقادیر در فرستنده وب Cast، ابتدا یک شیء GCKMediaInformation
با داده های مورد نیاز ایجاد کنید، سپس یک درخواست بارگذاری به گیرنده وب ارائه دهید.
let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
print("invalid mediaURL")
return
}
let customData = [
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"region": "API_KEY"
]
let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()
guard let mediaInfo = mediaInformation else {
print("invalid mediaInformation")
return
}
if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
request.delegate = self
}
ابزار CAC
برای پیکربندی این مقادیر در ابزار Cast Command and Control ، روی تب Load Media کلیک کنید و نوع درخواست بار سفارشی را روی LOAD تنظیم کنید. سپس داده های JSON را در قسمت متن با این JSON جایگزین کنید:
{
"media": {
"contentId": "CONTENT_ID",
"contentUrl": "BACKUP_STREAM_URL",
"contentType": ""CONTENT_STREAM_MIMETYPE"",
"streamType": "LIVE",
"customData": {
"daiStreamType": "DAI_STREAM_TYPE",
"networkCode": "NETWORK-CODE",
"customAssetKey": "CUSTOM_ASSET_KEY",
"oAuthToken": "API_KEY"
}
}
}
این درخواست بارگذاری سفارشی می تواند به گیرنده ارسال شود تا بقیه مراحل را آزمایش کند.
یک گیرنده اصلی CAF ایجاد کنید
همانطور که در راهنمای گیرنده وب سفارشی CAF SDK مشاهده می شود، یک گیرنده وب سفارشی ایجاد کنید.
کد گیرنده شما باید به شکل زیر باشد:
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
</script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
// ...
</script>
</body>
</html>
IMA DAI SDK را وارد کنید و Player Manager را دریافت کنید
یک برچسب اسکریپت برای وارد کردن IMA DAI SDK برای CAF به گیرنده وب خود، درست پس از بارگیری اسکریپت CAF اضافه کنید. در تگ اسکریپت، پیش از شروع گیرنده، زمینه گیرنده و مدیر پخش را به صورت ثابت ذخیره کنید.
<html>
<head>
<script
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
castContext.start();
</script>
</body>
</html>
IMA Stream Manager را راه اندازی کنید
IMA Stream Manager را راه اندازی کنید.
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
castContext.start();
</script>
</body>
</html>
رهگیر بار مدیریت جریان را ایجاد کنید
قبل از اینکه آیتم های رسانه ای شما به CAF منتقل شوند، درخواست پخش خود را در یک رهگیر پیام LOAD ایجاد کنید.
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
/**
* Creates a livestream request object for a Pod Serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => { /* ... */};
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// ...
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, createDAICastRequest);
castContext.start();
درخواست جریان را ایجاد کنید
تابع createStreamRequest
را برای ایجاد یک جریان Pod Serving بر اساس درخواست بارگذاری CAF تکمیل کنید.
/**
* Creates a livestream request object for a Pod Serving stream.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {StreamRequest} an IMA stream request
*/
const createStreamRequest = (castRequest) => {
const customData = castRequest.media.customData;
let streamRequest;
if (customData.daiStreamType == "LIVE") {
streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
streamRequest.customAssetKey = customData.customAssetKey;
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
} else if (customData.daiStreamType == "VOD") {
streamRequest = new google.ima.cast.dai.api.PodVodStreamRequest();
streamRequest.networkCode = customData.networkCode;
streamRequest.apiKey = customData.apiKey;
}
return streamRequest;
};
مانیفست دوخته شده را از VTP خود بازیابی کنید
اگر درخواست پخش شما موفقیت آمیز بود، از streamManager.getStreamId()
برای بازیابی شناسه جریان استفاده کنید. شریک فنی ویدیویی (VTP) یا دستکاری کننده مانیفست سفارشی شما دستورالعمل هایی را برای بازیابی URL مانیفست با استفاده از این شناسه جریان ارائه می دهد.
هنگامی که URL مانیفست خود را بازیابی کردید، contentUrl
موجود را با manifestUrl
جدید جایگزین کنید.
در نهایت، قبل از بازگرداندن مانیفست جریان اصلاح شده، متد loadStreamMetadata
را در streamManager
خود فراخوانی کنید تا به IMA SDK اطلاع دهید که می تواند با خیال راحت فراداده جریان را درخواست کند. این تماس فقط برای جریان های VOD ضروری است.
/**
* Initates a DAI stream request for the final stream manifest.
* @param {!LoadRequestData} castRequest The request object from the cast sender
* @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
*/
const createDAICastRequest = (castRequest) => {
return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
.then((castRequestWithPodStreamData) => {
console.log('Successfully made DAI stream request.');
// This is a sample VTP integration. Consult your VTP documentation
// for how to retrieve an ad-stitched stream manifest URL.
const manifestTemplate = "https://.../manifest.m3u8?gam_stream_id=[[STREAMID]]";
const streamId = streamManager.getStreamId();
const manifestUrl = manifestTemplate.replace('[[STREAMID]]', streamId)
// Assign your manifestUrl to the request's content URL.
castRequestWithPodStreamData.media.contentUrl = manifestUrl;
// After generating the manifest URL, VOD streams must notify the
// IMA SDK that it is safe to request ad pod metadata.
// This is only necessary for VOD streams. It is a no-op for
// livestreams, so no conditional is needed.
streamManager.loadStreamMetadata();
return castRequestWithPodStreamData;
})
.catch((error) => {
console.log('Failed to make DAI stream request.');
// CAF will automatically fallback to the content URL
// that it can read from the castRequest object.
return castRequest;
});
};
دارایی های IMA DAI را پاکسازی کنید
هنگامی که با موفقیت درخواست و نمایش تبلیغات در جریان سرویس Pod با IMA DAI SDK را به پایان رساندید، پیشنهاد می کنیم پس از اتمام جلسه سرویس پاد، همه منابع را پاکسازی کنید. با StreamManager.destroy()
تماس بگیرید تا پخش جریانی را متوقف کنید، همه ردیابی تبلیغات را متوقف کنید و همه دارایی های جریان بارگیری شده را آزاد کنید.