अपने कस्टम वेब रिसीवर में मुख्य सुविधाएं जोड़ें

इस पेज में कोड स्निपेट और कस्टम वेब रिसीवर ऐप्लिकेशन के लिए उपलब्ध सुविधाओं की जानकारी दी गई है.

  1. cast-media-player एलिमेंट, जो वेब रिसीवर के साथ दिया गया, पहले से मौजूद प्लेयर का यूज़र इंटरफ़ेस (यूआई) दिखाता है.
  2. cast-media-player एलिमेंट के लिए पसंद के मुताबिक सीएसएस जैसी स्टाइलिंग, ताकि background-image, splash-image, और font-family जैसे अलग-अलग यूज़र इंटरफ़ेस (यूआई) एलिमेंट को स्टाइल किया जा सके.
  3. वेब रिसीवर फ़्रेमवर्क को लोड करने के लिए स्क्रिप्ट एलिमेंट.
  4. मैसेज और इवेंट हैंडल करने में रुकावट डालने वाला JavaScript कोड.
  5. वीडियो अपने-आप चलने के लिए सूची.
  6. प्लेबैक कॉन्फ़िगर करने के विकल्प.
  7. वेब रिसीवर का संदर्भ सेट करने के विकल्प.
  8. वेब रिसीवर ऐप्लिकेशन के साथ काम करने वाले निर्देशों को सेट करने के विकल्प.
  9. वेब पाने वाले ऐप्लिकेशन को शुरू करने के लिए JavaScript कॉल.

ऐप्लिकेशन को कॉन्फ़िगर करने और विकल्प

ऐप्लिकेशन कॉन्फ़िगर करें

CastReceiverContext सबसे बाहरी क्लास है, जिसे डेवलपर ऐक्सेस नहीं करता है. यह मौजूदा लाइब्रेरी के लोड होने को मैनेज करता है और वेब पाने वाले SDK टूल के शुरू होने को हैंडल करता है. SDK टूल, ऐसे एपीआई उपलब्ध कराता है जिनकी मदद से ऐप्लिकेशन डेवलपर, CastReceiverOptions की मदद से SDK टूल को कॉन्फ़िगर कर सकते हैं. start को किए गए कॉल में वैकल्पिक पैरामीटर सेट करते समय, हर ऐप्लिकेशन के लॉन्च के लिए इन कॉन्फ़िगरेशन का आकलन एक बार किया जाता है. साथ ही, इन्हें SDK टूल को पास कर दिया जाता है.

नीचे दिए गए उदाहरण में यह पता लगाने के लिए डिफ़ॉल्ट व्यवहार को बदलने का तरीका बताया गया है कि क्या कोई भेजने वाला कनेक्शन अब भी सक्रिय रूप से जुड़ा हुआ है. जब वेब पाने वाला, मैसेज भेजने वाले व्यक्ति से maxInactivity सेकंड तक कम्यूनिकेट नहीं कर पाता है, तो एक SENDER_DISCONNECTED इवेंट भेजा जाता है. नीचे दिया गया कॉन्फ़िगरेशन इस टाइम आउट को बदल देता है. यह समस्याओं को डीबग करते समय मददगार हो सकता है. यह IDLE स्थिति में कनेक्ट किए गए कोई भी भेजने वाले नहीं होने पर, वेब पाने वाले ऐप्लिकेशन को Chrome रिमोट डीबगर सेशन बंद करने से रोकता है.

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

प्लेयर कॉन्फ़िगर करें

कॉन्टेंट लोड करते समय, वेब रिसीवर SDK टूल cast.framework.PlaybackConfig का इस्तेमाल करके, प्लेबैक वैरिएबल कॉन्फ़िगर करने का तरीका मुहैया कराता है. जैसे, डीआरएम की जानकारी, कॉन्फ़िगरेशन की फिर से कोशिश करें, और हैंडलर का अनुरोध करें. इस जानकारी को PlayerManager मैनेज करता है और खिलाड़ी बनाते समय इसका आकलन किया जाता है. जब भी Web रिसीवर SDK टूल को नया लोड भेजा जाता है, तब प्लेयर बन जाते हैं. प्लेयर बनने के बाद, PlaybackConfig में किए गए बदलावों का आकलन अगले कॉन्टेंट लोड में किया जाता है. PlaybackConfig में बदलाव करने के लिए, SDK टूल ये तरीके उपलब्ध कराता है.

  • CastReceiverContext को शुरू करते समय, डिफ़ॉल्ट कॉन्फ़िगरेशन के विकल्पों को बदलने के लिए, CastReceiverOptions.playbackConfig का इस्तेमाल करें.
  • PlayerManager.getPlaybackConfig() मौजूदा कॉन्फ़िगरेशन पाने के लिए.
  • PlayerManager.setPlaybackConfig() का इस्तेमाल करें. यह सेटिंग, पेज के सभी लोड पर या तब तक लागू रहती है, जब तक कि इसे फिर से लोड नहीं किया जाता.
  • PlayerManager.setMediaPlaybackInfoHandler() का इस्तेमाल करके, सिर्फ़ मौजूदा कॉन्फ़िगरेशन में सबसे ऊपर लोड किए जा रहे मीडिया आइटम के लिए, अतिरिक्त कॉन्फ़िगरेशन लागू किए जा सकते हैं. हैंडलर को प्लेयर बनाने से ठीक पहले कॉल किया जाता है. यहां किए गए बदलाव हमेशा के लिए नहीं होते हैं. साथ ही, इन्हें getPlaybackConfig() की क्वेरी में शामिल नहीं किया जाता है. जब अगला मीडिया आइटम लोड होता है, तो इस हैंडलर को फिर से कॉल किया जाता है.

नीचे दिए गए उदाहरण में, CastReceiverContext को शुरू करते समय PlaybackConfig को सेट करने का तरीका बताया गया है. मेनिफ़ेस्ट पाने के लिए किए जाने वाले आउटगोइंग अनुरोधों को कॉन्फ़िगरेशन बदल देता है. हैंडलर यह तय करता है कि सीओआरएस ऐक्सेस-कंट्रोल के अनुरोध, कुकी या ऑथराइज़ेशन हेडर जैसे क्रेडेंशियल का इस्तेमाल करके किए जाने चाहिए.

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

