इस पेज पर, कस्टम वेब रिसीवर ऐप्लिकेशन के लिए उपलब्ध सुविधाओं के कोड स्निपेट और जानकारी दी गई है.
cast-media-player
एलिमेंट, वेब रिसीवर के साथ दिए गए प्लेयर के यूज़र इंटरफ़ेस (यूआई) को दिखाता है.cast-media-player
एलिमेंट के लिए कस्टम सीएसएस जैसी स्टाइल, ताकिbackground-image
,splash-image
, औरfont-family
जैसे अलग-अलग यूज़र इंटरफ़ेस (यूआई) एलिमेंट को स्टाइल किया जा सके.- वेब रिसीवर फ़्रेमवर्क को लोड करने के लिए स्क्रिप्ट एलिमेंट.
- मैसेज को इंटरसेप्ट करने और इवेंट को मैनेज करने के लिए JavaScript कोड.
- वीडियो अपने-आप चलने की सुविधा के लिए सूची में जोड़ें.
- वीडियो चलाने के तरीके कॉन्फ़िगर करने के विकल्प.
- वेब रिसीवर का कॉन्टेक्स्ट सेट करने के विकल्प.
- वेब रिसीवर ऐप्लिकेशन के साथ काम करने वाले निर्देश सेट करने के विकल्प.
- वेब रिसीवर ऐप्लिकेशन को शुरू करने के लिए JavaScript कॉल.
ऐप्लिकेशन कॉन्फ़िगरेशन और विकल्प
ऐप्लिकेशन कॉन्फ़िगर करना
CastReceiverContext
, डेवलपर के लिए सबसे बाहरी क्लास है. यह लाइब्रेरी लोड करने और वेब रिसीवर SDK टूल को शुरू करने की प्रोसेस को मैनेज करती है. SDK टूल, एपीआई उपलब्ध कराता है. इनकी मदद से, ऐप्लिकेशन डेवलपर CastReceiverOptions
के ज़रिए SDK टूल को कॉन्फ़िगर कर सकते हैं.
हर ऐप्लिकेशन लॉन्च के लिए, इन कॉन्फ़िगरेशन का आकलन एक बार किया जाता है. साथ ही, start
को कॉल करने के लिए वैकल्पिक पैरामीटर सेट करते समय, इन्हें SDK टूल को पास किया जाता है.
नीचे दिए गए उदाहरण में, डिफ़ॉल्ट तरीके को बदलकर यह पता लगाने का तरीका बताया गया है कि ईमेल भेजने वाले का कनेक्शन अब भी चालू है या नहीं. जब वेब रिसीवर, ईमेल भेजने वाले व्यक्ति से maxInactivity
सेकंड तक संपर्क नहीं कर पाता, तो SENDER_DISCONNECTED
इवेंट भेजा जाता है. नीचे दिया गया कॉन्फ़िगरेशन, इस टाइम आउट को बदल देता है. समस्याओं को डीबग करते समय यह सुविधा काम आ सकती है. इससे, वेब रिसीवर ऐप्लिकेशन को Chrome रिमोट डीबगर सेशन को बंद करने से रोका जा सकता है. ऐसा तब होता है, जब IDLE
स्टेटस में कोई भी कनेक्टेड सेंडर न हो.
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
मैनेज करता है. साथ ही, खिलाड़ियों को बनाने के समय इसका आकलन किया जाता है. जब भी वेब रिसीवर SDK टूल को कोई नया लोड पास किया जाता है, तब प्लेयर बन जाते हैं. प्लेयर बनाने के बाद, PlaybackConfig
में किए गए बदलावों का आकलन अगले कॉन्टेंट लोड होने पर किया जाता है. SDK टूल, PlaybackConfig
में बदलाव करने के लिए ये तरीके उपलब्ध कराता है.
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
में दिए गए getter और setter का इस्तेमाल करके, 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
तरीका, कनेक्ट किए गए Cast डिवाइस और उससे जुड़े वीडियो या ऑडियो डिवाइस की जानकारी देता है. 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
चालू होता है, तो उस कार्रवाई से जुड़े बटन चालू हो जाते हैं. अगर वैल्यू सेट नहीं की जाती है, तो बटन बंद हो जाता है. वेब रिसीवर पर इन वैल्यू को बदलने के लिए:
- किसी खास
Commands
को सेट करने के लिए,PlayerManager.setSupportedMediaCommands
का इस्तेमाल करना addSupportedMediaCommands
का इस्तेमाल करके नया निर्देश जोड़ना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 की सुविधा वाले डिवाइसों के लिए, वेब रिसीवर एसडीके में ये मीडिया निर्देश काम करते हैं. इन निर्देशों को डिफ़ॉल्ट रूप से लागू करने का तरीका, cast.framework.PlayerManager
में बताया गया है.
कमांड | ब्यौरा |
---|---|
Play | वीडियो को रोके जाने के बाद, उसे चलाएं या फिर से शुरू करें. |
रोकना | फ़िलहाल चल रहे कॉन्टेंट को रोकें. |
पिछला | मीडिया सूची में पिछले मीडिया आइटम पर जाएं. |
आगे बढ़ें | मीडिया सूची में मौजूद अगले मीडिया आइटम पर जाएं. |
बंद करें | फ़िलहाल चल रहा मीडिया रोकें. |
कोई नहीं दोहराएं | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची में मौजूद मीडिया आइटम दोबारा चलाने की सुविधा बंद कर दें. |
सिंगल को दोहराएं | फ़िलहाल चल रहे मीडिया को अनलिमिटेड बार दोहराएं. |
सभी को दोहराएं | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची में मौजूद सभी आइटम दोहराए जाएंगे. |
सभी को दोहराएं और शफ़ल करें | सूची में मौजूद आखिरी आइटम के चलने के बाद, सूची को शफ़ल करें और सूची में मौजूद सभी आइटम दोहराएं. |
शफ़ल करें | मीडिया सूची में मौजूद मीडिया आइटम को शफ़ल करें. |
सबटाइटल चालू या बंद करना | अपने मीडिया के लिए सबटाइटल की सुविधा चालू या बंद करें. भाषा के हिसाब से भी, चालू / बंद करने की सुविधा उपलब्ध है. |
वीडियो को एब्सॉल्यूट समय पर ले जाएं | एब्सॉलूट टाइम के तौर पर तय किए गए समय पर ले जाता है. |
मौजूदा समय के समय के हिसाब से वीडियो पर जाएं | वीडियो चलाने के मौजूदा समय के हिसाब से, वीडियो को आगे या पीछे ले जाता है. |
फिर से चलाएं | अगर कोई मीडिया नहीं चल रहा है, तो आखिरी बार चलाया गया मीडिया आइटम चलाएं. इसके अलावा, अगर कोई मीडिया चल रहा है, तो उसे फिर से शुरू करें. |
वीडियो चलाने की स्पीड सेट करना | मीडिया चलाने की स्पीड में बदलाव करना. यह डिफ़ॉल्ट रूप से मैनेज हो जाना चाहिए. किराये के अनुरोधों को बदलने के लिए, 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;
});
बोलकर की गई गतिविधि को बैकग्राउंड में चलाना
अगर Assistant की गतिविधि की वजह से, Cast प्लैटफ़ॉर्म आपके ऐप्लिकेशन के साउंड को बैकग्राउंड में भेजता है, तो गतिविधि शुरू होने पर, वेब रिसीवर ऐप्लिकेशन को NOT_IN_FOCUS
का FocusState
मैसेज भेजा जाता है. जैसे, उपयोगकर्ता की बात सुनना या उससे बातचीत करना. गतिविधि खत्म होने पर, 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 ऐप्लिकेशन या स्मार्ट डिसप्ले का इस्तेमाल करके, मौजूदा ऑडियो और वीडियो स्ट्रीम को एक से दूसरे डिवाइस पर ले जा सकते हैं. मीडिया एक डिवाइस (सोर्स) पर चलना बंद हो जाता है और दूसरे डिवाइस (डेस्टिनेशन) पर चलता रहता है. नए फ़र्मवेयर वाला कोई भी Cast डिवाइस, स्ट्रीम ट्रांसफ़र में सोर्स या डेस्टिनेशन के तौर पर काम कर सकता है.
स्ट्रीम ट्रांसफ़र के लिए इवेंट फ़्लो यह है:
- सोर्स डिवाइस पर:
- मीडिया चलना बंद हो जाता है.
- वेब रिसीवर ऐप्लिकेशन को मीडिया की मौजूदा स्थिति सेव करने का निर्देश मिलता है.
- वेब रिसीवर ऐप्लिकेशन बंद हो जाता है.
- डेस्टिनेशन डिवाइस पर:
- वेब रिसीवर ऐप्लिकेशन लोड हो गया है.
- वेब रिसीवर ऐप्लिकेशन को, सेव किए गए मीडिया की स्थिति को वापस लाने का निर्देश मिलता है.
- मीडिया फिर से चलने लगता है.
मीडिया की स्थिति के एलिमेंट में ये चीज़ें शामिल हैं:
- गाने, वीडियो या मीडिया आइटम की खास जगह या टाइमस्टैंप.
- किसी बड़ी सूची (जैसे, प्लेलिस्ट या कलाकार रेडियो) में उसका क्रम.
- पुष्टि किया गया उपयोगकर्ता.
- वीडियो चलाने की स्थिति (उदाहरण के लिए, वीडियो चल रहा है या रोका गया है).
संगीत को दूसरे स्पीकर पर चलाने की सुविधा चालू करना
अपने वेब रिसीवर के लिए स्ट्रीम ट्रांसफ़र लागू करने के लिए:
STREAM_TRANSFER
कमांड का इस्तेमाल करके,supportedMediaCommands
को अपडेट करें:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- सेशन की स्थिति को बनाए रखना में बताए गए तरीके से,
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 सेकंड पहले प्रीलोड हो जाएगा. अगर प्रीलोड करने में लगने वाला समय, मौजूदा आइटम के लिए बचे हुए समय से ज़्यादा है, तो प्रीलोड जल्द से जल्द हो जाएगा. इसलिए, अगर queueItem पर प्रीलोड की बहुत बड़ी वैल्यू दी जाती है, तो ऐसा हो सकता है कि मौजूदा आइटम चलाने के दौरान, अगले आइटम को पहले से ही प्रीलोड किया जा रहा हो. हालांकि, हम इसकी सेटिंग और विकल्प को डेवलपर पर छोड़ देते हैं, क्योंकि इस वैल्यू से, चल रहे आइटम के बैंडविड्थ और स्ट्रीमिंग की परफ़ॉर्मेंस पर असर पड़ सकता है.
कॉन्टेंट को पहले से लोड करने की सुविधा, एचएलएस, डैश, और स्मूद स्ट्रीमिंग वाले कॉन्टेंट के लिए डिफ़ॉल्ट रूप से काम करेगी.
सामान्य MP4 वीडियो और MP3 जैसी ऑडियो फ़ाइलें पहले से लोड नहीं होंगी, क्योंकि Cast डिवाइसों पर सिर्फ़ एक मीडिया एलिमेंट काम करता है. साथ ही, किसी मौजूदा कॉन्टेंट आइटम के चलने के दौरान, उसे पहले से लोड करने के लिए इस्तेमाल नहीं किया जा सकता.
पसंद के मुताबिक मैसेज
वेब रिसीवर ऐप्लिकेशन के लिए, मैसेज एक्सचेंज करना इंटरैक्शन का मुख्य तरीका है.
भेजने वाला व्यक्ति, वेब रिसीवर को मैसेज भेजता है. इसके लिए, वह उस प्लैटफ़ॉर्म के लिए भेजने वाले एपीआई का इस्तेमाल करता है जिस पर वह काम कर रहा है (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 वेब रिसीवर, वीडियो चलाने के लिए आपके इनपुट का इस्तेमाल कैसे करता है. साथ ही, इसमें Android TV के साथ काम करने के बारे में भी बताया गया है.
अपने ऐप्लिकेशन को रिमोट कंट्रोल के साथ इंटिग्रेट करना
Android TV डिवाइस पर चलने वाला Google वेब रिसीवर, डिवाइस के कंट्रोल इनपुट (जैसे, हाथ में पकड़े जाने वाले रिमोट कंट्रोल) से मिले इनपुट को 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 पर छिपी हुई समस्याएं पता चल सकती हैं.
- मीडिया अपडेट करते समय,
<audio>/<video>
timeupdate
,pause
, औरwaiting
जैसे एलिमेंट से ट्रिगर किए गए मीडिया से जुड़े इवेंट का इस्तेमाल करें.progress
,suspend
, औरstalled
जैसे नेटवर्क से जुड़े इवेंट का इस्तेमाल करने से बचें, क्योंकि ये प्लैटफ़ॉर्म पर निर्भर होते हैं. अपने रिसीवर में मीडिया इवेंट मैनेज करने के बारे में ज़्यादा जानने के लिए, मीडिया इवेंट देखें. - रिसीवर साइट के एचटीटीपीएस सर्टिफ़िकेट कॉन्फ़िगर करते समय, इंटरमीडियरी सीए सर्टिफ़िकेट शामिल करना न भूलें. पुष्टि करने के लिए, Qualsys एसएसएल टेस्ट पेज पर जाएं: अगर आपकी साइट के लिए भरोसेमंद सर्टिफ़िकेट पाथ में, “ज़्यादा डाउनलोड” लेबल वाला सीए सर्टिफ़िकेट शामिल है, तो हो सकता है कि वह Android-based प्लैटफ़ॉर्म पर लोड न हो.
- Chromecast, रिसीवर पेज को 720 पिक्सल के ग्राफ़िक प्लैन पर दिखाता है. हालांकि, Android TV के साथ-साथ अन्य Cast प्लैटफ़ॉर्म, पेज को 1080 पिक्सल तक दिखा सकते हैं. पक्का करें कि रिसीवर पेज, अलग-अलग रिज़ॉल्यूशन में सही तरीके से स्केल हो.