راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI، راه اندازی IMA SDK برای DAI

پلتفرم مورد نظر را انتخاب کنید: HTML5 اندروید iOS tvOS Cast Roku

راهکار 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 شما برای بازیابی این پارامترها با یک درخواست سمت سرور از آن استفاده کند.
میدان فهرست مطالب
daiStreamType نوع پخش زنده DAI شما. یکی از حالت‌های "LIVE" یا "VOD"

DAI_STREAM_TYPE

networkCode کد شبکه برای حساب Google Ad Manager 360 شما.

NETWORK_CODE

customAssetKey این فیلد فقط برای پخش زنده مورد نیاز است. کلید دارایی سفارشی که رویداد Pod Serving شما را در Google Ad Manager 360 مشخص می‌کند.

CUSTOM_ASSET_KEY

apiKey یک کلید API اختیاری برای بازیابی شناسه جریان از IMA DAI SDK.

API_KEY

در اینجا چند نمونه کد برای کمک به شما در شروع کار آورده شده است:

وب

برای پیکربندی این مقادیر در یک فرستنده وب 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() را فراخوانی کنید.