नीचे दिए गए उदाहरण में बताया गया है कि PlayerManager में दिए गए गैटर और सेटर का इस्तेमाल करके, PlaybackConfig को कैसे बदला जाता है. यह सेटिंग, प्लेयर को एक सेगमेंट लोड होने के बाद फिर से वीडियो चलाने के लिए कॉन्फ़िगर करती है.

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

नीचे दिए गए उदाहरण में, मीडिया प्लेबैक की जानकारी वाले हैंडलर का इस्तेमाल करके, कॉन्टेंट लोड करने के किसी खास अनुरोध के लिए, PlaybackConfig को बदलने का तरीका बताया गया है. मौजूदा आइटम के contentId से licenseUrl पाने के लिए, हैंडलर ऐप्लिकेशन लागू किए गए getLicenseUrlForMedia तरीके को कॉल करता है.

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

इवेंट लिसनर

वेब रिसीवर SDK टूल, आपके वेब पाने वाले ऐप्लिकेशन को प्लेयर इवेंट मैनेज करने की अनुमति देता है. इवेंट की पहचान करने वाला, cast.framework.events.EventType पैरामीटर या इन पैरामीटर की कैटगरी लेता है. इससे उस इवेंट की जानकारी मिलती है जो लिसनर को ट्रिगर करता है. cast.framework.events.EventType के पहले से कॉन्फ़िगर किए गए ऐसे कलेक्शन जो डीबग करने में काम आते हैं. इन्हें cast.framework.events.category में देखा जा सकता है. इवेंट पैरामीटर, इवेंट के बारे में ज़्यादा जानकारी देता है.

उदाहरण के लिए, अगर आपको यह जानना है कि mediaStatus बदलाव कब ब्रॉडकास्ट होता है, तो इवेंट को मैनेज करने के लिए इस लॉजिक का इस्तेमाल किया जा सकता है:

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
    cast.framework.events.EventType.MEDIA_STATUS, (event) => {
      // Write your own event handling code, for example
      // using the event.mediaStatus value
});

मैसेज इंटरसेप्शन

वेब रिसीवर SDK टूल आपके वेब रिसीवर ऐप्लिकेशन को मैसेज को रोकने और उन पर कस्टम कोड लागू करने की अनुमति देता है. मैसेज इंटरसेप्टर एक cast.framework.messages.MessageType पैरामीटर लेता है. इससे पता चलता है कि किस तरह के मैसेज को इंटरसेप्ट नहीं किया जाना चाहिए.

इंटरसेप्टर को, बदले गए अनुरोध या प्रॉमिस को लौटाना चाहिए, जो बदले गए अनुरोध की वैल्यू के साथ हल हो जाता है. null को लौटाने पर, डिफ़ॉल्ट मैसेज हैंडलर को कॉल नहीं किया जा सकेगा. ज़्यादा जानकारी के लिए, मीडिया लोड करना देखें.

उदाहरण के लिए, अगर आपको लोड करने के अनुरोध का डेटा बदलना है, तो इस लॉजिक का इस्तेमाल करके उसे इंटरसेप्ट और उसमें बदलाव किया जा सकता है:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_FAILED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      if (!loadRequestData.media.entity) {
        return loadRequestData;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          if (!asset) {
            throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
          }

          loadRequestData.media.contentUrl = asset.url;
          loadRequestData.media.metadata = asset.metadata;
          loadRequestData.media.tracks = asset.tracks;
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

context.start();

गड़बड़ी ठीक करना

जब मैसेज इंटरसेप्टर में गड़बड़ियां होती हैं, तो आपके वेब पाने वाले ऐप्लिकेशन को सही cast.framework.messages.ErrorType और cast.framework.messages.ErrorReason दिखाना चाहिए.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      const error = new cast.framework.messages.ErrorData(
                      cast.framework.messages.ErrorType.LOAD_CANCELLED);
      if (!loadRequestData.media) {
        error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
        return error;
      }

      ...

      return fetchAssetAndAuth(loadRequestData.media.entity,
                               loadRequestData.credentials)
        .then(asset => {
          ...
          return loadRequestData;
        }).catch(reason => {
          error.reason = reason; // cast.framework.messages.ErrorReason
          return error;
        });
    });

मैसेज इंटरसेप्शन बनाम इवेंट लिसनर

मैसेज इंटरसेप्शन और इवेंट लिसनर के बीच कुछ मुख्य अंतर यहां दिए गए हैं:

  • इवेंट लिसनर आपको अनुरोध के डेटा में बदलाव करने की अनुमति नहीं देता है.
  • इवेंट लिसनर का सबसे अच्छा इस्तेमाल, आंकड़े या कस्टम फ़ंक्शन को ट्रिगर करने के लिए किया जाता है.
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • मैसेज इंटरसेप्शन की मदद से, किसी मैसेज को सुना जा सकता है, उसे रोका जा सकता है, और अनुरोध के डेटा में बदलाव किया जा सकता है.
  • मैसेज इंटरसेप्शन का सबसे अच्छा इस्तेमाल डेटा के अनुरोध के संबंध में कस्टम लॉजिक को हैंडल करने के लिए किया जाता है.

मीडिया लोड हो रहा है

