راهکار DAI مورد نظرتان را انتخاب کنید
غلاف سروینگ دای
کیتهای توسعه نرمافزار IMA، ادغام تبلیغات چندرسانهای را در وبسایتها و برنامههای شما ساده میکنند.
کیتهای توسعه نرمافزار IMA میتوانند از هر سرور تبلیغاتی سازگار با VAST درخواست تبلیغات کنند و پخش تبلیغات را در برنامههای شما مدیریت کنند.
با استفاده از کیتهای توسعه نرمافزار IMA DAI، برنامهها درخواست پخش ویدئوی تبلیغاتی و محتوایی را برای VOD یا محتوای زنده ارسال میکنند. سپس SDK یک جریان ویدئویی ترکیبی را برمیگرداند، به طوری که شما مجبور نیستید جابجایی بین ویدئوی تبلیغاتی و محتوایی را در برنامه خود مدیریت کنید.
این راهنما نحوه پخش استریم DAI Pod Serving را با استفاده از IMA DAI SDK برای CAF نشان میدهد.
قبل از استفاده از این راهنما، با پروتکل گیرنده وب چارچوب برنامه Chromecast آشنا شوید. این راهنما فرض را بر درک اولیه از مفاهیم گیرنده CAF، مانند رهگیرهای پیام و اشیاء mediaInformation ، و آشنایی با استفاده از ابزار Cast Command and Control برای شبیهسازی یک فرستنده CAF میگذارد.
برای استفاده از IMA DAI Pod Serving، باید با یک شریک Pod Serving همکاری کنید و یک حساب Ad Manager 360 Advanced داشته باشید. اگر حساب Ad Manager دارید، برای اطلاعات بیشتر با مدیر حساب خود تماس بگیرید. برای کسب اطلاعات در مورد ثبت نام در Ad Manager، به مرکز راهنمایی Ad Manager مراجعه کنید.
برای اطلاعات بیشتر در مورد ادغام با سایر پلتفرمها یا استفاده از SDK های سمت کلاینت IMA، به بخش SDK های تبلیغات رسانهای تعاملی مراجعه کنید.
نمای کلی سرویس غلاف IMA DAI
پیادهسازی سرویس پاد با استفاده از IMA CAF DAI SDK شامل دو جزء اصلی است که در این راهنما نشان داده شده است:
-
StreamRequest: شیءای که یک درخواست استریم به سرورهای تبلیغاتی گوگل را تعریف میکند. درخواستها یک کد شبکه، کلید دارایی سفارشی و یک کلید API اختیاری و همچنین سایر پارامترهای اختیاری را مشخص میکنند. -
StreamManager: شیءای که ارتباط بین جریان ویدئو و IMA DAI SDK را مدیریت میکند، مانند اجرای پینگهای ردیابی و ارسال رویدادهای جریان به ناشر.
پیشنیازها
- یک حساب کنسول توسعهدهنده Cast با دستگاههای آزمایشی ثبتشده.
- یک برنامه گیرنده وب میزبانی شده که در کنسول توسعهدهنده Cast شما ثبت شده است و میتواند برای میزبانی کد ارائه شده توسط این راهنما اصلاح شود.
- یک برنامه ارسال که برای استفاده از برنامه گیرنده وب شما پیکربندی شده است. برای اهداف این مثال، از ابزار Cast Command and Control به عنوان فرستنده خود استفاده کنید.
پیکربندی اشیاء MediaInfo فرستنده
ابتدا، شیء MediaInfo برنامه فرستنده خود را طوری پیکربندی کنید که فیلدهای زیر را شامل شود:
| میدان | فهرست مطالب | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
contentId | یک شناسه منحصر به فرد برای این مورد رسانهای. CONTENT_ID | ||||||||||
contentUrl | اختیاری. آدرس اینترنتی پخش پشتیبان برای پخش در صورت عدم بارگیری پخش DAI. BACKUP_STREAM_URL | ||||||||||
contentType | اختیاری. نوع مایم استریمهای پشتیبان محتوا. فقط برای استریمهای DASH مورد نیاز است. CONTENT_STREAM_MIMETYPE | ||||||||||
streamType | رشتهی تحتاللفظی یا ثابتی که برای این مقدار استفاده میشود، بسته به پلتفرم فرستنده متفاوت است. | ||||||||||
customData | فیلد customData شامل یک مخزن کلید-مقدار از فیلدهای مورد نیاز اضافی است. در این نمونه، این فیلد شامل پارامترهای جریان DAI شما است. در یک برنامه کاربردی، میتوانید به جای آن، یک شناسه ارسال کنید که برنامه گیرنده cast شما برای بازیابی این پارامترها با یک درخواست سمت سرور از آن استفاده کند.
|
در اینجا چند نمونه کد برای کمک به شما در شروع کار آورده شده است:
وب
برای پیکربندی این مقادیر در یک فرستنده وب 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());
آیاواس (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;
}
آیاواس (سوئیفت)
برای پیکربندی این مقادیر در یک فرستنده وب 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 را دریافت کنید.
درست پس از بارگذاری اسکریپت CAF، یک تگ اسکریپت برای وارد کردن IMA DAI SDK برای 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
مدیر جریان IMA را مقداردهی اولیه کنید.
<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 مانیفست، با استفاده از این شناسه پخش زنده، ارائه میدهد.
پس از بازیابی آدرس مانیفست خود، 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 Serving با IMA DAI SDK را با موفقیت به پایان رساندید، پیشنهاد میکنیم پس از اتمام جلسه Pod Serving، هرگونه منبعی را پاک کنید. برای متوقف کردن پخش جریان، متوقف کردن تمام ردیابی تبلیغات و آزاد کردن تمام داراییهای جریان بارگذاری شده، StreamManager.destroy() را فراخوانی کنید.