Pod পরিষেবা DAI-এর মাধ্যমে সেট-আপ করা

প্ল্যাটফর্ম বেছে নিন: HTML5 Android iOS tvOS Cast Roku

IMA SDK আপনার ওয়েবসাইট ও অ্যাপে মাল্টিমিডিয়া বিজ্ঞাপন ইন্টিগ্রেট করার প্রসেসকে সহজ করে তোলে।

IMA SDK যেকোনও VAST-মেনে চলে এমন বিজ্ঞাপন সার্ভার থেকে বিজ্ঞাপনের অনুরোধ করতে এবং আপনার অ্যাপে বিজ্ঞাপন প্লেব্যাক ম্যানেজ করতে পারে।

IMA DAI SDK-এর মাধ্যমে, অ্যাপ, VOD বা লাইভ কন্টেন্টের জন্য বিজ্ঞাপন ও কন্টেন্ট ভিডিওর স্ট্রিম অনুরোধ করে। SDK তখন একটি সম্মিলিত ভিডিও স্ট্রিম ফেরত দেয়, যাতে আপনাকে অ্যাপের মধ্যে বিজ্ঞাপন এবং কন্টেন্ট ভিডিওর মধ্যে স্যুইচ করা ম্যানেজ করতে না হয়।

CAF-এর জন্য IMA DAI SDK ব্যবহার করে কীভাবে DAI পড পরিবেশন স্ট্রিম চালাতে হয় তা এই গাইডে দেখানো হয়েছে।

এই নির্দেশিকা ব্যবহার করার আগে, Chromecast অ্যাপ্লিকেশন ফ্রেমওয়ার্কের ওয়েব রিসিভার প্রোটোকল সম্পর্কে জেনে নিন। এই নির্দেশিকা ধরে নেয় যে CAF রিসিভার কনসেপ্ট সম্পর্কে আপনার প্রাথমিক ধারণা আছে, যেমন মেসেজ ইন্টারসেপ্টর এবং mediaInformation অবজেক্ট এবং CAF প্রেরক অনুকরণ করার জন্য Cast Command and Control টুল ব্যবহার করার সাথে পরিচিতি।

IMA DAI পড পরিবেশন ব্যবহার করতে, আপনাকে অবশ্যই একজন পড পরিবেশন পার্টনারের সাথে কাজ করতে হবে এবং আপনার একটি Ad Manager 360 Advanced অ্যাকাউন্ট থাকতে হবে। আপনার Ad Manager অ্যাকাউন্ট থাকলে, আরও বিস্তারিত বিবরণের জন্য আপনার অ্যাকাউন্ট ম্যানেজারের সাথে যোগাযোগ করুন। Ad Manager-এ সাইন-আপ করার ব্যাপারে আরও তথ্য পেতে, Ad Manager সহায়তা কেন্দ্র দেখুন।

অন্যান্য প্ল্যাটফর্মের সাথে ইন্টিগ্রেট করা বা IMA ক্লায়েন্ট-সাইড SDK ব্যবহার করার ব্যাপারে আরও তথ্য পেতে, Interactive Media Ads SDK দেখুন।

IMA DAI পড পরিবেশন সংক্রান্ত ওভারভিউ

IMA CAF DAI SDK ব্যবহার করে পড পরিবেশন করার ক্ষেত্রে দুটি প্রধান কম্পোনেন্ট রয়েছে, যা এই গাইডে দেখানো হয়েছে:

  • StreamRequest: Google-এর বিজ্ঞাপন সার্ভারে স্ট্রিম অনুরোধের সংজ্ঞা নির্ধারণ করে এমন অবজেক্ট। অনুরোধে নেটওয়ার্ক কোড, কাস্টম অ্যাসেট কী এবং ঐচ্ছিক API কী উল্লেখ করা থাকে, এর সাথে অন্যান্য ঐচ্ছিক প্যারামিটারও থাকে।
  • StreamManager: এমন একটি অবজেক্ট যা ভিডিও স্ট্রিম ও IMA DAI SDK-এর মধ্যে যোগাযোগ পরিচালনা করে, যেমন ট্র্যাকিং পিং ফায়ার করা এবং প্রকাশকের কাছে স্ট্রিম ইভেন্ট ফরওয়ার্ড করা।

পূর্বশর্ত

  • রেজিস্টার করা টেস্ট ডিভাইস সহ Cast Developer Console অ্যাকাউন্ট।
  • হোস্ট করা ওয়েব রিসিভার অ্যাপ যা আপনার Cast Developer Console-এ রেজিস্টার করা আছে এবং এই গাইডে দেওয়া কোড হোস্ট করার জন্য যা পরিবর্তন করা যেতে পারে।
  • একটি প্রেরক অ্যাপ যা আপনার ওয়েব রিসিভার অ্যাপ ব্যবহার করার জন্য কনফিগার করা হয়েছে। এই উদাহরণের উদ্দেশ্যে, আপনার প্রেরক হিসাবে Cast Command and Control tool ব্যবহার করুন।