MediaInformation cast.framework.messages.MessageType.LOAD मैसेज में मीडिया लोड करने के लिए कई प्रॉपर्टी उपलब्ध कराता है. इनमें entity, contentUrl, और contentId शामिल हैं.

  • भेजने और पाने वाले, दोनों तरह के ऐप्लिकेशन के लिए, लागू करने के लिए entity सुझाई गई प्रॉपर्टी है. प्रॉपर्टी एक डीप लिंक यूआरएल है. यह प्लेलिस्ट या मीडिया कॉन्टेंट हो सकता है. आपके ऐप्लिकेशन को इस यूआरएल को पार्स करना चाहिए और अन्य दो फ़ील्ड में से कम से कम एक फ़ील्ड भरना चाहिए.
  • contentUrl, चलाए जा सकने वाले उस यूआरएल के मुताबिक काम करता है जिसका इस्तेमाल प्लेयर, कॉन्टेंट लोड करने के लिए करेगा. उदाहरण के लिए, यह यूआरएल किसी DASH मेनिफ़ेस्ट पर ले जा सकता है.
  • contentId, चलाए जा सकने वाले कॉन्टेंट का यूआरएल (contentUrl प्रॉपर्टी की तरह) या लोड किए जा रहे कॉन्टेंट या प्लेलिस्ट के लिए यूनीक आइडेंटिफ़ायर हो सकता है. अगर इस प्रॉपर्टी का इस्तेमाल आइडेंटिफ़ायर के तौर पर किया जा रहा है, तो आपके ऐप्लिकेशन को contentUrl में, गेम खेलने देने वाले यूआरएल की जानकारी अपने-आप भरनी चाहिए.

हमारा सुझाव है कि आप entity का इस्तेमाल करके, रीयल आईडी या मुख्य पैरामीटर को सेव करें. साथ ही, मीडिया के यूआरएल के लिए contentUrl का इस्तेमाल करें. इसका एक उदाहरण नीचे दिए गए स्निपेट में दिखाया गया है, जहां LOAD अनुरोध में entity मौजूद है और चलाए जा सकने वाले contentUrl को वापस लाया गया है:

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...

      if (!loadRequestData.media.entity) {
        // Copy the value from contentId for legacy reasons if needed
        loadRequestData.media.entity = loadRequestData.media.contentId;
      }

      return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
                                          loadRequestData.credentials)
        .then(asset => {
          loadRequestData.media.contentUrl = asset.url;
          ...
          return loadRequestData;
        });
    });

डिवाइस की सुविधाएं

getDeviceCapabilities यह तरीका, कनेक्ट किए गए कास्ट डिवाइस और उससे जुड़े वीडियो या ऑडियो डिवाइस की जानकारी देता है. getDeviceCapabilities तरीका, Google Assistant, ब्लूटूथ, कनेक्ट किए गए डिसप्ले, और ऑडियो डिवाइसों के लिए सहायता की जानकारी देता है.

यह तरीका एक ऐसा ऑब्जेक्ट लौटाता है जिसे आप किसी खास ईनम में पास करके क्वेरी कर सकते हैं, ताकि उस ईनम के लिए डिवाइस की क्षमता पाई जा सके. ईनम के बारे में cast.framework.system.DeviceCapabilities में बताया गया है.

यह उदाहरण इस बात की जांच करता है कि वेब पाने वाले डिवाइस पर IS_HDR_SUPPORTED और IS_DV_SUPPORTED बटनों से एचडीआर और DolbyVision (DV) चलाया जा सकता है या नहीं.

const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
  const deviceCapabilities = context.getDeviceCapabilities();
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
  }
  if (deviceCapabilities &&
      deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
    // Write your own event handling code, for example
    // using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
  }
});
context.start();

उपयोगकर्ता के इंटरैक्शन को मैनेज करना

उपयोगकर्ता आपके वेब रिसीवर ऐप्लिकेशन से इंटरैक्ट कर सकता है. इसके लिए वह भेजने वाले ऐप्लिकेशन (वेब, Android, और iOS) का इस्तेमाल कर सकता है. साथ ही, वह Assistant की सुविधा वाले डिवाइसों पर बोलकर दिए जाने वाले निर्देशों, स्मार्ट डिसप्ले पर टच कंट्रोल, और Android TV डिवाइसों पर रिमोट कंट्रोल की मदद से भी इंटरैक्ट कर सकता है. Cast SDK टूल कई एपीआई उपलब्ध कराता है, ताकि वेब रिसीवर ऐप्लिकेशन को ये इंटरैक्शन मैनेज करने की अनुमति मिल सके. साथ ही, उपयोगकर्ता की कार्रवाई की स्थितियों की मदद से ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) को अपडेट किया जा सके. साथ ही, बैकएंड सेवाओं को अपडेट करने के लिए, विकल्प के तौर पर बदलाव भेजे जा सकें.

मीडिया के लिए काम करने वाले निर्देश

यूज़र इंटरफ़ेस (यूआई) कंट्रोल की स्थितियां, iOS और Android भेजने वालों के लिए उपलब्ध कराए गए कंट्रोलर, रिसीवर और रिमोट कंट्रोल ऐप्लिकेशन के लिए, MediaStatus.supportedMediaCommands की मदद से कंट्रोल की जाती हैं. ऐसा टच डिवाइसों पर चल रहे रिसीवर और रिमोट कंट्रोल ऐप्लिकेशन और Android TV डिवाइसों पर चलने वाले ऐप्लिकेशन के लिए होता है. जब प्रॉपर्टी में, किसी खास बिट के हिसाब से Command चालू होता है, तो उस कार्रवाई से जुड़े बटन चालू हो जाते हैं. अगर यह वैल्यू सेट नहीं है, तो इसका मतलब है कि यह बटन बंद है. वेब रिसीवर पर इन वैल्यू को इस तरह से बदला जा सकता है:

  1. खास Commands को सेट करने के लिए PlayerManager.setSupportedMediaCommands का इस्तेमाल करना
  2. addSupportedMediaCommands का इस्तेमाल करके नया निर्देश जोड़ना
  3. removeSupportedMediaCommands का इस्तेमाल करके मौजूदा निर्देश को हटाया जा रहा है.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

जब पैसे पाने वाला व्यक्ति, अपडेट किया गया MediaStatus तैयार करेगा, तो उसमें supportedMediaCommands प्रॉपर्टी में किए गए बदलाव शामिल होंगे. स्थिति के ब्रॉडकास्ट होने पर, कनेक्ट किए गए भेजने वाले ऐप्लिकेशन अपने यूज़र इंटरफ़ेस (यूआई) में बटन के हिसाब से अपडेट कर देंगे.

