Trang này chứa đoạn mã và nội dung mô tả về các tính năng có sẵn cho ứng dụng Trình nhận web tuỳ chỉnh.
- Một phần tử
cast-media-player
đại diện cho giao diện người dùng tích hợp sẵn của trình phát được cung cấp cùng với Web receiver. - Tạo kiểu giống CSS tuỳ chỉnh cho phần tử
cast-media-player
để tạo kiểu cho nhiều kiểu Các thành phần trên giao diện người dùng nhưbackground-image
,splash-image
vàfont-family
. - Một phần tử của tập lệnh để tải khung Web receiver.
- Mã JavaScript để chặn thông báo và xử lý sự kiện.
- Danh sách chờ tự động phát.
- Các tuỳ chọn để định cấu hình chế độ phát.
- Các tuỳ chọn để đặt ngữ cảnh Web receiver.
- Các tuỳ chọn đặt lệnh mà ứng dụng Web receiver hỗ trợ.
- Lệnh gọi JavaScript để khởi động ứng dụng Web Nhận.
Cấu hình và các tuỳ chọn của ứng dụng
Định cấu hình ứng dụng
Chiến lược phát hành đĩa đơn
CastReceiverContext
là lớp ngoài cùng mà nhà phát triển nhìn thấy và nó quản lý việc tải
các thư viện cơ bản và xử lý việc khởi chạy SDK Web receiver. SDK
cung cấp các API cho phép nhà phát triển ứng dụng định cấu hình SDK thông qua
CastReceiverOptions
.
Các cấu hình này được đánh giá một lần mỗi lần khởi chạy ứng dụng và được chuyển đến
SDK khi đặt tham số không bắt buộc trong lệnh gọi đến
start
.
Ví dụ bên dưới cho thấy cách ghi đè hành vi mặc định để phát hiện xem một
kết nối của người gửi vẫn đang được kết nối. Khi Trình nhận web chưa
liên lạc với người gửi cho
maxInactivity
giây, một sự kiện SENDER_DISCONNECTED
sẽ được gửi đi. Cấu hình bên dưới
ghi đè thời gian chờ này. Điều này có thể hữu ích khi gỡ lỗi sự cố vì nó ngăn chặn
ứng dụng Trình nhận web đóng phiên Trình gỡ lỗi từ xa Chrome khi
không có người gửi nào được kết nối ở trạng thái IDLE
.
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);
Định cấu hình trình phát
Khi tải nội dung, SDK Web receiver cung cấp cách định cấu hình chế độ phát
các biến như DRM
,
thử lại cấu hình và yêu cầu trình xử lý bằng
cast.framework.PlaybackConfig
.
Thông tin này được xử lý bởi
PlayerManager
và được đánh giá tại thời điểm tạo trình phát. Người chơi được tạo
mỗi khi có một lượt tải mới được truyền đến SDK Web receiver. Sửa đổi đối với
PlaybackConfig
sau khi người chơi được tạo sẽ được đánh giá trong
tải nội dung. SDK cung cấp các phương thức sau để sửa đổi
PlaybackConfig
.
CastReceiverOptions.playbackConfig
để ghi đè các tuỳ chọn cấu hình mặc định khi khởi chạyCastReceiverContext
.PlayerManager.getPlaybackConfig()
để lấy cấu hình hiện tại.PlayerManager.setPlaybackConfig()
để ghi đè cấu hình hiện tại. Cài đặt này được áp dụng cho tất cả tải tiếp theo hoặc cho đến khi bị ghi đè lần nữa.PlayerManager.setMediaPlaybackInfoHandler()
để áp dụng các cấu hình bổ sung chỉ cho mục nội dung đa phương tiện đang được tải ở đầu các cấu hình hiện tại. Trình xử lý được gọi ngay trước trình phát sáng tạo. Những thay đổi được thực hiện tại đây không có hiệu lực vĩnh viễn và không được đưa vào truy vấn thànhgetPlaybackConfig()
. Khi mục nội dung đa phương tiện tiếp theo được tải, trình xử lý này sẽ được gọi lại.
Ví dụ bên dưới cho biết cách đặt PlaybackConfig
khi khởi chạy
CastReceiverContext
. Cấu hình này ghi đè các yêu cầu gửi đi cho
lấy tệp kê khai. Trình xử lý chỉ định rằng các yêu cầu Access-Control của CORS
phải được thực hiện bằng thông tin xác thực như cookie hoặc tiêu đề uỷ quyền.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
Ví dụ bên dưới cho thấy cách ghi đè PlaybackConfig
bằng phương thức getter
và phương thức setter được cung cấp trong PlayerManager
. Chế độ cài đặt này định cấu hình trình phát thành
tiếp tục phát nội dung sau khi tải xong 1 đoạn.
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
Ví dụ bên dưới cho thấy cách ghi đè PlaybackConfig
cho một tải cụ thể
bằng trình xử lý thông tin phát nội dung nghe nhìn. Trình xử lý gọi một ứng dụng
triển khai phương thức getLicenseUrlForMedia
để lấy licenseUrl
từ
contentId
của mục hiện tại.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Trình nghe sự kiện
SDK Web receiver cho phép ứng dụng Web receiver của bạn xử lý các sự kiện của người chơi. Chiến lược phát hành đĩa đơn
trình nghe sự kiện sẽ lấy một tham số
cast.framework.events.EventType
thông số (hoặc một mảng các thông số này) chỉ định(các) sự kiện
sẽ kích hoạt trình nghe. Mảng được định cấu hình sẵn của
Bạn có thể tìm thấy cast.framework.events.EventType
hữu ích cho việc gỡ lỗi trong
cast.framework.events.category
.
Thông số sự kiện cung cấp thêm thông tin về sự kiện.
Ví dụ: nếu muốn biết khi nào một
mediaStatus
đang được hiển thị, bạn có thể sử dụng logic sau để xử lý
sự kiện:
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
});
Chặn tin nhắn
Web receiver SDK cho phép ứng dụng Web receiver của bạn chặn thông báo và
thực thi mã tuỳ chỉnh trên các thông báo đó. Trình chặn tin nhắn sẽ lấy
cast.framework.messages.MessageType
chỉ định loại thông báo cần chặn.
Trình chặn sẽ trả về yêu cầu đã sửa đổi hoặc một Lời hứa giúp giải quyết
với giá trị yêu cầu được sửa đổi. Việc trả lại null
sẽ ngăn việc gọi hàm
trình xử lý tin nhắn mặc định. Xem phần Tải nội dung nghe nhìn để biết thêm chi tiết.
Ví dụ: nếu muốn thay đổi dữ liệu yêu cầu tải, bạn có thể sử dụng logic sau đây để chặn và sửa đổi:
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();
Xử lý lỗi
Khi xảy ra lỗi trong trình chặn thông báo, ứng dụng Trình nhận web của bạn sẽ trả về
một ứng dụng thích hợp
cast.framework.messages.ErrorType
và
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;
});
});
Tính năng chặn tin nhắn so với trình nghe sự kiện
Dưới đây là một số điểm khác biệt chính giữa tính năng chặn thông báo và trình nghe sự kiện sau:
- Trình nghe sự kiện không cho phép bạn sửa đổi dữ liệu yêu cầu.
- Bạn nên sử dụng trình nghe sự kiện để kích hoạt chức năng phân tích hoặc hàm tuỳ chỉnh.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Tính năng chặn tin nhắn cho phép bạn nghe, chặn tin nhắn và sửa đổi chính dữ liệu yêu cầu.
- Bạn nên sử dụng tính năng chặn tin nhắn để xử lý logic tuỳ chỉnh liên quan đến dữ liệu yêu cầu.
Đang tải nội dung nghe nhìn
MediaInformation
cung cấp nhiều thuộc tính để tải phương tiện trong
cast.framework.messages.MessageType.LOAD
bao gồm entity
,
contentUrl
và contentId
.
entity
là thuộc tính được đề xuất để sử dụng trong quá trình triển khai cho cả người gửi và nhận. Tài sản là một URL liên kết sâu có thể là một danh sách phát hoặc nội dung đa phương tiện. Ứng dụng của bạn nên phân tích cú pháp URL này và điền sẵn vào ít nhất một trong hai trường còn lại.contentUrl
tương ứng với URL có thể phát mà trình phát sẽ sử dụng để tải nội dung. Ví dụ: URL này có thể trỏ đến một tệp kê khai DASH.contentId
có thể là một URL nội dung có thể phát (tương tự như URL củacontentUrl
thuộc tính) hoặc giá trị nhận dạng duy nhất cho nội dung hoặc danh sách phát đang được tải. Nếu bạn sử dụng tài sản này làm giá trị nhận dạng, thì đơn đăng ký của bạn sẽ điền giá trị URL có thể phát trongcontentUrl
.
Bạn nên sử dụng entity
để lưu trữ mã thực hoặc các tham số chính, và
sử dụng contentUrl
cho URL của phương tiện. Ví dụ về điều này được thể hiện trong
đoạn mã sau đây, trong đó entity
có trong yêu cầu LOAD
và
contentUrl
có thể phát được truy xuất:
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;
});
});
Khả năng của thiết bị
Chiến lược phát hành đĩa đơn
getDeviceCapabilities
phương thức cung cấp thông tin thiết bị trên Thiết bị truyền đã kết nối và video hoặc
thiết bị âm thanh gắn vào đó. Phương thức getDeviceCapabilities
cung cấp dịch vụ hỗ trợ
thông tin về Trợ lý Google, Bluetooth, màn hình và âm thanh đã kết nối
thiết bị.
Phương thức này trả về một đối tượng mà bạn có thể truy vấn bằng cách truyền vào một trong các
enum được chỉ định để nhận chức năng của thiết bị cho enum đó. Các enum là
được xác định trong
cast.framework.system.DeviceCapabilities
.
Ví dụ này kiểm tra xem thiết bị Web Nhận có thể phát HDR và
DolbyVision (DV) với các phím IS_HDR_SUPPORTED
và IS_DV_SUPPORTED
,
tương ứng.
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();
Xử lý hoạt động tương tác của người dùng
Người dùng có thể tương tác với ứng dụng Trình nhận web thông qua người gửi ứng dụng (Web, Android và iOS), lệnh thoại khi dùng Trợ lý thiết bị, điều khiển cảm ứng trên màn hình thông minh và điều khiển từ xa trên Android TV thiết bị. Cast SDK cung cấp nhiều API để cho phép ứng dụng Web receiver xử lý các tương tác này, cập nhật giao diện người dùng của ứng dụng thông qua các trạng thái hành động của người dùng, và tuỳ ý gửi các thay đổi để cập nhật bất kỳ dịch vụ phụ trợ nào.
Các lệnh phát nội dung nghe nhìn được hỗ trợ
Các trạng thái điều khiển giao diện người dùng được điều khiển bởi
MediaStatus.supportedMediaCommands
dành cho bộ điều khiển mở rộng dành cho người gửi iOS và Android, bộ nhận và điều khiển từ xa
ứng dụng chạy trên thiết bị cảm ứng và ứng dụng nhận trên thiết bị Android TV. Khi một
Command
được bật theo bit cụ thể trong thuộc tính, những nút
liên quan đến hành động đó. Nếu giá trị không được đặt thì nút này sẽ
tắt. Bạn có thể thay đổi các giá trị này trên Web receiver bằng cách:
- Sử dụng
PlayerManager.setSupportedMediaCommands
để đặtCommands
- Thêm lệnh mới bằng cách sử dụng
addSupportedMediaCommands
- Xoá lệnh hiện có bằng cách sử dụng
removeSupportedMediaCommands
.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Khi receiver chuẩn bị MediaStatus
được cập nhật, nó sẽ bao gồm
các thay đổi trong thuộc tính supportedMediaCommands
. Khi trạng thái là
được truyền phát, ứng dụng gửi thông báo đã kết nối sẽ cập nhật các nút trong giao diện người dùng
cho phù hợp.
Để biết thêm thông tin về các lệnh phát nội dung nghe nhìn và thiết bị cảm ứng được hỗ trợ, hãy xem
Accessing UI controls
của chúng tôi.
Quản lý trạng thái hành động của người dùng
Khi tương tác với giao diện người dùng hoặc gửi lệnh thoại, người dùng có thể kiểm soát
phát nội dung và các thuộc tính liên quan đến nội dung đang phát. Yêu cầu
điều khiển quá trình phát sẽ được SDK xử lý tự động. Yêu cầu
sửa đổi thuộc tính cho mục hiện đang phát, chẳng hạn như lệnh LIKE
,
yêu cầu ứng dụng nhận xử lý các thông báo đó. SDK cung cấp một loạt
API để xử lý các loại yêu cầu này. Để hỗ trợ các yêu cầu này, sau đây
phải thực hiện:
- Đặt
MediaInformation
userActionStates
với lựa chọn ưu tiên của người dùng khi tải một mục nội dung đa phương tiện. - Chặn
USER_ACTION
thông báo và xác định hành động theo yêu cầu. - Cập nhật
MediaInformation
UserActionState
để cập nhật giao diện người dùng.
Đoạn mã sau đây chặn yêu cầu LOAD
và điền thông tin
MediaInformation
của LoadRequestData
. Trong trường hợp này, người dùng thích
nội dung đang được tải.
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;
});
Đoạn mã sau đây chặn thông báo USER_ACTION
và xử lý lệnh gọi
phần phụ trợ có thay đổi được yêu cầu. Sau đó, Trợ lý sẽ thực hiện cuộc gọi để cập nhật
UserActionState
trên đầu thu.
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;
});
});
Đoạn mã sau đây mô phỏng một lệnh gọi đến một dịch vụ phụ trợ. Hàm này kiểm tra
UserActionRequestData
để xem loại thay đổi mà người dùng đã yêu cầu
và chỉ thực hiện lệnh gọi mạng nếu hành động đó được phần phụ trợ hỗ trợ.
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));
}
});
}
Đoạn mã sau sẽ lấy UserActionRequestData
và thêm hoặc
sẽ xoá UserActionState
khỏi MediaInformation
. Đang cập nhật
UserActionState
trong số MediaInformation
thay đổi trạng thái của nút
được liên kết với hành động được yêu cầu. Thay đổi này được phản ánh trong phương thức
giao diện người dùng điều khiển màn hình, ứng dụng điều khiển từ xa và giao diện người dùng của Android TV. Ngoài ra
đã truyền qua các thông báo MediaStatus
đi để cập nhật giao diện người dùng của
bộ điều khiển mở rộng cho người gửi iOS và 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;
}
Lệnh thoại
Các lệnh phương tiện sau hiện được hỗ trợ trong SDK Web receiver cho
Thiết bị có Trợ lý. Cách triển khai mặc định của những lệnh này là
được tìm thấy trong
cast.framework.PlayerManager
.
Lệnh | Mô tả |
---|---|
Chơi | Phát hoặc tiếp tục phát từ trạng thái tạm dừng. |
Tạm dừng | Tạm dừng nội dung đang phát. |
Trước | Chuyển đến mục nội dung nghe nhìn trước đó trong hàng đợi nội dung nghe nhìn của bạn. |
Tiếp theo | Chuyển đến mục nội dung nghe nhìn tiếp theo trong hàng đợi nội dung nghe nhìn. |
Dừng | Dừng nội dung nghe nhìn đang phát. |
Không lặp lại | Tắt tính năng lặp lại các mục nội dung nghe nhìn trong hàng đợi sau khi mục cuối cùng trong hàng đợi phát xong. |
Lặp lại một bài hát | Lặp lại nội dung nghe nhìn đang phát vô thời hạn. |
Lặp lại tất cả | Lặp lại tất cả các mục trong hàng đợi khi mục cuối cùng trong hàng đợi được phát. |
Lặp lại tất cả và phát ngẫu nhiên | Khi mục cuối cùng trong hàng đợi được phát xong, hãy xáo trộn hàng đợi và lặp lại tất cả các mục trong hàng đợi. |
Phát ngẫu nhiên | Trộn các mục nội dung nghe nhìn trong hàng đợi nội dung nghe nhìn. |
BẬT / TẮT phụ đề | Bật / Tắt phụ đề cho nội dung nghe nhìn. Bật / Tắt cũng có sẵn theo ngôn ngữ. |
Tìm kiếm đến thời gian tuyệt đối | Chuyển đến thời gian tuyệt đối được chỉ định. |
Tìm kiếm đến thời gian tương đối so với thời gian hiện tại | Tua đi hoặc tua lại theo khoảng thời gian đã chỉ định so với thời gian phát hiện tại. |
Chơi lại | Khởi động lại nội dung nghe nhìn đang phát hoặc phát mục nội dung nghe nhìn được phát gần đây nhất nếu hiện không có nội dung nào đang phát. |
Đặt tốc độ phát | Thay đổi tốc độ phát nội dung nghe nhìn. Vấn đề này sẽ được xử lý theo mặc định. Bạn có thể sử dụng trình chặn thông báo SET_PLAYBACK_RATE để ghi đè các yêu cầu tốc độ gửi đến. |
Các lệnh phát nội dung nghe nhìn được hỗ trợ bằng giọng nói
Cách ngăn một lệnh thoại kích hoạt lệnh đa phương tiện trên Trợ lý:
bật trên thiết bị di động, trước tiên bạn phải đặt
các lệnh nội dung nghe nhìn được hỗ trợ
mà bạn dự định hỗ trợ. Sau đó, bạn phải thực thi các lệnh đó bằng cách bật
thời gian
CastReceiverOptions.enforceSupportedCommands
thuộc tính này. Giao diện người dùng trên trình gửi SDK truyền và thiết bị có hỗ trợ cảm ứng sẽ thay đổi thành
phản ánh các cấu hình này. Nếu cờ này không được bật thì giọng nói đến
sẽ thực thi.
Ví dụ: nếu bạn cho phép PAUSE
từ các ứng dụng dành cho người gửi và
trên các thiết bị có hỗ trợ cảm ứng, bạn cũng phải định cấu hình bộ nhận để phản ánh những
phần cài đặt. Khi được định cấu hình, mọi lệnh thoại đến sẽ bị huỷ nếu không
có trong danh sách các lệnh được hỗ trợ.
Trong ví dụ bên dưới, chúng tôi sẽ cung cấp CastReceiverOptions
khi bắt đầu
CastReceiverContext
. Chúng tôi đã thêm tính năng hỗ trợ cho lệnh PAUSE
và
buộc trình phát để chỉ hỗ trợ lệnh đó. Nếu một lệnh thoại
yêu cầu một thao tác khác chẳng hạn như SEEK
thì yêu cầu này sẽ bị từ chối. Người dùng sẽ
được thông báo rằng lệnh này chưa được hỗ trợ.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Bạn có thể áp dụng logic riêng cho từng lệnh mà bạn muốn hạn chế. Gỡ bỏ (Remove)
cờ enforceSupportedCommands
và cho mỗi lệnh mà bạn muốn
hạn chế bạn có thể chặn tin nhắn đến. Ở đây, chúng tôi chặn yêu cầu
do SDK cung cấp để các lệnh SEEK
được đưa ra cho thiết bị có Trợ lý
không kích hoạt lệnh tìm kiếm trong ứng dụng Web receiver của bạn.
Đối với các lệnh phương tiện mà ứng dụng của bạn không hỗ trợ, hãy trả về một
lý do lỗi, chẳng hạn như
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;
});
chạy ở chế độ nền từ hoạt động bằng giọng nói
Nếu nền tảng Truyền phát âm thanh ứng dụng của bạn ở chế độ nền do Trợ lý
thực hiện một hoạt động như lắng nghe lời nói của người dùng hoặc nói lại,
FocusState
thông báo của NOT_IN_FOCUS
sẽ được gửi đến ứng dụng Web receiver khi
hoạt động bắt đầu. Một tin nhắn khác có IN_FOCUS
sẽ được gửi khi hoạt động này kết thúc.
Tùy thuộc vào ứng dụng của bạn và nội dung đa phương tiện đang được phát, bạn có thể muốn
tạm dừng nội dung nghe nhìn khi FocusState
là NOT_IN_FOCUS
bằng cách chặn thông báo
loại FOCUS_STATE
.
Ví dụ: việc tạm dừng phát sách nói sẽ mang lại trải nghiệm tốt cho người dùng nếu Trợ lý đang phản hồi một truy vấn của người dùng.
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;
});
Ngôn ngữ phụ đề được chỉ định bằng giọng nói
Khi người dùng không nêu rõ ngôn ngữ cho phụ đề,
ngôn ngữ dùng cho phụ đề giống với ngôn ngữ dùng để đọc lệnh.
Trong các trường hợp này,
isSuggestedLanguage
của tin nhắn đến cho biết liệu ngôn ngữ được liên kết
do người dùng đề xuất hoặc yêu cầu rõ ràng.
Ví dụ: isSuggestedLanguage
được đặt thành true
cho lệnh "OK Google,
bật phụ đề," bởi vì ngôn ngữ này được suy ra theo ngôn ngữ mà
được nhập bằng giọng nói. Nếu ngôn ngữ được yêu cầu rõ ràng, chẳng hạn như trong "OK
Google, bật phụ đề tiếng Anh" isSuggestedLanguage
được đặt thành false
.
Siêu dữ liệu và tính năng truyền giọng nói
Mặc dù theo mặc định, lệnh thoại do Web Nhận xử lý, bạn vẫn nên đảm bảo siêu dữ liệu cho nội dung của bạn đầy đủ và chính xác. Điều này đảm bảo rằng lệnh thoại được Trợ lý xử lý đúng cách và siêu dữ liệu hiển thị đúng cách trên các loại giao diện mới như ứng dụng Google Home và màn hình thông minh như Google Home Hub.
Chuyển sự kiện phát trực tiếp
Việc bảo toàn trạng thái phiên là cơ sở của quá trình chuyển luồng, trong đó người dùng có thể di chuyển luồng âm thanh và video hiện có giữa các thiết bị bằng lệnh thoại, Google Home Ứng dụng hoặc màn hình thông minh. Phương tiện ngừng phát trên một thiết bị (nguồn) và tiếp tục phát trên một thiết bị khác (nguồn) đích). Bất kỳ thiết bị Truyền nào có chương trình cơ sở mới nhất đều có thể đóng vai trò là nguồn hoặc đích trong một truyền trực tuyến.
Luồng sự kiện để chuyển sự kiện phát trực tiếp là:
- Trên thiết bị nguồn:
- Nội dung nghe nhìn sẽ ngừng phát.
- Ứng dụng Web receiver nhận lệnh lưu nội dung nghe nhìn hiện tại trạng thái.
- Ứng dụng Trình nhận web đã tắt.
- Trên thiết bị đích:
- Đã tải ứng dụng Web receiver.
- Ứng dụng Web receiver nhận được lệnh để khôi phục nội dung nghe nhìn đã lưu trạng thái.
- Nội dung nghe nhìn sẽ tiếp tục phát.
Các thành phần của trạng thái nội dung đa phương tiện bao gồm:
- Vị trí hoặc dấu thời gian cụ thể của bài hát, video hoặc mục nội dung đa phương tiện.
- Nội dung này nằm trong một hàng đợi rộng hơn (chẳng hạn như danh sách phát hoặc đài phát theo nghệ sĩ).
- Người dùng đã xác thực.
- Trạng thái phát (ví dụ: đang phát hoặc tạm dừng).
Bật tính năng chuyển sự kiện phát trực tuyến
Để triển khai chức năng chuyển luồng cho Trình thu phát web, hãy làm như sau:
- Nội dung cập nhật
supportedMediaCommands
bằng lệnhSTREAM_TRANSFER
:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- Ghi đè thông báo
SESSION_STATE
vàRESUME_SESSION
(không bắt buộc) thiết bị chặn như được mô tả trong Bảo tồn phiên trạng thái. Chỉ ghi đè những giá trị này nếu dữ liệu tuỳ chỉnh cần được lưu trữ trong ảnh chụp nhanh phiên. Nếu không, giá trị mặc định Việc triển khai việc duy trì trạng thái phiên sẽ hỗ trợ chuyển luồng.
Bảo tồn trạng thái phiên
SDK Web receiver cung cấp phương thức triển khai mặc định cho các ứng dụng Web receiver để lưu giữ trạng thái phiên bằng cách chụp nhanh trạng thái phương tiện hiện tại, chuyển đổi trạng thái thành một yêu cầu tải và tiếp tục phiên bằng yêu cầu tải.
Bạn có thể ghi đè yêu cầu tải do Web receiver tạo ra trong
SESSION_STATE
trình chặn tin nhắn nếu cần. Nếu bạn muốn thêm dữ liệu tuỳ chỉnh
vào yêu cầu tải, bạn nên đặt chúng vào
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;
});
Dữ liệu tuỳ chỉnh có thể được truy xuất từ
loadRequestData.customData
trong trình chặn thông báo 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;
});
Tải trước nội dung
Web receiver hỗ trợ việc tải trước các mục nội dung đa phương tiện sau lần phát hiện tại mục trong hàng đợi.
Thao tác tải trước sẽ tải trước một số phân đoạn của các mục sắp tới. Thông số kỹ thuật được thực hiện trên preloadTime giá trị trong Đối tượng QueueItem (mặc định là 20 giây nếu không được cung cấp). Thời gian được biểu thị bằng giây, so với cuối mục hiện đang phát . Chỉ có giá trị dương là hợp lệ. Ví dụ: nếu giá trị là 10 giây thì mục này sẽ được tải trước 10 giây trước khi mục trước kết thúc. Nếu thời gian tải trước lâu hơn so với thời gian còn lại trên currentItem, thì quá trình tải trước sẽ chỉ diễn ra ngay khi nhất có thể. Vì vậy, nếu có một giá trị rất lớn của lượt tải trước được chỉ định trênueItem, một có thể đạt được hiệu quả bất cứ khi nào chúng tôi chơi trò chơi hiện tại, đã tải trước mục tiếp theo. Tuy nhiên, chúng tôi để lại cài đặt và lựa chọn thông báo này cho nhà phát triển vì giá trị này có thể ảnh hưởng đến băng thông và hiệu suất phát trực tuyến của mục đang phát.
Theo mặc định, tính năng tải trước sẽ hoạt động đối với nội dung phát trực tuyến HLS, DASH và Êm.
Các tệp video và âm thanh MP4 thông thường như MP3 sẽ không được tải trước dưới dạng Cast Thiết bị chỉ hỗ trợ một phần tử nội dung nghe nhìn và không thể dùng để tải trước khi mục nội dung hiện có vẫn đang phát.
Thông báo tuỳ chỉnh
Trao đổi tin nhắn là phương thức tương tác chính cho các ứng dụng Web nhận.
Người gửi gửi thông báo đến Web receiver bằng API người gửi cho
nền tảng mà người gửi đang chạy (Android, iOS, Web). Đối tượng sự kiện (có
là biểu thị của một thông báo) được chuyển đến trình nghe sự kiện
phần tử dữ liệu (event.data
) nơi dữ liệu lấy các thuộc tính của
loại sự kiện cụ thể.
Ứng dụng Web receiver có thể chọn nghe tin nhắn trên không gian tên. Nhờ vậy, ứng dụng Web receiver được cho là hỗ trợ giao thức không gian tên đó. Sau đó là tuỳ thuộc vào bất kỳ người gửi nào được kết nối có mong muốn để giao tiếp trên không gian tên đó nhằm sử dụng giao thức phù hợp.
Tất cả không gian tên đều được xác định bằng một chuỗi và phải bắt đầu bằng "urn:x-cast:
"
theo sau là chuỗi bất kỳ. Ví dụ:
"urn:x-cast:com.example.cast.mynamespace
".
Dưới đây là đoạn mã để Web receiver nghe tin nhắn tuỳ chỉnh từ người gửi được kết nối:
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();
Tương tự, các ứng dụng Trình nhận web có thể thông báo cho người gửi về trạng thái
của Trình nhận trên web bằng cách gửi thư tới người gửi được kết nối. Bộ thu web
có thể gửi tin nhắn bằng
sendCustomMessage(namespace, senderId, message)
về
CastReceiverContext
.
Một Trình nhận trên web có thể gửi thư đến một người gửi riêng lẻ để phản hồi lại
thông báo đã nhận hoặc do có sự thay đổi về trạng thái của ứng dụng. Vươn xa hơn
nhắn tin (với giới hạn 64kb), một Trình thu nhận web cũng có thể truyền thông báo tới
tất cả người gửi được kết nối.
Truyền cho thiết bị âm thanh
Xem hướng dẫn về Google Cast cho thiết bị âm thanh để được hỗ trợ về âm thanh chỉ phát.
Android TV
Phần này thảo luận cách Google Web receiver sử dụng dữ liệu đầu vào của bạn để phát, và khả năng tương thích với Android TV.
Tích hợp ứng dụng của bạn với điều khiển từ xa
Bộ thu web của Google chạy trên thiết bị Android TV sẽ dịch dữ liệu đầu vào từ
đầu vào điều khiển của thiết bị (tức là điều khiển từ xa cầm tay) khi phát nội dung nghe nhìn
thông báo được xác định cho không gian tên urn:x-cast:com.google.cast.media
, như
như mô tả trong Thông báo phát nội dung nghe nhìn. Thông tin
ứng dụng phải hỗ trợ những thông báo này để kiểm soát phương tiện của ứng dụng
chế độ phát để cho phép điều khiển chế độ phát cơ bản thông qua bảng điều khiển của Android TV
đầu vào.
Nguyên tắc về khả năng tương thích với Android TV
Dưới đây là một số đề xuất và sai lầm phổ biến cần tránh để đảm bảo ứng dụng của bạn tương thích với Android TV:
- Hãy lưu ý rằng chuỗi tác nhân người dùng chứa cả "Android" và "CrKey"; một số trang web có thể chuyển hướng tới một trang web chỉ dành cho thiết bị di động vì chúng phát hiện "Android" . Đừng giả định rằng "Android" luôn trong chuỗi tác nhân người dùng cho biết người dùng thiết bị di động.
- Ngăn xếp nội dung nghe nhìn của Android có thể sử dụng GZIP rõ ràng để tìm nạp dữ liệu. Đảm bảo
dữ liệu nội dung đa phương tiện của bạn có thể phản hồi
Accept-Encoding: gzip
. - Sự kiện nội dung đa phương tiện HTML5 cho Android TV có thể được kích hoạt theo các thời gian khác với Chromecast, điều này có thể cho thấy các sự cố đã được ẩn trên Chromecast.
- Khi cập nhật nội dung nghe nhìn, hãy sử dụng các sự kiện liên quan đến nội dung nghe nhìn được
<audio>/<video>
kích hoạt nhưtimeupdate
,pause
vàwaiting
. Tránh sử dụng kết nối mạng các sự kiện liên quan nhưprogress
,suspend
vàstalled
, vì những sự kiện này thường phụ thuộc vào nền tảng. Xem bài viết Sự kiện truyền thông để biết thêm thông tin về cách xử lý các sự kiện đa phương tiện trong receiver. - Khi định cấu hình chứng chỉ HTTPS của trang web nhận, hãy nhớ cung cấp chứng chỉ CA trung gian. Xem Trang kiểm tra SSL của Qualsys để xác minh: liệu đường dẫn chứng nhận đáng tin cậy cho trang web của bạn có bao gồm CA hay không chứng chỉ có nhãn "tải xuống bổ sung", thì chứng chỉ đó có thể không tải trên nền tảng Android nền tảng.
- Trong khi Chromecast hiển thị trang bộ nhận trên mặt phẳng đồ hoạ 720p, Các nền tảng truyền (bao gồm cả Android TV) có thể hiển thị trang ở độ phân giải tối đa là 1080p. Đảm bảo trang thu của bạn sẽ điều chỉnh tỷ lệ linh hoạt ở các độ phân giải khác nhau.