প্রেরকের MediaInfo অবজেক্ট কনফিগার করুন

প্রথমে, আপনার প্রেরক অ্যাপের MediaInfo অবজেক্ট কনফিগার করুন যাতে নিম্নলিখিত ফিল্ডগুলি অন্তর্ভুক্ত থাকে:

ফিল্ড কন্টেন্ট
contentId এই মিডিয়া আইটেমের জন্য অনন্য শনাক্তকারী।

CONTENT_ID

contentUrl ঐচ্ছিক। DAI স্ট্রিম লোড না হলে ব্যাক-আপ স্ট্রিম URL চালানো হবে।

BACKUP_STREAM_URL

contentType ঐচ্ছিক। কন্টেন্ট ব্যাক-আপ স্ট্রিমের MIME-এর ধরন। শুধুমাত্র DASH স্ট্রিমের জন্য প্রয়োজন।

CONTENT_STREAM_MIMETYPE

streamType এই ভ্যালুর জন্য ব্যবহৃত স্ট্রিং লিটারেল বা কনস্ট্যান্ট প্রেরকের প্ল্যাটফর্ম অনুযায়ী আলাদা হয়।
customData customData ফিল্ডে অতিরিক্ত প্রয়োজনীয় ফিল্ডের কী-ভ্যালু স্টোর থাকে। এই স্যাম্পেলে আপনার DAI স্ট্রিম প্যারামিটার রয়েছে। প্রোডাকশন অ্যাপে আপনি এর পরিবর্তে একটি শনাক্তকারী পাস করতে পারেন যা আপনার কাস্ট রিসিভার অ্যাপ সার্ভার-সাইড অনুরোধের মাধ্যমে এইসব প্যারামিটার ফিরিয়ে আনতে ব্যবহার করবে।
ফিল্ড কন্টেন্ট
daiStreamType আপনার DAI স্ট্রিমের ধরন। "LIVE" বা "VOD"-এর মধ্যে যেকোনও একটি

DAI_STREAM_TYPE

networkCode আপনার Google Ad Manager 360 অ্যাকাউন্টের নেটওয়ার্ক কোড।

NETWORK_CODE

customAssetKey এই ফিল্ডটি শুধুমাত্র লাইভ স্ট্রিমের জন্য প্রয়োজন। কাস্টম অ্যাসেট কী যা Google Ad Manager 360-তে আপনার পড সার্ভিং ইভেন্ট শনাক্ত করে।

CUSTOM_ASSET_KEY

apiKey IMA DAI SDK থেকে স্ট্রিম আইডি ফিরিয়ে আনার জন্য একটি ঐচ্ছিক API কী।

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

Android

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 ইমপোর্ট করুন এবং প্লেয়ার ম্যানেজার পান

CAF লোড করার স্ক্রিপ্টের ঠিক পরে, আপনার ওয়েব রিসিভারে CAF-এর জন্য IMA DAI SDK ইমপোর্ট করতে একটি স্ক্রিপ্ট ট্যাগ যোগ করুন। স্ক্রিপ্ট ট্যাগে, রিসিভার শুরু করার আগে রিসিভার কনটেক্সট এবং প্লেয়ার ম্যানেজারকে কনস্ট্যান্ট হিসেবে স্টোর করুন।

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

স্ট্রিম সংক্রান্ত অনুরোধ তৈরি করুন

CAF লোড অনুরোধের উপর ভিত্তি করে পড সার্ভিং স্ট্রিম তৈরি করতে createStreamRequest ফাংশন সম্পূর্ণ করুন।

    /**
     * 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 দিয়ে পরিবর্তন করুন।

সবশেষে, পরিবর্তিত স্ট্রিম ম্যানিফেস্ট ফিরিয়ে দেওয়ার আগে, streamManager-এ loadStreamMetadata মেথড কল করুন যাতে 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 অ্যাসেট ক্লিন-আপ করা

IMA DAI SDK-এর মাধ্যমে পড সার্ভিং স্ট্রিমে বিজ্ঞাপন অনুরোধ ও দেখানোর কাজ সম্পূর্ণ করার পরে, পড সার্ভিং সেশন শেষ হয়ে গেলে আমরা আপনাকে সব রিসোর্স মুছে দিতে সাজেস্ট করি। স্ট্রিম প্লেব্যাক বন্ধ করতে, সব বিজ্ঞাপন ট্র্যাকিং বন্ধ করতে এবং লোড করা সব স্ট্রিম অ্যাসেট রিলিজ করতে StreamManager.destroy() কল করুন।