मीडिया के लिए काम करने वाले निर्देशों और टच डिवाइसों के बारे में ज़्यादा जानने के लिए, Accessing UI controls गाइड देखें.

उपयोगकर्ता की कार्रवाई की स्थितियां मैनेज करना

जब उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) से इंटरैक्ट करते हैं या बोलकर निर्देश देते हैं, तब वे चल रहे आइटम से जुड़े कॉन्टेंट और प्रॉपर्टी के चलने को कंट्रोल कर सकते हैं. प्लेबैक को कंट्रोल करने वाले अनुरोधों को, SDK टूल अपने-आप मैनेज करता है. जो अनुरोध चल रहे मौजूदा आइटम की प्रॉपर्टी में बदलाव करते हैं, जैसे कि LIKE निर्देश, उनके लिए यह ज़रूरी है कि रिसीवर ऐप्लिकेशन उन्हें हैंडल करे. इस तरह के अनुरोधों को मैनेज करने के लिए, SDK टूल कई तरह के एपीआई उपलब्ध कराता है. इन अनुरोधों के साथ काम करने के लिए, ये काम किए जाने चाहिए:

  • मीडिया आइटम लोड करते समय उपयोगकर्ता की प्राथमिकताओं के हिसाब से, MediaInformation userActionStates को सेट करें.
  • USER_ACTION मैसेज रोकें और अनुरोध की गई कार्रवाई तय करें.
  • यूज़र इंटरफ़ेस (यूआई) अपडेट करने के लिए, MediaInformation UserActionState को अपडेट करें.

यह स्निपेट, LOAD के अनुरोध को इंटरसेप्ट करता है और LoadRequestData के MediaInformation को पॉप्युलेट करता है. इस मामले में, उपयोगकर्ता को लोड की जा रही सामग्री पसंद आती है.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
      const userActionLike = new cast.framework.messages.UserActionState(
          cast.framework.messages.UserAction.LIKE);
      loadRequestData.media.userActionStates = [userActionLike];

      return loadRequestData;
    });

नीचे दिया गया स्निपेट, USER_ACTION मैसेज को बीच में रोकता है और अनुरोध किए गए बदलाव के साथ बैकएंड को कॉल करता है. इसके बाद, वह रिसीवर पर UserActionState को अपडेट करने के लिए कॉल करता है.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
  (userActionRequestData) => {
    // Obtain the media information of the current content to associate the action to.
    let mediaInfo = playerManager.getMediaInformation();

    // If there is no media info return an error and ignore the request.
    if (!mediaInfo) {
        console.error('Not playing media, user action is not supported');
        return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
    }

    // Reach out to backend services to store user action modifications. See sample below.
    return sendUserAction(userActionRequestData, mediaInfo)

    // Upon response from the backend, update the client's UserActionState.
    .then(backendResponse => updateUserActionStates(backendResponse))

    // If any errors occurred in the backend return them to the cast receiver.
    .catch((error) => {
      console.error(error);
      return error;
    });
});

नीचे दिया गया स्निपेट, बैकएंड सेवा को कॉल करने की नकल करता है. फ़ंक्शन UserActionRequestData की जांच करके पता लगाता है कि उपयोगकर्ता ने किस तरह के बदलाव का अनुरोध किया है. साथ ही, वह नेटवर्क कॉल सिर्फ़ तब करता है, जब कार्रवाई बैकएंड के साथ काम करती हो.

function sendUserAction(userActionRequestData, mediaInfo) {
  return new Promise((resolve, reject) => {
    switch (userActionRequestData.userAction) {
      // Handle user action changes supported by the backend.
      case cast.framework.messages.UserAction.LIKE:
      case cast.framework.messages.UserAction.DISLIKE:
      case cast.framework.messages.UserAction.FOLLOW:
      case cast.framework.messages.UserAction.UNFOLLOW:
      case cast.framework.messages.UserAction.FLAG:
      case cast.framework.messages.UserAction.SKIP_AD:
        let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
        setTimeout(() => {resolve(backendResponse)}, 1000);
        break;
      // Reject all other user action changes.
      default:
        reject(
          new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
    }
  });
}

यह स्निपेट UserActionRequestData को लेता है और MediaInformation में UserActionState को जोड़ता है या हटाता है. MediaInformation के UserActionState को अपडेट करने से, अनुरोध की गई कार्रवाई से जुड़े बटन की स्थिति बदल जाती है. यह बदलाव स्मार्ट डिसप्ले कंट्रोल यूज़र इंटरफ़ेस (यूआई), रिमोट कंट्रोल ऐप्लिकेशन, और Android TV के यूज़र इंटरफ़ेस (यूआई) में दिखता है. इसे iOS और Android से मैसेज भेजने वाले लोगों के लिए, बड़े किए गए कंट्रोलर के यूज़र इंटरफ़ेस (यूआई) को अपडेट करने के लिए, MediaStatus मैसेज के ज़रिए भी ब्रॉडकास्ट किया जाता है.

function updateUserActionStates(backendResponse) {
  // Unwrap the backend response.
  let mediaInfo = backendResponse.mediaInfo;
  let userActionRequestData = backendResponse.userActionRequestData;

  // If the current item playing has changed, don't update the UserActionState for the current item.
  if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
    return;
  }

  // Check for existing userActionStates in the MediaInformation.
  // If none, initialize a new array to populate states with.
  let userActionStates = mediaInfo.userActionStates || [];

  // Locate the index of the UserActionState that will be updated in the userActionStates array.
  let index = userActionStates.findIndex((currUserActionState) => {
    return currUserActionState.userAction == userActionRequestData.userAction;
  });

  if (userActionRequestData.clear) {
    // Remove the user action state from the array if cleared.
    if (index >= 0) {
      userActionStates.splice(index, 1);
    }
    else {
      console.warn("Could not find UserActionState to remove in MediaInformation");
    }
  } else {
    // Add the UserActionState to the array if enabled.
    userActionStates.push(
      new cast.framework.messages.UserActionState(userActionRequestData.userAction));
  }

  // Update the UserActionState array and set the new MediaInformation
  mediaInfo.userActionStates = userActionStates;
  playerManager.setMediaInformation(mediaInfo, true);
  return;
}

