تحتوي هذه الصفحة على مقتطفات رمز ووصف للميزات المتاحة تطبيق جهاز استقبال ويب مخصص.
- عنصر
cast-media-player
يمثّل واجهة المستخدم المضمَّنة في المشغّل المتوفّرة مع WebRecipient. - نمط مخصّص يشبه CSS للعنصر
cast-media-player
لإنشاء أنماط مختلفة عناصر واجهة المستخدم مثلbackground-image
وsplash-image
font-family
- عنصر نص برمجي لتحميل إطار عمل WebRecipient.
- رمز JavaScript لاعتراض الرسائل والتعامل مع الأحداث
- قائمة انتظار التشغيل التلقائي.
- خيارات تهيئة التشغيل.
- خيارات لضبط سياق مستقبل الويب.
- خيارات لضبط الأوامر التي يتيحها تطبيق WebRecipient.
- طلب JavaScript لبدء تطبيق Web Acceptr
إعدادات التطبيق وخياراته
إعداد التطبيق
تشير رسالة الأشكال البيانية
CastReceiverContext
هي الفئة الخارجية التي يتعرض لها المطور، وتدير تحميل
المكتبات الأساسية ويعالج إعداد حزمة تطوير البرامج (SDK) لجهاز الاستقبال على الويب. حزمة SDK
توفّر واجهات برمجة التطبيقات التي تسمح لمطوّري التطبيقات بضبط حزمة تطوير البرامج (SDK) من خلال
CastReceiverOptions
يتم تقييم عمليات الضبط هذه مرة واحدة لكل عملية تشغيل تطبيق وتمريرها إلى
حزمة SDK عند تعيين المعلمة الاختيارية في طلب
start
يوضح المثال أدناه كيفية تجاوز السلوك الافتراضي لاكتشاف ما إذا
اتصال المرسل لا يزال متصلاً بنشاط. عندما لا يكون لدى مستلم الويب
تمكنت من التواصل مع المرسل بالنسبة
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) استلام الويب" طريقة لضبط التشغيل.
مثل DRM
المعلومات،
وإعادة محاولة التكوينات، ومعالجات الطلب باستخدام
cast.framework.PlaybackConfig
يتم التعامل مع هذه المعلومات من خلال
PlayerManager
ويتم تقييمه عند إنشاء اللاعبين. تم إنشاء اللاعبين
في كل مرة يتم فيها تمرير تحميل جديد إلى حزمة تطوير البرامج (SDK) لجهاز الاستقبال على الويب. التعديلات على
يتم تقييم قيمة PlaybackConfig
بعد إنشاء اللاعب في المرحلة التالية.
تحميل المحتوى. توفر حزمة SDK الطرق التالية لتعديل
PlaybackConfig
CastReceiverOptions.playbackConfig
لإلغاء خيارات التهيئة الافتراضية عند تهيئةCastReceiverContext
PlayerManager.getPlaybackConfig()
للحصول على الإعدادات الحالية.PlayerManager.setPlaybackConfig()
لإلغاء الإعدادات الحالية. يتم تطبيق هذا الإعداد على جميع عمليات التحميل اللاحقة أو إلى أن يتم إلغاؤها مرة أخرى.PlayerManager.setMediaPlaybackInfoHandler()
لتطبيق الإعدادات الإضافية فقط على عنصر الوسائط الذي يتم تحميله عليه أعلى الإعدادات الحالية. يتم استدعاء المعالج قبل اللاعب مباشرةً الإنشاء. التغييرات التي يتم إجراؤها هنا ليست دائمة ولا يتم تضمينها في طلبات البحث إلىgetPlaybackConfig()
. عند تحميل عنصر الوسائط التالي، يستخدم هذا المعالج مرة أخرى.
يوضّح المثال أدناه كيفية ضبط PlaybackConfig
عند إعداد
CastReceiverContext
تلغي الإعدادات الطلبات الصادرة
الحصول على البيانات. يحدد المعالج أن طلبات التحكم في الوصول إلى سياسة مشاركة الموارد المتعددة المصادر (CORS)
باستخدام بيانات اعتماد مثل ملفات تعريف الارتباط أو عناوين التفويض.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
يوضّح المثال أدناه كيفية إلغاء PlaybackConfig
باستخدام دالة getter.
والتعيين المقدم في PlayerManager
. يؤدي الإعداد إلى ضبط المشغّل على
استئناف تشغيل المحتوى بعد تحميل مقطع واحد
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
يوضح المثال أدناه كيفية تجاهل PlaybackConfig
لعملية تحميل معيّنة.
عند الطلب باستخدام معالِج معلومات تشغيل الوسائط. يستدعي المعالج تطبيقًا.
تم تنفيذ الطريقة getLicenseUrlForMedia
للحصول على licenseUrl
من
العنصر الحالي contentId
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
أداة معالجة الحدث
إنّ حزمة تطوير برامج الويب لجهاز الاستقبال تسمح لتطبيق WebRecipient بمعالجة أحداث المشغّل. تشير رسالة الأشكال البيانية
أداة معالجة الحدث تأخذ
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
});
اعتراض الرسالة
تسمح حزمة تطوير برامج الويب لجهاز الاستقبال لتطبيق WebRecipient باعتراض الرسائل
وتنفيذ رمز مخصص على هذه الرسائل. يأخذ معترض الرسالة
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
هو السمة المقترَحة التي يمكن استخدامها في عملية التنفيذ لكلّ من المُرسِل تطبيقات الاستقبال. الموقع هو عنوان URL لرابط صفحة معيّنة في التطبيق يمكن أن يكون قائمة تشغيل. أو محتوى وسائط. يجب أن يحلِّل التطبيق عنوان URL هذا لملء حقل واحد على الأقل من الحقلين الآخرين.contentUrl
مع عنوان URL القابل للتشغيل الذي سيستخدمه المشغّل لتحميل المحتوى. على سبيل المثال، يمكن أن يشير عنوان URL هذا إلى بيان DASH.contentId
يمكن أن يكون إما عنوان URL لمحتوى قابل للتشغيل (على نحو يشبه عنوانcontentUrl
) أو معرّف فريد للمحتوى أو قائمة التشغيل التي يتم تحميلها. في حال استخدام هذه السمة كمعرّف، يجب أن يملأ تطبيقك عنوان URL قابل للتشغيل فيcontentUrl
.
الاقتراح هو استخدام entity
لتخزين المعرّف الفعلي أو المعلَمات الأساسية.
استخدام contentUrl
لعنوان URL للوسائط. وهناك مثال على ذلك في
المقتطف التالي حيث يتوفّر entity
في طلب LOAD
يتم استرداد 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" والبلوتوث والعرض والصوت المتصلَين
الأجهزة.
تُرجع هذه الطريقة كائنًا يمكنك الاستعلام عنه من خلال تمرير أحد
تعدادات محددة للحصول على قدرة الجهاز على هذا التعداد. تُعد التعدادات
محددة في
cast.framework.system.DeviceCapabilities
يتحقق هذا المثال مما إذا كان جهاز استقبال الويب قادرًا على تشغيل HDR
DolbyVision (DV) باستخدام مفتاحَي IS_HDR_SUPPORTED
وIS_DV_SUPPORTED
على التوالي.
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) والطلبات الصوتية المزوّدة بخدمة "مساعد Google" الأجهزة، وعناصر التحكّم باللمس على الشاشات الذكية، وأجهزة التحكّم عن بُعد على Android TV الأجهزة. توفّر حزمة تطوير البرامج (SDK) للإرسال العديد من واجهات برمجة التطبيقات للسماح لتطبيق "جهاز استقبال الويب" التعامل مع هذه التفاعلات، وتحديث واجهة مستخدم التطبيق من خلال حالات إجراءات المستخدم ويمكنك إرسال التغييرات لتعديل أي خدمات خلفية، إذا أردت ذلك.
طلبات الوسائط المتوافقة
تعتمد حالات عناصر تحكم واجهة المستخدم على
MediaStatus.supportedMediaCommands
لوحدات التحكم الموسّعة وأجهزة الاستقبال ووحدات التحكم عن بُعد التي تعمل على أجهزة iOS وAndroid
التطبيقات التي تعمل على الأجهزة التي تعمل باللمس، وتطبيقات الاستقبال على أجهزة Android TV. عندما
تم تفعيل Command
على مستوى بت معيّن في الخاصية، وهي الأزرار
المرتبطة بهذا الإجراء مفعّلة. وإذا لم يتم ضبط القيمة، فإن الزر
غير مفعّل. يمكن تغيير هذه القيم على مستقبل الويب من خلال:
- استخدام
PlayerManager.setSupportedMediaCommands
لتعيينCommands
- إضافة أمر جديد باستخدام
addSupportedMediaCommands
- إزالة أمر موجود باستخدام
removeSupportedMediaCommands
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
عندما يحضِّر المُستلِم "MediaStatus
" المُعدَّل، سيتضمّن البيانات
التغييرات في السمة supportedMediaCommands
. عندما تكون الحالة
التي يتم بثها، ستُعدِّل تطبيقات المُرسِلين الأزرار في واجهة المستخدم
وفقًا لذلك.
لمزيد من المعلومات حول أوامر الوسائط المتوافقة والأجهزة التي تعمل باللمس، راجع
Accessing UI controls
الدليل.
إدارة حالات إجراءات المستخدم
عندما يتفاعل المستخدمون مع واجهة المستخدم أو يرسلون أوامر صوتية، يمكنهم التحكم في
تشغيل المحتوى والخصائص ذات الصلة بالعنصر قيد التشغيل. الطلبات
التي تتحكم في التشغيل، وتتولى حزمة SDK التعامل معها تلقائيًا. الطلبات التي
تعديل خصائص العنصر الحالي قيد التشغيل، مثل أمر LIKE
،
أن يتعامل تطبيق المُستلِم معها توفر حزمة SDK سلسلة من
واجهات برمجة التطبيقات (API) لمعالجة هذه الأنواع من الطلبات. لدعم هذه الطلبات، يُرجى ملاحظة ما يلي:
يجب القيام به:
- ضبط
MediaInformation
userActionStates
مع الإعدادات المفضّلة للمستخدم عند تحميل ملف وسائط. - اعتراض رسائل
USER_ACTION
وتحديد الإجراء المطلوب. - يُرجى تحديث
UserActionState
فيMediaInformation
لتحديث واجهة المستخدم.
يعترض المقتطف التالي طلب LOAD
ويملأ
MediaInformation
لـ LoadRequestData
. في هذه الحالة، يرغب المستخدم في
المحتوى الجاري تحميله.
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
وإما يضيف أو
لإزالة UserActionState
من MediaInformation
. تحديث
تغيّر UserActionState
من MediaInformation
حالة الزر الذي
مرتبط بالإجراء المطلوب. ينعكس هذا التغيير في التقارير الذكية
واجهة مستخدم أدوات التحكّم في الشاشة وتطبيق التحكّم عن بُعد وواجهة مستخدم Android TV من المهم أيضًا
يتم البث عبر رسائل MediaStatus
الصادرة لتعديل واجهة مستخدم
وحدة تحكم موسّعة لمرسلي أجهزة iOS وAndroid.
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;
}
الطلبات الصوتية
تتوفّر أوامر الوسائط التالية حاليًا في حزمة تطوير البرامج (SDK) لجهاز الاستقبال على الويب لما يلي:
الأجهزة المزوّدة بخدمة "مساعد Google" عمليات التنفيذ الافتراضية لهذه الأوامر هي
تم العثور عليها في
cast.framework.PlayerManager
Command | الوصف |
---|---|
Play | تشغيل أو استئناف التشغيل من حالة الإيقاف المؤقت |
إيقاف مؤقت | إيقاف المحتوى الذي يتم تشغيله حاليًا مؤقتًا |
السابق | يمكنك التخطي إلى عنصر الوسائط السابق في قائمة انتظار الوسائط. |
التالي | يمكنك التخطي إلى عنصر الوسائط التالي في قائمة انتظار الوسائط. |
إيقاف | لإيقاف الوسائط قيد التشغيل حاليًا. |
عدم التكرار | لإيقاف تكرار عناصر الوسائط في قائمة الانتظار بعد انتهاء تشغيل آخر عنصر في قائمة الانتظار. |
تكرار أغنية واحدة | تكرار الوسائط قيد التشغيل حاليًا إلى أجل غير مسمى |
تكرار الكل | كرر جميع العناصر في قائمة الانتظار بمجرد تشغيل العنصر الأخير في قائمة الانتظار. |
تكرار الكل وترتيب أغانيك عشوائيًا | بعد انتهاء تشغيل آخر عنصر في قائمة الانتظار، يمكنك ترتيب قائمة الانتظار عشوائيًا وتكرار جميع العناصر في قائمة الانتظار. |
ترتيب عشوائي | يمكنك ترتيب ملفات الوسائط في قائمة انتظار الوسائط عشوائيًا. |
تفعيل أو إيقاف ميزة "الترجمة والشرح" | تفعيل أو إيقاف ميزة "الترجمة والشرح" للوسائط تفعيل / إيقاف متاح أيضًا حسب اللغة. |
الانتقال إلى الوقت المطلق | للانتقال إلى الوقت المطلق المحدد. |
الترجيع إلى الوقت بالنسبة إلى الوقت الحالي | الانتقال للأمام أو للخلف حسب الفترة الزمنية المحدّدة مقارنةً بوقت التشغيل الحالي |
اللعب مرة أخرى | يمكنك إعادة تشغيل الوسائط قيد التشغيل حاليًا أو تشغيل آخر عنصر وسائط تم تشغيله إذا لم يتم تشغيل أي منها حاليًا. |
ضبط معدل التشغيل | تنويع معدل تشغيل الوسائط. ومن المفترض أن يتم التعامل مع هذا بشكل تلقائي. يمكنك استخدام أداة اعتراض الرسائل SET_PLAYBACK_RATE لإلغاء طلبات معدّل الرسائل الواردة. |
طلبات الوسائط المتوافقة باستخدام الصوت
لمنع طلب صوتي من تشغيل أمر وسائط على "مساعد Google"
جهاز مزوّد، يجب أولاً تعيين
طلبات الوسائط المتوافقة
التي تخطط لدعمها. بعد ذلك، يجب فرض هذه الأوامر من خلال تفعيل
الـ
CastReceiverOptions.enforceSupportedCommands
الموقع. ستتغير واجهة المستخدم في أجهزة مُرسِلي حزمة تطوير البرامج (SDK) لتقنية Google Cast والأجهزة التي تعمل باللمس إلى
تعكس هذه التكوينات. إذا لم تكن العلامة مُفعَّلة، سيتم تشغيل الصوت الوارد.
التي سيتم تنفيذها.
على سبيل المثال، في حال السماح بالوصول إلى PAUSE
من تطبيقات المُرسِلين
الأجهزة التي تعمل باللمس، فيجب عليك أيضًا تهيئة جهاز الاستقبال ليعكس
الإعدادات. عند ضبط الإعدادات، سيتم تجاهل أي طلبات صوتية واردة إذا لم يتم ضبطها.
في قائمة الأوامر المتوافقة.
في المثال أدناه، نعرض القيمة CastReceiverOptions
عند البدء.
CastReceiverContext
. وقد أضفنا دعمًا للأمر PAUSE
وفرضت على المشغل دعم هذا الأمر فقط. الآن، إذا طلب أمر صوتي
طلب عملية أخرى مثل SEEK
، سيتم رفضه. سيكون المستخدم
إلى أن الأمر غير مدعوم حتى الآن.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
ويمكنك تطبيق منطق منفصل لكل أمر تريد تقييده. إزالة
علامة enforceSupportedCommands
ولكل أمر تريد تنفيذه
اعتراض الرسائل الواردة. نعترض هنا الطلب
التي توفّرها حزمة تطوير البرامج (SDK) لكي يتم إصدار أوامر SEEK
للأجهزة المزوّدة بخدمة "مساعد Google"
عدم بدء التقديم/الترجيع في تطبيق WebRecipient.
بالنسبة إلى أوامر الوسائط التي لا يدعمها التطبيق، يمكنك إرجاع ملف
سبب الخطأ، مثل
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;
});
الخلفية استنادًا إلى النشاط الصوتي
إذا كانت النظام الأساسي للبث يحوّل صوت تطبيقك إلى الخلفية بسبب استخدام "مساعد Google"
نشاط مثل الاستماع إلى كلام المستخدم أو الرد عليه،
FocusState
يتم إرسال رسالة NOT_IN_FOCUS
إلى تطبيق "جهاز استقبال الويب" عند
بدء النشاط. يتم إرسال رسالة أخرى إلى "IN_FOCUS
" عند انتهاء النشاط.
اعتمادًا على التطبيق والوسائط التي يتم تشغيلها، قد تحتاج إلى
إيقاف الوسائط مؤقتًا عندما تكون قيمة FocusState
هي NOT_IN_FOCUS
من خلال اعتراض الرسالة
النوع FOCUS_STATE
.
على سبيل المثال، من المفيد إيقاف تشغيل الكتاب المسموع مؤقتًا إذا كانت يستجيب "مساعد Google" لطلب بحث المستخدم.
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
تشير معلمة الرسالة الواردة إلى ما إذا كانت اللغة المرتبطة
يقترحها المستخدم أو يطلبها صراحةً.
على سبيل المثال، يتم ضبط isSuggestedLanguage
على true
للأمر "OK Google،
تفعيل الترجمة والشرح" لأنه تم استنتاج اللغة من خلال اللغة
ما تم التحدث فيه. إذا تم طلب اللغة بشكل صريح، مثل "OK
Google، أريد تفعيل ميزة الشرح باللغة الإنجليزية"، تم ضبط isSuggestedLanguage
على false
.
البيانات الوصفية والبث الصوتي
على الرغم من أن مستقبل الويب يتعامل تلقائيًا مع الأوامر الصوتية، إلا أنه يجب ضمان أن تكون البيانات الوصفية للمحتوى كاملة ودقيقة يضمن ذلك أن ويتعامل "مساعد Google" مع الطلبات الصوتية بشكل صحيح وأن البيانات الوصفية يظهر بشكل صحيح عبر أنواع جديدة من الواجهات مثل تطبيق Google Home الشاشات الذكية مثل Google Home Hub
نقل البث
يتم الاحتفاظ بحالة الجلسة أساس نقل البث، حيث يمكن للمستخدمين نقل ملفات الصوت والفيديو الحالية على جميع الأجهزة باستخدام الطلبات الصوتية وGoogle Home التطبيقات أو الشاشات الذكية. يتوقف تشغيل الوسائط على أحد الأجهزة (المصدر) ويستمر على جهاز آخر ( الوجهة). يمكن لأي جهاز بث يتضمّن أحدث البرامج الثابتة العمل كمصادر أو وجهات في نقل البث.
في ما يلي تدفُّق الحدث لنقل البث:
- على الجهاز المصدر:
- يتوقف تشغيل الوسائط.
- يتلقّى تطبيق "جهاز استقبال الويب" أمرًا لحفظ الوسائط الحالية الولاية.
- إيقاف تشغيل تطبيق WebRecipient.
- على جهاز الوجهة:
- يتم تحميل تطبيق "جهاز استقبال الويب".
- يتلقى تطبيق WebRecipients أمرًا لاستعادة الوسائط المحفوظة الولاية.
- يتم استئناف تشغيل الوسائط.
تشمل عناصر حالة الوسائط ما يلي:
- الموضع المحدّد أو الطابع الزمني للأغنية أو الفيديو أو عنصر الوسائط
- ويتم وضعه في قائمة انتظار أوسع (مثل قائمة تشغيل أو راديو لفنّان معيّن).
- المستخدِم الذي تمت مصادقته.
- حالة التشغيل (مثل التشغيل أو الإيقاف المؤقت)
تفعيل نقل البث
لتنفيذ نقل البث في مستقبل الويب:
- تعديل
supportedMediaCommands
باستخدام الأمرSTREAM_TRANSFER
: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;
});
يمكن استرداد البيانات المخصّصة من
loadRequestData.customData
في اعتراض الرسالة RESUME_SESSION
.
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;
});
التحميل المُسبق للمحتوى
يتيح جهاز استقبال الويب التحميل المُسبق لملفات الوسائط بعد التشغيل الحالي العنصر في قائمة الانتظار.
تؤدي عملية التحميل المسبق إلى تنزيل عدة أجزاء من العناصر القادمة. يتم وضع المواصفات في preloadTime في الكائن QueueItem (القيمة التلقائية هي 20 ثانية إذا لم يتم توفيرها). يتم التعبير عن الوقت بالثواني، نسبةً إلى نهاية العنصر قيد التشغيل حاليًا . القيم الموجبة فقط هي صالحة. على سبيل المثال، إذا كانت القيمة 10 ثوانٍ، سيتم تحميل هذا العنصر مسبقًا لمدة 10 ثوانٍ. ثوانٍ قبل انتهاء العنصر السابق. في حال كان وقت التحميل المُسبق أكبر الوقت المتبقي في العنصر الحالي، سيحدث التحميل المسبق بمجرد ممكن. لذا، إذا تم تحديد قيمة كبيرة جدًا للتحميل المسبق في ملف playlistItem، فإن قيمة يمكننا تحقيق تأثير عندما نقوم بتشغيل العنصر الحالي الذي التحميل المسبق للعنصر التالي مسبقًا. ومع ذلك، نترك إعداد واختيار هذا التغيير إلى المطوّر لأنّ هذه القيمة قد تؤثّر في معدّل نقل البيانات وأداء البث. العنصر قيد التشغيل الحالي.
تتوافق ميزة التحميل المُسبق مع البث المباشر وفق بروتوكول HTTP (HLS) وDASH وSmooth (السلاسة) تلقائيًا.
لن يتم تحميل ملفات الفيديو والصوت العادية بتنسيق 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();
بالمثل، يمكن لتطبيقات "استقبال الويب" إبقاء المُرسِلين على اطّلاع بالحالة
مستقبِل الويب من خلال إرسال رسائل إلى المرسلين المتصلين. جهاز استقبال الويب
يمكن للتطبيق إرسال رسائل باستخدام
sendCustomMessage(namespace, senderId, message)
في
CastReceiverContext
يمكن لمستلم الويب إرسال رسائل إلى مرسل معين، إما ردًا على
رسالة مُستلَمة أو بسبب تغيير في حالة التطبيق. أبعد من نقطة البداية
المراسلة (بحد أقصى 64 كيلوبايت)، قد يبث مستقبل الويب أيضًا رسائل إلى
جميع المرسلين المتصلين.
البث للأجهزة الصوتية
راجِع دليل Google Cast للأجهزة الصوتية للحصول على الدعم بشأن الصوت. التشغيل فقط.
Android TV
يناقش هذا القسم كيفية استخدام جهاز استقبال الويب من Google للإدخالات أثناء تشغيل البيانات، والتوافق مع Android TV
دمج تطبيقك مع وحدة التحكم عن بُعد
جهاز استقبال الويب من Google الذي يعمل على جهاز Android TV يترجم الإدخال من
إدخالات التحكّم بالجهاز (أي جهاز التحكّم عن بُعد المحمول باليد) كتشغيل للوسائط
تم تحديدها لمساحة الاسم urn:x-cast:com.google.cast.media
، على النحو التالي
كما هو موضح في رسائل تشغيل الوسائط.
أن يدعم التطبيق هذه الرسائل للتحكم في وسائط التطبيق
بهدف السماح بالتحكّم بالتشغيل الأساسي من جهاز التحكّم في Android TV
المدخلات.
إرشادات التوافق مع Android TV
فيما يلي بعض التوصيات والمخاطر الشائعة التي يجب تجنبها لضمان يتوافق تطبيقك مع Android TV:
- يُرجى الانتباه إلى أنّ سلسلة وكيل المستخدم تحتوي على كل من "Android" و"CrKey"؛ فقد تعيد بعض المواقع التوجيه إلى موقع للأجهزة الجوّالة فقط لأنها تكتشف "Android" التصنيف. لا تفترض أن "Android" في سلسلة وكيل المستخدم دائمًا تشير إلى مستخدم الهاتف المحمول.
- قد تستخدم حزمة الوسائط في Android رمز GZIP شفافًا لجلب البيانات. يُرجى التأكد من أنّ:
يمكن لبيانات الوسائط أن تستجيب لـ
Accept-Encoding: gzip
. - قد يتم تشغيل أحداث وسائط HTML5 في Android TV في توقيتات مختلفة عن Chromecast، قد يؤدي هذا إلى كشف المشاكل التي كانت مخفية على Chromecast.
- عند تعديل الوسائط، استخدِم الأحداث ذات الصلة بالوسائط التي تم إطلاقها من قِبل "
<audio>/<video>
". العناصر، مثلtimeupdate
وpause
وwaiting
. تجنب استخدام الاتصال بالشبكات أحداث ذات صلة مثلprogress
وsuspend
وstalled
، إذ غالبًا ما تكون يعتمد على النظام الأساسي. الاطّلاع على أحداث الوسائط للحصول على مزيد من المعلومات حول كيفية التعامل مع أحداث الوسائط في المستلِم. - عند إعداد شهادات HTTPS للموقع الإلكتروني المستلِم، يُرجى التأكُّد من تضمين شهادات CA المتوسطة. يمكنك الاطّلاع على صفحة اختبار طبقة المقابس الآمنة (SSL) في Qualsys التحقق: إذا كان مسار الشهادة الموثوق بها لموقعك يتضمن مرجعًا تصديقًا شهادة تحمل اسم "تنزيل إضافي"، فقد لا يتم تحميلها على أجهزة Android الأساسية.
- وفي حين يعرض جهاز Chromecast صفحة جهاز الاستقبال على مستوى رسومات بدقة 720p، هناك يمكن أن تعرض منصات البث، بما في ذلك Android TV، الصفحات بدقة تصل إلى 1080p. التأكد من يتم تغيير حجم صفحة المتلقي بسلاسة بدرجات دقة مختلفة.