با IMA DAI SDK شروع کنید

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

DAI_STREAM_TYPE

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

NETWORK_CODE

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

CUSTOM_ASSET_KEY

apiKey یک کلید API اختیاری برای بازیابی Stream ID از 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());

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;
          });
    };

اکنون می‌توانید با Cast Application Framework و IMA DAI SDK برای CAF، استریم‌های Pod Serving را درخواست و پخش کنید.