बोलकर दिए जाने वाले निर्देश

फ़िलहाल, इन मीडिया कमांड को Assistant की सुविधा वाले डिवाइसों के वेब रिसीवर SDK टूल में इस्तेमाल किया जा सकता है. इन निर्देशों को लागू करने का डिफ़ॉल्ट तरीका cast.framework.PlayerManager में बताया गया है.

आदेश कंपनी का ब्यौरा
खेलें 'रोके गए' स्टेटस से वीडियो चलाना या उसे फिर से शुरू करना.
रोकना चल रहे मौजूदा वीडियो को रोकें.
पीछे जाएं अपनी मीडिया सूची में पिछले मीडिया आइटम पर जाएं.
आगे बढ़ें अपनी मीडिया सूची में अगले मीडिया आइटम पर जाएं.
बंद करें अभी चल रहे मीडिया को बंद करें.
किसी को न दोहराएं सूची में सबसे आखिर में मौजूद आइटम के चलने के बाद, सूची में मौजूद मीडिया आइटम को दोहराना बंद करें.
एक गाना दोहराएं मौजूदा समय में चल रहे मीडिया को हमेशा के लिए दोहराएं.
सभी को दोहराएं सूची का आखिरी आइटम सुनने के बाद, सूची में मौजूद सभी आइटम दोबारा सुनें.
सभी को दोहराएं और शफ़ल करें सूची का आखिरी आइटम चलाने के बाद, सूची को शफ़ल करें और सूची के सभी आइटम दोहराएं.
शफ़ल करें अपनी मीडिया सूची में मौजूद मीडिया आइटम शफ़ल करें.
के loadRequestData में सेट किया गया है, तो shuffle फ़्लैग का इस्तेमाल करके, वीडियो चलाने से पहले उसे शफ़ल किया जा सकता है.
सबटाइटल चालू या बंद करना मीडिया के लिए सबटाइटल चालू / बंद करें. चालू / बंद करने की सुविधा भाषा के हिसाब से भी उपलब्ध है.
कुल समय के लिए आगे बढ़ें सीधे तय किए गए समय पर ले जाता है.
मौजूदा समय के हिसाब से समय पर आगे बढ़ें वीडियो चलाने के मौजूदा समय के हिसाब से, तय समयावधि के हिसाब से आगे या पीछे जाएं.
फिर से खेलें अगर अभी चल रहा मीडिया आइटम नहीं चल रहा है, तो उसे रीस्टार्ट करें. इसके अलावा, अगर आखिरी बार चलाया गया मीडिया आइटम चलाया जा रहा है, तो उसे फिर से चलाएं.
वीडियो चलाने की स्पीड सेट करना अलग-अलग मीडिया प्लेबैक रेट. इसे डिफ़ॉल्ट रूप से हैंडल किया जाना चाहिए. किराये की दर के अनुरोधों को बदलने के लिए, SET_PLAYBACK_RATE मैसेज इंटरसेप्टर का इस्तेमाल किया जा सकता है.

बोलकर दिए जाने वाले निर्देशों की मदद से मीडिया चलाने के लिए

बोले गए निर्देश से Assistant की सुविधा वाले डिवाइस पर मीडिया निर्देश ट्रिगर होने से रोकने के लिए, आपको पहले काम करने वाले मीडिया निर्देश सेट करने होंगे, जिनके साथ आप काम करने वाले हैं. इसके बाद, आपको CastReceiverOptions.enforceSupportedCommands प्रॉपर्टी को चालू करके उन निर्देशों को लागू करना होगा. Cast SDK से मैसेज भेजने वाले लोगों और टच के साथ काम करने वाले डिवाइसों पर यूज़र इंटरफ़ेस (यूआई), इन कॉन्फ़िगरेशन को दिखाने के लिए बदल जाएगा. अगर फ़्लैग चालू नहीं है, तो इनकमिंग वॉइस कमांड काम करेंगे.

उदाहरण के लिए, अगर भेजने वाले के ऐप्लिकेशन और टच की सुविधा वाले डिवाइसों से PAUSE को इस्तेमाल करने की अनुमति दी जाती है, तो कॉन्टेंट पाने वाले व्यक्ति को भी उनकी सेटिंग दिखाने के लिए उसे कॉन्फ़िगर करना होगा. कॉन्फ़िगर किए जाने के बाद, बोलकर दिए जाने वाले निर्देश हटा दिए जाएँगे. ऐसा तब होगा, जब इनका इस्तेमाल काम करने वाले निर्देशों की सूची में न किया गया हो.

नीचे दिए गए उदाहरण में, हमने CastReceiverContext को शुरू करते समय CastReceiverOptions दिया है. हमने PAUSE कमांड पर सहायता देने की सुविधा जोड़ दी है. साथ ही, प्लेयर को सिर्फ़ यही निर्देश देने की अनुमति दी है. अब अगर बोला गया कोई निर्देश, SEEK जैसी दूसरी कार्रवाई का अनुरोध करता है, तो उसे अस्वीकार कर दिया जाएगा. उपयोगकर्ता को यह सूचना दी जाएगी कि यह निर्देश फ़िलहाल काम नहीं करता है.

const context = cast.framework.CastReceiverContext.getInstance();

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

हर उस निर्देश के लिए अलग लॉजिक लागू किया जा सकता है जिस पर पाबंदी लगानी है. enforceSupportedCommands फ़्लैग को हटाएँ. साथ ही, हर उस निर्देश के लिए जो आपको आने वाले मैसेज पर रोक लगानी है, उसे इंटरसेप्ट कर सकते हैं. यहां हम SDK टूल से मिले अनुरोध को ऐक्सेस करते हैं, ताकि Assistant की सुविधा वाले डिवाइसों को जारी किए गए SEEK निर्देश, आपके वेब रिसीवर ऐप्लिकेशन में खोजने की सुविधा को ट्रिगर न करें.

उन मीडिया कमांड के लिए जो आपका ऐप्लिकेशन काम नहीं करता है, गड़बड़ी की कोई सही वजह बताएं, जैसे कि NOT_SUPPORTED.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
  seekData => {
    // Block seeking if the SEEK supported media command is disabled
    if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
      let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
      .INVALID_REQUEST);
      e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
      return e;
    }

    return seekData;
  });

बोलकर की जा रही गतिविधि के ज़रिए बैकग्राउंड में कॉन्टेंट चलाएं

अगर Cast प्लैटफ़ॉर्म, Assistant की गतिविधि की वजह से आपके ऐप्लिकेशन की आवाज़ को बैकग्राउंड में इस्तेमाल कर लेता है, जैसे कि उपयोगकर्ता की बात सुनना या वापस बात करना, तो गतिविधि शुरू होने पर, वेब रिसीवर ऐप्लिकेशन को FocusState NOT_IN_FOCUS का मैसेज भेजा जाता है. गतिविधि के खत्म होने पर, IN_FOCUS के साथ एक और मैसेज भेजा जाता है. आपके ऐप्लिकेशन और चलाए जा रहे मीडिया के आधार पर, जब FocusState NOT_IN_FOCUS हो, तब हो सकता है कि आप मैसेज टाइप FOCUS_STATE को इंटरसेप्ट करके मीडिया को रोकना चाहें.

उदाहरण के लिए, अगर Assistant किसी उपयोगकर्ता की क्वेरी का जवाब दे रही है, तो ऑडियो बुक प्लेबैक को रोका जा सकता है. यह एक अच्छा उपयोगकर्ता अनुभव है.

playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
  focusStateRequestData => {
    // Pause content when the app is out of focus. Resume when focus is restored.
    if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
      playerManager.pause();
    } else {
      playerManager.play();
    }

    return focusStateRequestData;
  });

कैप्शन के लिए आवाज़ की खास भाषा

जब कोई उपयोगकर्ता कैप्शन की भाषा के बारे में साफ़ तौर पर नहीं बताता है, तो कैप्शन के लिए इस्तेमाल की गई भाषा वही होती है जिसमें निर्देश बोला गया था. इन मामलों में, आने वाले मैसेज के isSuggestedLanguage पैरामीटर से पता चलता है कि उपयोगकर्ता ने मैसेज से जुड़ी भाषा का सुझाव दिया था या साफ़ तौर पर अनुरोध किया था.

उदाहरण के लिए, "Ok Google, कैप्शन चालू करो" निर्देश के लिए, isSuggestedLanguage को true पर सेट किया गया है. ऐसा इसलिए किया गया है, क्योंकि भाषा का अनुमान उस भाषा से लगाया गया था जिसमें कमांड को बोला गया था. अगर भाषा का अनुरोध साफ़ तौर पर किया गया है, जैसे कि "Ok Google, अंग्रेज़ी में कैप्शन की सुविधा चालू करें", तो isSuggestedLanguage को false पर सेट किया जाता है.

मेटाडेटा और वॉइस कास्ट करना

बोलकर दिए जाने वाले निर्देशों को वेब रिसीवर डिफ़ॉल्ट रूप से हैंडल करता है. हालांकि, आपको यह पक्का करना चाहिए कि आपके कॉन्टेंट का मेटाडेटा पूरा और सटीक हो. इससे यह पक्का होता है कि Assistant, बोलकर दिए जाने वाले निर्देशों को सही तरीके से हैंडल करे. साथ ही, मेटाडेटा, Google Home ऐप्लिकेशन और Google Home Hub जैसे स्मार्ट डिसप्ले जैसे नए तरह के इंटरफ़ेस पर ठीक से दिखे.

स्ट्रीम को ट्रांसफ़र करें

सेशन की स्थिति को सुरक्षित रखना, स्ट्रीम ट्रांसफ़र का आधार होता है. इसमें उपयोगकर्ता, मौजूदा ऑडियो और वीडियो स्ट्रीम को बोलकर अलग-अलग डिवाइसों पर ले जा सकते हैं. इसके लिए, उन्हें बोलकर निर्देश देने की सुविधा, Google Home ऐप्लिकेशन या स्मार्ट डिसप्ले का इस्तेमाल करना होगा. मीडिया एक डिवाइस (सोर्स) पर चलना बंद हो जाता है और दूसरे डिवाइस (डेस्टिनेशन) पर चलता रहता है. नए फ़र्मवेयर वाला कोई भी कास्ट डिवाइस, स्ट्रीम ट्रांसफ़र में सोर्स या डेस्टिनेशन के तौर पर काम कर सकता है.

स्ट्रीम ट्रांसफ़र के लिए इवेंट फ़्लो यह है:

  1. सोर्स डिवाइस पर:
    1. मीडिया चलना बंद हो जाता है.
    2. वेब पाने वाले ऐप्लिकेशन को मौजूदा मीडिया स्थिति सेव करने के लिए एक निर्देश मिलता है.
    3. वेब रिसीवर ऐप्लिकेशन बंद है.
  2. डेस्टिनेशन डिवाइस पर:
    1. वेब रिसीवर ऐप्लिकेशन लोड हो गया.
    2. वेब रिसीवर ऐप्लिकेशन को सेव की गई मीडिया स्थिति को पहले जैसा करने के लिए एक निर्देश मिलता है.
    3. मीडिया फिर से चल रहा है.

मीडिया स्टेट के एलिमेंट में ये शामिल हैं:

  • गाने, वीडियो या मीडिया आइटम की खास स्थिति या टाइमस्टैंप.
  • यह प्लेलिस्ट या किसी कलाकार के रेडियो चैनल जैसी लंबी सूची में है.
  • पुष्टि किया गया उपयोगकर्ता.
  • वीडियो चलाने की स्थिति (उदाहरण के लिए, चलाना या रोकना).

स्ट्रीम ट्रांसफ़र करने की सुविधा चालू की जा रही है

अपने वेब पाने वाले के लिए स्ट्रीम ट्रांसफ़र लागू करने के लिए:

  1. supportedMediaCommands को STREAM_TRANSFER निर्देश की मदद से अपडेट करें:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. आपके पास SESSION_STATE और RESUME_SESSION मैसेज इंटरसेप्टर को बदलने का विकल्प भी है, जैसा कि सेविंग सेशन की स्थिति में बताया गया है. इन्हें सिर्फ़ तब बदलें, जब कस्टम डेटा को सेशन स्नैपशॉट के हिस्से के तौर पर सेव करना हो. अगर ऐसा नहीं है, तो सेशन की स्थितियों को बनाए रखने के डिफ़ॉल्ट तरीके लागू करने पर, स्ट्रीम ट्रांसफ़र की सुविधा काम करेगी.

सेशन की स्थिति को सुरक्षित रखा जा रहा है

वेब रिसीवर SDK टूल, वेब रिसीवर ऐप्लिकेशन के लिए डिफ़ॉल्ट तौर पर सेशन की स्थितियों को सेव करने की सुविधा देता है. इसके लिए, मौजूदा मीडिया स्थिति का स्नैपशॉट लेकर, स्थिति को लोड करने के अनुरोध में बदला जाता है, और लोड करने के अनुरोध के साथ सेशन को फिर से शुरू किया जाता है.

अगर ज़रूरी हो, तो वेब रिसीवर के जनरेट किए गए लोड करने के अनुरोध को SESSION_STATE मैसेज इंटरसेप्टर में बदला जा सकता है. अगर आपको लोड करने के अनुरोध में कस्टम डेटा जोड़ना है, तो हमारा सुझाव है कि आप इसे loadRequestData.customData में डालें.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.SESSION_STATE,
    function (sessionState) {
        // Override sessionState.loadRequestData if needed.
        const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
        sessionState.loadRequestData.credentials = newCredentials;

        // Add custom data if needed.
        sessionState.loadRequestData.customData = {
            'membership': 'PREMIUM'
        };

        return sessionState;
    });

RESUME_SESSION मैसेज इंटरसेप्टर में मौजूद loadRequestData.customData से कस्टम डेटा वापस लाया जा सकता है.

let cred_ = null;
let membership_ = null;

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.RESUME_SESSION,
    function (resumeSessionRequest) {
        let sessionState = resumeSessionRequest.sessionState;

        // Modify sessionState.loadRequestData if needed.
        cred_ = sessionState.loadRequestData.credentials;

        // Retrieve custom data.
        membership_ = sessionState.loadRequestData.customData.membership;

        return resumeSessionRequest;
    });

पहले से लोड किया गया कॉन्टेंट

वेब रिसीवर, सूची में मौजूद प्लेबैक आइटम के बाद मीडिया आइटम को पहले से लोड करने की सुविधा देता है.

पहले से लोड करने की कार्रवाई, आगे आने वाले आइटम के कई सेगमेंट पहले से डाउनलोड कर लेती है. यह स्पेसिफ़िकेशन QueueItem ऑब्जेक्ट में preloadTime की वैल्यू पर काम करता है. अगर उपलब्ध नहीं कराया जाता है, तो यह डिफ़ॉल्ट रूप से 20 सेकंड के लिए होता है. समय को सेकंड में दिखाया जाता है. फ़िलहाल, चल रहे आइटम के आखिर में समय दिखाया जाता है . सिर्फ़ पॉज़िटिव वैल्यू मान्य होती हैं. उदाहरण के लिए, अगर वैल्यू 10 सेकंड की है, तो यह आइटम, पिछला आइटम खत्म होने से 10 सेकंड पहले लोड हो जाएगा. अगर पेजों को पहले से लोड करने में लगने वाला समय,currentItem में बचे समय से ज़्यादा है, तो पहले से लोड करने की सुविधा जल्द से जल्द पूरी हो जाएगी. इसलिए, अगर सूची आइटम में प्रीलोड की बहुत बड़ी वैल्यू दी गई है, तो मौजूदा आइटम को चलाने पर उसका असर पड़ सकता है. हम अगले आइटम को पहले से ही पहले से लोड कर रहे हैं. हालांकि, हम इसकी सेटिंग और विकल्प डेवलपर पर छोड़ देते हैं, क्योंकि यह वैल्यू चल रहे आइटम की बैंडविड्थ और स्ट्रीमिंग परफ़ॉर्मेंस पर असर डाल सकती है.

कॉन्टेंट को पहले से लोड करने की सुविधा, डिफ़ॉल्ट रूप से एचएलएस, डैश, और स्मूद स्ट्रीमिंग कॉन्टेंट के लिए काम करेगी.

सामान्य MP4 वीडियो और MP3 जैसी ऑडियो फ़ाइलें पहले से लोड नहीं की जाएंगी, क्योंकि कास्ट डिवाइस पर सिर्फ़ एक मीडिया एलिमेंट काम करता है. किसी मौजूदा कॉन्टेंट आइटम के चलने के दौरान, इन फ़ाइलों को पहले से लोड करने के लिए इस्तेमाल नहीं किया जा सकता.

कस्टम मैसेज

मैसेज एक्सचेंज, वेब रिसीवर ऐप्लिकेशन के लिए इंटरैक्शन का मुख्य तरीका है.

भेजने वाला व्यक्ति उस प्लैटफ़ॉर्म (Android, iOS, वेब) के लिए सेंडर एपीआई का इस्तेमाल करके वेब पाने वाले को मैसेज भेजता है जिसे वह चला रहा है. इवेंट लिसनर को भेजे जाने वाले इवेंट ऑब्जेक्ट (जो किसी मैसेज का मेनिफ़ेस्ट होता है) में डेटा एलिमेंट (event.data) होता है, जहां डेटा किसी खास इवेंट टाइप की प्रॉपर्टी को लेता है.

कोई वेब प्राप्तकर्ता ऐप्लिकेशन किसी खास नाम स्थान पर संदेश सुनना चुन सकता है. ऐसा करने पर, वेब पाने वाले ऐप्लिकेशन को उस नेमस्पेस प्रोटोकॉल का इस्तेमाल करने के लिए कहा जाता है. इसके बाद, संबंधित प्रोटोकॉल का इस्तेमाल करने के लिए, डोमेन से जुड़े किसी भी व्यक्ति को उस नेमस्पेस के बारे में संपर्क करना होगा.

सभी नेमस्पेस, स्ट्रिंग से तय किए जाते हैं और "urn:x-cast:" से शुरू होने चाहिए. इसके बाद, कोई भी स्ट्रिंग होनी चाहिए. उदाहरण के लिए, "urn:x-cast:com.example.cast.mynamespace".

यहां वेब पाने वाले के लिए एक कोड स्निपेट दिया गया है, ताकि वह जोड़े गए ईमेल पतों के कस्टम मैसेज सुन सके:

const context = cast.framework.CastReceiverContext.getInstance();

const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
  // handle customEvent.
});

context.start();

इसी तरह, वेब पाने वाले ऐप्लिकेशन, कनेक्ट किए गए ईमेल पतों को मैसेज भेजकर, उन्हें वेब पाने वाले की स्थिति की जानकारी देने में मदद कर सकते हैं. वेब रिसीवर ऐप्लिकेशन CastReceiverContext पर sendCustomMessage(namespace, senderId, message) का उपयोग करके संदेश भेज सकता है. एक वेब प्राप्तकर्ता, या तो किसी प्राप्त संदेश के जवाब में या किसी ऐप्लिकेशन स्थिति के परिवर्तन के कारण, व्यक्तिगत रूप से भेजने वाले को संदेश भेज सकता है. एक पॉइंट-टू-पॉइंट मैसेज सेवा (64 केबी की सीमा के साथ) के बाद, वेब पाने वाला सभी कनेक्टेड भेजने वालों को मैसेज ब्रॉडकास्ट भी कर सकता है.

ऑडियो डिवाइसों के लिए कास्ट करें

सिर्फ़ ऑडियो प्लेबैक पर सहायता पाने के लिए ऑडियो डिवाइस के लिए Google Cast गाइड देखें.

Android TV

इस सेक्शन में बताया गया है कि Google Web रिसीवर, आपके इनपुट का इस्तेमाल प्लेबैक और Android TV के साथ काम करने के लिए कैसे करता है.

आपके ऐप्स को रिमोट कंट्रोल के साथ एकीकृत करना

Android TV डिवाइस पर चल रहा Google Web रिसीवर, डिवाइस के कंट्रोल इनपुट (उदाहरण के लिए, हाथ में रिमोट कंट्रोल) से मिले इनपुट को urn:x-cast:com.google.cast.media नेमस्पेस के लिए तय किए गए मीडिया प्लेबैक मैसेज के तौर पर बदलता है. इसके बारे में मीडिया प्लेबैक मैसेज में बताया गया है. ऐप्लिकेशन के मीडिया प्लेबैक को कंट्रोल करने के लिए, आपके ऐप्लिकेशन में इन मैसेज के साथ काम करना ज़रूरी है. ऐसा इसलिए ज़रूरी है, ताकि Android TV के कंट्रोल इनपुट से वीडियो को बुनियादी कंट्रोल किया जा सके.

Android TV के साथ काम करने के लिए दिशा-निर्देश

आपका ऐप्लिकेशन Android TV के साथ काम करता है या नहीं, यह पक्का करने के लिए यहां कुछ सुझाव और सामान्य समस्याओं की जानकारी दी गई है:

  • ध्यान रखें कि उपयोगकर्ता-एजेंट स्ट्रिंग में "Android" और "CrKey" दोनों शामिल होते हैं; कुछ साइटें सिर्फ़ मोबाइल वाली साइट पर रीडायरेक्ट कर सकती हैं, क्योंकि उनमें "Android" लेबल होता है. यह न मानें कि उपयोगकर्ता-एजेंट स्ट्रिंग में "Android" हमेशा मोबाइल उपयोगकर्ता का संकेत देता है.
  • Android का मीडिया स्टैक, डेटा फ़ेच करने के लिए पारदर्शी GZIP का इस्तेमाल कर सकता है. पक्का करें कि आपका मीडिया डेटा, Accept-Encoding: gzip को जवाब दे सकता हो.
  • Android TV के HTML5 मीडिया इवेंट, Chromecast के मुकाबले अलग-अलग समय पर ट्रिगर हो सकते हैं. इससे Chromecast पर छिपाई गई समस्याओं का पता चल सकता है.
  • मीडिया अपडेट करते समय timeupdate, pause, और waiting जैसे <audio>/<video> एलिमेंट से ट्रिगर होने वाले, मीडिया से जुड़े इवेंट का इस्तेमाल करें. नेटवर्किंग से जुड़े इवेंट, जैसे कि progress, suspend, और stalled का इस्तेमाल करने से बचें, क्योंकि ये इवेंट प्लैटफ़ॉर्म पर निर्भर होते हैं. अपने रिसीवर में मीडिया इवेंट को मैनेज करने के बारे में ज़्यादा जानकारी के लिए, मीडिया इवेंट देखें.
  • कॉन्टेंट पाने वाले व्यक्ति की साइट के एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, बीच के सीए सर्टिफ़िकेट ज़रूर शामिल करें. पुष्टि करने के लिए, Qualsys एसएसएल टेस्ट पेज पर जाएं: अगर आपकी साइट के भरोसेमंद सर्टिफ़िकेट के पाथ में “अतिरिक्त डाउनलोड” लेबल वाला CA सर्टिफ़िकेट शामिल है, तो हो सकता है कि वह Android वाले प्लैटफ़ॉर्म पर लोड न हो.
  • Chromecast, रिसीवर पेज को 720 पिक्सल वाले ग्राफ़िक्स प्लेन पर दिखाता है. वहीं, Android TV जैसे कास्ट प्लैटफ़ॉर्म पर यह पेज 1080 पिक्सल तक दिख सकता है. पक्का करें कि आपका रिसीवर पेज अलग-अलग रिज़ॉल्यूशन पर अच्छी तरह से फ़िट हो जाए.