1. Tổng quan
Lớp học lập trình này sẽ hướng dẫn bạn cách tạo ứng dụng Bộ thu web tùy chỉnh để phát nội dung trên thiết bị Hỗ trợ truyền.
Google Cast là gì?
Google Cast cho phép người dùng truyền nội dung từ thiết bị di động sang TV. Sau đó, người dùng có thể sử dụng trình duyệt Chrome trên thiết bị di động hoặc máy tính để bàn làm điều khiển từ xa để phát nội dung nghe nhìn trên TV.
SDK Google Cast cho phép ứng dụng điều khiển các thiết bị hỗ trợ Google Cast (ví dụ: TV hoặc hệ thống âm thanh). SDK Truyền cung cấp cho bạn các thành phần giao diện người dùng cần thiết dựa trên Danh sách kiểm tra thiết kế Google Cast.
Danh sách kiểm tra thiết kế Google Cast được cung cấp để giúp trải nghiệm người dùng Truyền đơn giản và dễ dự đoán trên tất cả các nền tảng được hỗ trợ. Xem thêm tại đây.
Chúng tôi sẽ xây dựng những gì?
Sau khi kết thúc lớp học lập trình này, bạn sẽ có ứng dụng HTML5 đóng vai trò là bộ thu tuỳ chỉnh của riêng bạn và có khả năng hiển thị nội dung video trên các thiết bị hỗ trợ Cast.
Kiến thức bạn sẽ học được
- Cách thiết lập để phát triển bộ thu.
- Thông tin cơ bản về một bộ thu hỗ trợ tính năng Truyền dựa trên Khung ứng dụng truyền.
- Cách nhận video được truyền.
- Cách tích hợp Trình ghi nhật ký gỡ lỗi.
- Cách Tối ưu hoá bộ thu cho màn hình thông minh.
Bạn cần
- Trình duyệt Google Chrome mới nhất.
- Dịch vụ lưu trữ HTTPS, chẳng hạn như Lưu trữ Firebase hoặc ngrok.
- Một thiết bị Google Cast, chẳng hạn như Chromecast hoặc Android TV được định cấu hình với quyền truy cập Internet.
- TV hoặc màn hình có đầu vào HDMI.
Trải nghiệm
- Bạn sẽ cần phải có kiến thức về phát triển web trước đây.
- Bạn cũng cần có kiến thức trước đây về việc xem TV :)
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá trải nghiệm xây dựng ứng dụng web của mình như thế nào?
Bạn đánh giá trải nghiệm xem TV của mình như thế nào?
2. Nhận mã mẫu
Bạn có thể tải tất cả mã mẫu xuống máy tính...
và giải nén tệp zip đã tải xuống.
3. Triển khai trình nhận cục bộ
Để có thể sử dụng bộ thu web với thiết bị Truyền, thiết bị này cần được lưu trữ ở nơi mà thiết bị Truyền có thể truy cập. Nếu bạn đã có máy chủ hỗ trợ https, hãy bỏ qua các hướng dẫn sau và ghi lại URL vì bạn sẽ cần URL đó trong phần tiếp theo.
Nếu không có sẵn máy chủ để sử dụng, bạn có thể sử dụng tính năng Lưu trữ Firebase hoặc ngrok.
Chạy máy chủ
Sau khi thiết lập dịch vụ mà bạn chọn, hãy chuyển đến app-start
rồi khởi động máy chủ của bạn.
Ghi lại URL của người nhận được lưu trữ. Bạn sẽ sử dụng tính năng này trong phần tiếp theo.
4. Đăng ký ứng dụng trong Cast Developer Console
Bạn phải đăng ký ứng dụng của mình để có thể chạy trình nhận tuỳ chỉnh, như được tích hợp trong lớp học lập trình này, trên thiết bị Chromecast. Sau khi đăng ký ứng dụng, bạn sẽ nhận được một ID ứng dụng mà ứng dụng người gửi của bạn phải sử dụng để thực hiện các lệnh gọi API, chẳng hạn như để khởi chạy ứng dụng nhận.
Nhấp vào "Thêm ứng dụng mới"
Chọn "Custom receiver" (Bộ thu tuỳ chỉnh), đây là công trình chúng tôi đang phát triển.
Nhập thông tin chi tiết về người nhận mới, hãy nhớ sử dụng URL mà bạn đã nhận
trong phần cuối cùng. Ghi lại ID ứng dụng được chỉ định cho người nhận hoàn toàn mới của bạn.
Bạn cũng phải đăng ký thiết bị Google Cast để thiết bị đó có thể truy cập vào ứng dụng nhận của bạn trước khi xuất bản. Sau khi bạn xuất bản ứng dụng nhận, ứng dụng đó sẽ có sẵn cho tất cả các thiết bị Google Cast. Để phục vụ cho mục đích của lớp học lập trình này, bạn nên làm việc với một ứng dụng nhận chưa được xuất bản.
Nhấp vào "Thêm thiết bị mới"
Nhập số sê-ri in ở mặt sau thiết bị Truyền và đặt tên mô tả cho số sê-ri đó. Bạn cũng có thể tìm thấy số sê-ri bằng cách truyền màn hình trong Chrome khi truy cập vào Bảng điều khiển dành cho nhà phát triển SDK của Google Cast
Bạn sẽ mất 5 đến 15 phút trước khi thiết bị nhận và thiết bị sẵn sàng để thử nghiệm. Sau khi đợi 5-15 phút, bạn phải khởi động lại thiết bị Truyền.
5. Chạy ứng dụng mẫu
Trong khi chúng ta chờ ứng dụng nhận mới sẵn sàng để thử nghiệm, hãy cùng xem ứng dụng nhận hoàn thành mẫu sẽ trông như thế nào. Bộ thu mà chúng ta sẽ tạo sẽ có khả năng phát nội dung nghe nhìn bằng cách sử dụng tính năng truyền trực tuyến tốc độ bit thích ứng (chúng ta sẽ sử dụng nội dung mẫu được mã hoá cho tính năng Truyền phát thích ứng động qua HTTP (DASH)).
Trong trình duyệt, hãy mở Công cụ Command và Control (CaC).
- Bạn sẽ thấy Công cụ CaC của chúng tôi.
- Sử dụng mã nhận mẫu "CC1AD845" mặc định và nhấp vào nút "Đặt mã ứng dụng".
- Nhấp vào nút Truyền ở trên cùng bên trái và chọn thiết bị Google Cast của bạn.
- Di chuyển đến thẻ "Tải nội dung nghe nhìn" ở trên cùng.
- Nhấp vào nút "Tải theo nội dung" để phát video mẫu.
- Video sẽ bắt đầu phát trên thiết bị Google Cast để cho thấy chức năng cơ bản của bộ thu sử dụng Bộ thu mặc định.
6. Chuẩn bị dự án bắt đầu
Chúng tôi cần thêm hỗ trợ cho Google Cast vào ứng dụng bắt đầu mà bạn đã tải xuống. Dưới đây là một số thuật ngữ của Google Cast mà chúng tôi sẽ sử dụng trong lớp học lập trình này:
- ứng dụng người gửi chạy trên thiết bị di động hoặc máy tính xách tay,
- ứng dụng trình nhận chạy trên thiết bị Google Cast.
Giờ đây, bạn đã sẵn sàng xây dựng trên dự án khởi động bằng cách sử dụng trình chỉnh sửa văn bản yêu thích:
- Chọn thư mục
app-start
trong tệp mẫu tải xuống. - Mở
js/receiver.js
vàindex.html
Lưu ý rằng trong quá trình bạn tham gia lớp học lập trình này, http-server
sẽ nhận các thay đổi mà bạn thực hiện. Nếu bạn nhận thấy chế độ này không hoạt động, hãy thử tắt rồi khởi động lại http-server
.
Thiết kế ứng dụng
Ứng dụng nhận sẽ khởi tạo phiên Truyền và sẽ chờ cho đến khi có yêu cầu LOAD (nói cách khác là phát lại một phần nội dung đa phương tiện) từ người gửi đến.
Ứng dụng này bao gồm một thành phần hiển thị chính, được xác định trong index.html
và một tệp JavaScript có tên là js/receiver.js
chứa mọi logic để giúp bộ thu của chúng ta hoạt động.
index.html
Tệp html này sẽ chứa giao diện người dùng cho ứng dụng nhận. Hiện tại, tệp này trống và chúng tôi sẽ thêm vào tệp này trong lớp học lập trình.
receiver.js
Tập lệnh này sẽ quản lý tất cả logic cho ứng dụng nhận. Hiện tại, tệp này chỉ là một tệp trống, nhưng chúng ta sẽ chuyển tệp đó thành một bộ thu Truyền đầy đủ chức năng chỉ với vài dòng mã trong phần tiếp theo.
7. Bộ thu Cast cơ bản
Bộ thu Truyền cơ bản sẽ khởi động phiên Truyền khi khởi động. Điều này cần thiết để cho tất cả ứng dụng người gửi được kết nối biết rằng người nhận đã thành công. Ngoài ra, SDK mới này còn được định cấu hình sẵn để xử lý nội dung phương tiện truyền trực tuyến tốc độ bit thích ứng (sử dụng DASH, HLS và Smooth Streaming) và các tệp MP4 đơn giản. Hãy thử xem.
Khởi chạy
Thêm mã sau vào index.html
trong tiêu đề:
<head>
...
<script src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
</head>
Thêm mã sau vào index.html
<body>
trước <footer>
đang tải receiver.js,
để cung cấp cho SDK bộ thu có không gian để hiển thị giao diện người dùng của người nhận mặc định đang được phân phối với tập lệnh bạn vừa thêm.
<cast-media-player></cast-media-player>
Bây giờ, chúng ta cần khởi chạy SDK trong js/receiver.js
, bao gồm:
- lấy thông tin tham chiếu đến
CastReceiverContext
, điểm truy cập chính của bạn vào toàn bộ SDK bộ thu - lưu trữ tham chiếu đến
PlayerManager
, đối tượng xử lý việc phát và cung cấp cho bạn tất cả các nội dung hấp dẫn mà bạn cần để cắm logic tùy chỉnh của riêng mình - khởi chạy SDK bằng cách gọi
start()
trênCastReceiverContext
Thêm nội dung sau vào js/receiver.js
.
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
context.start();
8. Truyền nội dung video "cơ bản"
Với mục đích của Lớp học lập trình này, hãy sử dụng Công cụ CaC để dùng thử bộ thu hoàn toàn mới.
Trỏ trình duyệt web của bạn vào Công cụ Command và Control (CaC).
Hãy nhớ thay thế Mã ứng dụng của bạn như đã đăng ký trước đó trong trường và nhấp vào "Đặt mã ứng dụng". Thao tác này sẽ hướng dẫn công cụ sử dụng bộ thu của bạn khi bắt đầu phiên Truyền.
Truyền nội dung nghe nhìn
Ở cấp độ cao, để phát nội dung nghe nhìn trên thiết bị Truyền, bạn cần xảy ra:
- Người gửi tạo một đối tượng
MediaInfo
JSON
qua SDK truyền để mô hình hoá một mục nội dung đa phương tiện. - Người gửi kết nối với thiết bị Truyền để chạy ứng dụng nhận.
- Bộ thu tải đối tượng
MediaInfo
thông qua yêu cầuLOAD
để phát nội dung. - Bộ thu theo dõi và theo dõi trạng thái nội dung nghe nhìn.
- Người gửi gửi lệnh phát tới người nhận để kiểm soát việc phát dựa trên tương tác của người dùng với ứng dụng.
Trong lần thử cơ bản đầu tiên này, chúng ta sẽ điền URL của thành phần có thể phát là MediaInfo
(được lưu trữ trong MediaInfo.contentUrl
).
Người gửi trong thực tế sử dụng giá trị nhận dạng nội dung đa phương tiện dành riêng cho ứng dụng trong MediaInfo.contentId
. Bộ thu sử dụng contentId
làm giá trị nhận dạng để thực hiện các lệnh gọi API phụ trợ thích hợp để phân giải URL thành phần thực tế và đặt thành MediaInfo.contentUrl.
. Bộ thu cũng sẽ xử lý các thao tác như thu nạp giấy phép DRM hoặc chèn thông tin về điểm chèn quảng cáo.
Chúng ta sẽ mở rộng bộ thu của bạn để thực hiện thao tác tương tự trong phần tiếp theo. Bây giờ, hãy nhấp vào biểu tượng Truyền và chọn thiết bị của bạn để mở bộ thu.
Chuyển đến thẻ "Tải nội dung nghe nhìn" và nhấp vào nút "Tải theo nội dung". Bộ thu của bạn sẽ bắt đầu phát nội dung mẫu.
Vì vậy, SDK bộ thu nhận có thể xử lý ngay lập tức:
- Khởi động phiên Truyền
- Xử lý các yêu cầu
LOAD
đến từ người gửi chứa nội dung có thể phát - Cung cấp giao diện người dùng trình phát cơ bản sẵn sàng để hiển thị trên màn hình lớn.
Vui lòng khám phá Công cụ CaC và mã của công cụ đó trước khi chuyển sang phần tiếp theo, nơi chúng ta sẽ mở rộng trình nhận để trò chuyện với một API mẫu đơn giản để thực hiện các yêu cầu LOAD
đến từ người gửi.
9. Tích hợp với một API bên ngoài
Phù hợp với cách hầu hết các nhà phát triển tương tác với Bộ thu truyền trong các ứng dụng thực tế, chúng tôi sẽ sửa đổi bộ thu để xử lý các yêu cầu LOAD
tham chiếu đến nội dung nghe nhìn dự kiến bằng khoá API thay vì gửi qua URL thành phần có thể phát.
Các ứng dụng thường làm như vậy vì:
- Người gửi có thể không biết URL nội dung.
- Ứng dụng Truyền được thiết kế để xử lý xác thực, logic kinh doanh hoặc lệnh gọi API khác trực tiếp trên bộ thu.
Chức năng này chủ yếu được triển khai trong phương thức PlayerManager
setMessageInterceptor()
. Thao tác này cho phép bạn chặn các thông báo đến theo loại và sửa đổi các thông báo đó trước khi đến trình xử lý thông báo nội bộ của SDK. Trong phần này, chúng ta sẽ xử lý các yêu cầu LOAD
, trong đó chúng ta sẽ thực hiện những việc sau:
- Đọc yêu cầu
LOAD
đến vàcontentId
tuỳ chỉnh của nó. - Thực hiện lệnh gọi
GET
đến API của chúng tôi để tra cứu tài sản có thể phát trực tuyến theocontentId
. - Hãy sửa đổi yêu cầu
LOAD
bằng URL của luồng. - Sửa đổi đối tượng
MediaInformation
để đặt thông số loại luồng. - Chuyển yêu cầu đến SDK để phát lại hoặc từ chối lệnh nếu chúng tôi không thể tìm kiếm phương tiện được yêu cầu.
API mẫu được cung cấp giới thiệu các nội dung hấp dẫn của SDK để tùy chỉnh các tác vụ của bộ thu phổ biến, trong khi vẫn dựa trên trải nghiệm chủ yếu ngay từ đầu.
API mẫu
Trỏ trình duyệt của bạn đến https://storage.googleapis.com/cpe-sample-media/content.json và xem danh mục video mẫu của chúng tôi. Nội dung này bao gồm URL cho hình ảnh áp phích ở định dạng png cũng như cả luồng DASH và HLS. Các luồng DASH và HLS trỏ đến các nguồn video và âm thanh kết hợp được lưu trữ trong các vùng chứa mp4 phân mảnh.
{
"bbb": {
"author": "The Blender Project",
"description": "Grumpy Bunny is grumpy",
"poster": "https://[...]/[...]/BigBuckBunny/images/screenshot1.png",
"stream": {
"dash": "https://[...]/[...]/BigBuckBunny/BigBuckBunny_master.mpd",
"hls": "https://[...]/[...]/BigBuckBunny/BigBuckBunny_master.m3u8",
"title": "Big Buck Bunny"
},
"fbb_ad": {
"author": "Google Inc.",
"description": "Introducing Chromecast. The easiest way to enjoy [...]",
"poster": "https://[...]/[...]/ForBiggerBlazes/images/screenshot8.png",
"stream": {
"dash": "https://[...]/[...]/ForBiggerBlazes/ForBiggerBlazes.mpd",
"hls": "https://[...]/[...]/ForBiggerBlazes/ForBiggerBlazes.m3u8",
"title": "For Bigger Blazes"
},
[...]
}
Trong bước tiếp theo, chúng ta sẽ liên kết khoá của mỗi mục (ví dụ: bbb, fbb_ad
) với URL của luồng sau khi trình nhận được gọi bằng yêu cầu LOAD
.
Chặn yêu cầu LOAD
Trong bước này, chúng ta sẽ tạo một trình chặn tải có hàm gửi yêu cầu XHR
đến tệp JSON
được lưu trữ. Sau khi nhận được tệp JSON
, chúng tôi sẽ phân tích cú pháp nội dung và thiết lập siêu dữ liệu. Trong các phần sau, chúng ta sẽ tuỳ chỉnh các thông số MediaInformation
để chỉ định loại nội dung.
Thêm mã sau vào tệp js/receiver.js
, ngay trước lệnh gọi đến context.start()
.
function makeRequest (method, url) {
return new Promise(function (resolve, reject) {
let xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(JSON.parse(xhr.response));
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.send();
});
}
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => {
return new Promise((resolve, reject) => {
// Fetch content repository by requested contentId
makeRequest('GET', 'https://storage.googleapis.com/cpe-sample-media/content.json').then(function (data) {
let item = data[request.media.contentId];
if(!item) {
// Content could not be found in repository
reject();
} else {
// Add metadata
let metadata = new
cast.framework.messages.GenericMediaMetadata();
metadata.title = item.title;
metadata.subtitle = item.author;
request.media.metadata = metadata;
// Resolve request
resolve(request);
}
});
});
});
Phần tiếp theo sẽ trình bày cách thiết lập thuộc tính media
của yêu cầu tải cho nội dung DASH.
Sử dụng nội dung DASH API mẫu
Giờ đây, khi đã chuẩn bị trình chặn tải, chúng ta sẽ chỉ định loại nội dung cho broadcast receiver. Thông tin này sẽ cung cấp cho người nhận URL của danh sách phát chính và loại MIME luồng. Thêm mã sau vào tệp js/Receiver.js trong Promise()
của trình chặn LOAD
:
...
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => {
return new Promise((resolve, reject) => {
...
} else {
// Adjusting request to make requested content playable
request.media.contentUrl = item.stream.dash;
request.media.contentType = 'application/dash+xml';
...
}
});
});
});
Sau khi hoàn tất bước này, bạn có thể tiến hành Thử nghiệm việc đó để thử tải nội dung DASH. Nếu bạn muốn kiểm thử việc tải nội dung HLS, hãy xem bước tiếp theo.
Sử dụng nội dung HLS API mẫu
API mẫu bao gồm nội dung HLS cũng như DASH. Ngoài việc thiết lập contentType
như đã thực hiện ở bước trước, yêu cầu tải sẽ cần thêm một số thuộc tính để sử dụng URL HLS của API mẫu. Khi bộ thu được định cấu hình để phát luồng HLS, loại vùng chứa mặc định dự kiến là truyền tải (TS). Do đó, broadcast receiver sẽ cố gắng mở các luồng MP4 mẫu ở định dạng TS nếu chỉ có thuộc tính contentUrl
được sửa đổi. Trong yêu cầu tải, đối tượng MediaInformation
phải được sửa đổi với các thuộc tính bổ sung để broadcast receiver biết nội dung thuộc loại MP4 chứ không phải TS. Thêm mã sau vào tệp js/Receiver.js của bạn trong trình chặn tải để sửa đổi các thuộc tính contentUrl
và contentType
. Ngoài ra, hãy thêm thuộc tính HlsSegmentFormat
và HlsVideoSegmentFormat
.
...
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => {
return new Promise((resolve, reject) => {
...
} else {
// Adjusting request to make requested content playable
request.media.contentUrl = item.stream.hls;
request.media.contentType = 'application/x-mpegurl';
request.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
request.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
...
}
});
});
});
Thử nghiệm
Một lần nữa, mở Command and Control (CaC) Tool và đặt ID ứng dụng của bạn thành ID ứng dụng của người nhận. Chọn thiết bị của bạn bằng nút Truyền.
Di chuyển đến thẻ "Tải nội dung nghe nhìn". Lần này, hãy xoá văn bản trong trường "URL nội dung" bên cạnh nút "Tải theo nội dung". Thao tác này sẽ buộc ứng dụng của chúng tôi gửi một yêu cầu LOAD
chỉ chứa tham chiếu contentId
đến nội dung nghe nhìn của chúng tôi.
Giả sử mọi thứ hoạt động tốt với nội dung sửa đổi đối với bộ thu, trình chặn nên xử lý việc định hình đối tượng MediaInfo
thành nội dung mà SDK có thể phát trên màn hình.
Nhấp vào nút "Tải bằng nội dung" để xem phương tiện của bạn có phát đúng cách không. Vui lòng thay đổi Content ID thành mã khác trong tệp content.json.
10. Tối ưu hoá cho màn hình thông minh
Màn hình thông minh là thiết bị có chức năng cảm ứng, cho phép các ứng dụng nhận hỗ trợ điều khiển cảm ứng.
Phần này giải thích cách tối ưu hoá ứng dụng nhận của bạn khi khởi chạy trên màn hình thông minh và cách tuỳ chỉnh điều khiển trình phát.
Truy cập vào các chế độ kiểm soát giao diện người dùng
Bạn có thể truy cập vào đối tượng Điều khiển giao diện người dùng cho Màn hình thông minh bằng cách sử dụng cast.framework.ui.Controls.GetInstance()
. Thêm mã sau vào tệp js/receiver.js
ở trên context.start()
:
...
// Optimizing for smart displays
const touchControls = cast.framework.ui.Controls.getInstance();
context.start();
Nếu không sử dụng phần tử <cast-media-player>, bạn sẽ cần đặt touchScreenOptimizedApp
trong CastReceiverOptions
. Trong lớp học lập trình này, chúng ta sẽ sử dụng phần tử <cast-media-player>.
context.start({ touchScreenOptimizedApp: true });
Các nút điều khiển mặc định được gán cho từng khe dựa trên MetadataType
và MediaStatus.supportedMediaCommands
.
Điều khiển video
Đối với MetadataType.MOVIE
, MetadataType.TV_SHOW
và MetadataType.GENERIC
, đối tượng Điều khiển giao diện người dùng cho Màn hình thông minh sẽ xuất hiện như trong ví dụ bên dưới.
--playback-logo-image
MediaMetadata.subtitle
MediaMetadata.title
MediaStatus.currentTime
MediaInformation.duration
ControlsSlot.SLOT_SECONDARY_1
:ControlsButton.QUEUE_PREV
ControlsSlot.SLOT_PRIMARY_1
:ControlsButton.SEEK_BACKWARD_30
PLAY/PAUSE
ControlsSlot.SLOT_PRIMARY_2
:ControlsButton.SEEK_FORWARD_30
ControlsSlot.SLOT_SECONDARY_2
:ControlsButton.QUEUE_NEXT
Điều khiển âm thanh
Đối với MetadataType.MUSIC_TRACK
, đối tượng Điều khiển trên giao diện người dùng cho Màn hình thông minh sẽ xuất hiện như bên dưới:
--playback-logo-image
MusicTrackMediaMetadata.albumName
MusicTrackMediaMetadata.title
MusicTrackMediaMetadata.albumArtist
MusicTrackMediaMetadata.images[0]
MediaStatus.currentTime
MediaInformation.duration
ControlsSlot.SLOT_SECONDARY_1
:ControlsButton.NO_BUTTON
ControlsSlot.SLOT_PRIMARY_1
:ControlsButton.QUEUE_PREV
PLAY/PAUSE
ControlsSlot.SLOT_PRIMARY_2
:ControlsButton.QUEUE_NEXT
ControlsSlot.SLOT_SECONDARY_2
:ControlsButton.NO_BUTTON
Cập nhật lệnh nội dung nghe nhìn được hỗ trợ
Đối tượng Điều khiển giao diện người dùng cũng xác định liệu ControlsButton
có hiển thị hay không dựa trên MediaStatus.supportedMediaCommands
.
Khi giá trị của supportedMediaCommands
bằng ALL_BASIC_MEDIA
, bố cục điều khiển mặc định sẽ hiển thị như bên dưới:
Khi giá trị của supportedMediaCommands
bằng ALL_BASIC_MEDIA | QUEUE_PREV | QUEUE_NEXT
, bố cục điều khiển mặc định sẽ hiển thị như bên dưới:
Khi giá trị của supportedMediaCommands bằng PAUSE | QUEUE_PREV | QUEUE_NEXT
, bố cục điều khiển mặc định sẽ hiển thị như bên dưới:
Khi có bản phụ đề, nút phụ đề sẽ luôn xuất hiện tại SLOT_1
.
Để linh động thay đổi giá trị của supportedMediaCommands
sau khi bắt đầu ngữ cảnh trình nhận, bạn có thể gọi PlayerManager.setSupportedMediaCommands
để ghi đè giá trị này. Ngoài ra, bạn có thể thêm lệnh mới bằng cách dùng addSupportedMediaCommands
hoặc xoá một lệnh hiện có bằng removeSupportedMediaCommands
.
Tùy chỉnh nút điều khiển
Bạn có thể điều chỉnh các chế độ điều khiển bằng cách sử dụng PlayerDataBinder
. Thêm mã sau vào tệp js/receiver.js
bên dưới TouchControls để đặt khe đầu tiên của các tuỳ chọn điều khiển:
...
// Optimizing for smart displays
const touchControls = cast.framework.ui.Controls.getInstance();
const playerData = new cast.framework.ui.PlayerData();
const playerDataBinder = new cast.framework.ui.PlayerDataBinder(playerData);
playerDataBinder.addEventListener(
cast.framework.ui.PlayerDataEventType.MEDIA_CHANGED,
(e) => {
if (!e.value) return;
// Clear default buttons and re-assign
touchControls.clearDefaultSlotAssignments();
touchControls.assignButton(
cast.framework.ui.ControlsSlot.SLOT_PRIMARY_1,
cast.framework.ui.ControlsButton.SEEK_BACKWARD_30
);
});
context.start();
11. Triển khai duyệt nội dung nghe nhìn trên màn hình thông minh
Duyệt qua nội dung nghe nhìn là một tính năng của Bộ thu CAF cho phép người dùng khám phá nội dung bổ sung trên các thiết bị cảm ứng. Để triển khai việc này, bạn cần sử dụng PlayerDataBinder
để thiết lập giao diện người dùng BrowseContent
. Sau đó, bạn có thể điền dữ liệu này bằng BrowseItems
dựa trên nội dung bạn muốn hiển thị.
Duyệt qua nội dung
Dưới đây là ví dụ về giao diện người dùng BrowseContent
và các thuộc tính của giao diện này:
BrowseContent.title
BrowseContent.items
Tỷ lệ khung hình
Sử dụng targetAspectRatio property
để chọn tỷ lệ khung hình phù hợp nhất cho các thành phần hình ảnh của bạn. SDK bộ thu CAF hỗ trợ 3 tỷ lệ khung hình: SQUARE_1_TO_1
, PORTRAIT_2_TO_3
, LANDSCAPE_16_TO_9
.
Duyệt xem mục
Hãy sử dụng BrowseItem
để hiện tiêu đề, phụ đề, thời lượng và hình ảnh cho từng mục:
BrowseItem.image
BrowseItem.duration
BrowseItem.title
BrowseItem.subtitle
Đặt dữ liệu Duyệt xem nội dung nghe nhìn
Bạn có thể cung cấp danh sách nội dung phương tiện để duyệt bằng cách gọi setBrowseContent
. Thêm mã sau vào tệp js/receiver.js
bên dưới playerDataBinder
và trong trình nghe sự kiện MEDIA_CHANGED
để đặt các mục duyệt qua có tiêu đề "Tiếp theo".
// Optimizing for smart displays
const touchControls = cast.framework.ui.Controls.getInstance();
const playerData = new cast.framework.ui.PlayerData();
const playerDataBinder = new cast.framework.ui.PlayerDataBinder(playerData);
...
let browseItems = getBrowseItems();
function getBrowseItems() {
let browseItems = [];
makeRequest('GET', 'https://storage.googleapis.com/cpe-sample-media/content.json')
.then(function (data) {
for (let key in data) {
let item = new cast.framework.ui.BrowseItem();
item.entity = key;
item.title = data[key].title;
item.subtitle = data[key].description;
item.image = new cast.framework.messages.Image(data[key].poster);
item.imageType = cast.framework.ui.BrowseImageType.MOVIE;
browseItems.push(item);
}
});
return browseItems;
}
let browseContent = new cast.framework.ui.BrowseContent();
browseContent.title = 'Up Next';
browseContent.items = browseItems;
browseContent.targetAspectRatio = cast.framework.ui.BrowseImageAspectRatio.LANDSCAPE_16_TO_9;
playerDataBinder.addEventListener(
cast.framework.ui.PlayerDataEventType.MEDIA_CHANGED,
(e) => {
if (!e.value) return;
....
// Media browse
touchControls.setBrowseContent(browseContent);
});
Nhấp vào một mục duyệt qua nội dung đa phương tiện sẽ kích hoạt trình chặn LOAD
. Thêm mã sau vào trình chặn LOAD
để ánh xạ request.media.contentId
đến request.media.entity
từ mục duyệt qua nội dung đa phương tiện:
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => {
...
// Map contentId to entity
if (request.media && request.media.entity) {
request.media.contentId = request.media.entity;
}
return new Promise((resolve, reject) => {
...
});
});
Bạn cũng có thể đặt đối tượng BrowseContent
thành null
để xoá giao diện người dùng Duyệt xem nội dung đa phương tiện.
12. Gỡ lỗi ứng dụng nhận
SDK Bộ thu truyền cung cấp cho các nhà phát triển một tuỳ chọn khác để dễ dàng gỡ lỗi ứng dụng nhận bằng cách sử dụng API CastDebugLogger và một Công cụ điều khiển và lệnh (CaC) đồng hành để ghi nhật ký.
Khởi chạy
Để kết hợp API này, hãy thêm tập lệnh nguồn CastDebugLogger
vào tệp index.html của bạn. Nguồn phải được khai báo trong thẻ <head> sau khi khai báo SDK Bộ thu truyền.
<head>
...
<script src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<!-- Cast Debug Logger -->
<script src="//www.gstatic.com/cast/sdk/libs/devtools/debug_layer/caf_receiver_logger.js"></script>
</head>
Trong js/receiver.js
ở đầu tệp và bên dưới playerManager
, hãy thêm mã sau để truy xuất phiên bản CastDebugLogger
và bật trình ghi nhật ký:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// Debug Logger
const castDebugLogger = cast.debug.CastDebugLogger.getInstance();
const LOG_TAG = 'MyAPP.LOG';
// Enable debug logger and show a 'DEBUG MODE' overlay at top left corner.
context.addEventListener(cast.framework.system.EventType.READY, () => {
if (!castDebugLogger.debugOverlayElement_) {
castDebugLogger.setEnabled(true);
}
});
Khi bật trình ghi nhật ký gỡ lỗi, một lớp phủ hiển thị DEBUG MODE
sẽ xuất hiện trên thiết bị nhận.
Ghi lại sự kiện người chơi
Bằng cách sử dụng CastDebugLogger
, bạn có thể dễ dàng ghi lại các sự kiện của người chơi do SDK bộ thu CAF kích hoạt và sử dụng các cấp độ trình ghi khác nhau để ghi lại dữ liệu sự kiện. Cấu hình loggerLevelByEvents
sử dụng cast.framework.events.EventType
và cast.framework.events.category
để chỉ định những sự kiện sẽ được ghi nhật ký.
Thêm mã dưới đây vào phần khai báo castDebugLogger
để ghi nhật ký khi sự kiện CORE
của người chơi được kích hoạt hoặc phát thay đổi mediaStatus
:
// Debug Logger
const castDebugLogger = cast.debug.CastDebugLogger.getInstance();
// Enable debug logger and show a 'DEBUG MODE' overlay at top left corner.
context.addEventListener(cast.framework.system.EventType.READY, () => {
if (!castDebugLogger.debugOverlayElement_) {
castDebugLogger.setEnabled(true);
}
});
// Set verbosity level for Core events.
castDebugLogger.loggerLevelByEvents = {
'cast.framework.events.category.CORE': cast.framework.LoggerLevel.INFO,
'cast.framework.events.EventType.MEDIA_STATUS': cast.framework.LoggerLevel.DEBUG
}
Thông điệp nhật ký và thẻ tuỳ chỉnh
API CastDebugLogger cho phép bạn tạo thông điệp nhật ký xuất hiện trên lớp phủ gỡ lỗi của người nhận với các màu khác nhau. Các phương thức ghi nhật ký sau đây đều có sẵn, được liệt kê theo thứ tự ưu tiên từ cao nhất đến thấp nhất:
castDebugLogger.error(custom_tag, message);
castDebugLogger.warn(custom_tag, message);
castDebugLogger.info(custom_tag, message);
castDebugLogger.debug(custom_tag, message);
Đối với mỗi phương pháp ghi nhật ký, tham số đầu tiên là một thẻ tùy chỉnh. Đây có thể là chuỗi xác định bất kỳ mà bạn thấy có ý nghĩa. CastDebugLogger
sử dụng thẻ để lọc nhật ký. Dưới đây là nội dung giải thích chi tiết về cách sử dụng thẻ. Thông số thứ hai là thông báo nhật ký.
Để hiển thị nhật ký trong thực tế, hãy thêm nhật ký vào trình chặn LOAD
.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
request => {
castDebugLogger.info(LOG_TAG, 'Intercepting LOAD request');
// Map contentId to entity
if (request.media && request.media.entity) {
request.media.contentId = request.media.entity;
}
return new Promise((resolve, reject) => {
// Fetch content repository by requested contentId
makeRequest('GET', 'https://storage.googleapis.com/cpe-sample-media/content.json')
.then(function (data) {
let item = data[request.media.contentId];
if(!item) {
// Content could not be found in repository
castDebugLogger.error(LOG_TAG, 'Content not found');
reject();
} else {
// Adjusting request to make requested content playable
request.media.contentUrl = item.stream.dash;
request.media.contentType = 'application/dash+xml';
castDebugLogger.warn(LOG_TAG, 'Playable URL:', request.media.contentUrl);
// Add metadata
let metadata = new cast.framework.messages.MovieMediaMetadata();
metadata.metadataType = cast.framework.messages.MetadataType.MOVIE;
metadata.title = item.title;
metadata.subtitle = item.author;
request.media.metadata = metadata;
// Resolve request
resolve(request);
}
});
});
});
Bạn có thể kiểm soát những thông báo xuất hiện trên lớp phủ gỡ lỗi bằng cách đặt cấp độ nhật ký trong loggerLevelByTags
cho mỗi thẻ tuỳ chỉnh. Ví dụ: việc bật thẻ tuỳ chỉnh có cấp độ nhật ký cast.framework.LoggerLevel.DEBUG
sẽ hiển thị tất cả thông báo được thêm vào lỗi, cảnh báo, thông tin và gỡ lỗi thông báo nhật ký. Việc bật thẻ tùy chỉnh có cấp WARNING
sẽ chỉ hiển thị lỗi và cảnh báo cho thông báo nhật ký.
Cấu hình loggerLevelByTags
là không bắt buộc. Nếu bạn không định cấu hình thẻ tùy chỉnh cho cấp độ trình ghi nhật ký, tất cả thông điệp nhật ký sẽ hiển thị trên lớp phủ gỡ lỗi.
Thêm mã sau bên dưới trình ghi nhật ký sự kiện CORE
:
// Set verbosity level for Core events.
castDebugLogger.loggerLevelByEvents = {
'cast.framework.events.category.CORE': cast.framework.LoggerLevel.INFO,
'cast.framework.events.EventType.MEDIA_STATUS': cast.framework.LoggerLevel.DEBUG
}
// Set verbosity level for custom tags.
castDebugLogger.loggerLevelByTags = {
[LOG_TAG]: cast.framework.LoggerLevel.DEBUG,
};
Lớp phủ gỡ lỗi
Trình ghi gỡ lỗi truyền cung cấp lớp phủ gỡ lỗi trên trình nhận để hiển thị thông điệp nhật ký tuỳ chỉnh của bạn trên thiết bị truyền. Hãy dùng showDebugLogs
để chuyển đổi lớp phủ gỡ lỗi và clearDebugLogs
để xóa thông điệp nhật ký trên lớp phủ.
Thêm mã sau để xem trước lớp phủ gỡ lỗi trên trình nhận.
context.addEventListener(cast.framework.system.EventType.READY, () => {
if (!castDebugLogger.debugOverlayElement_) {
// Enable debug logger and show a 'DEBUG MODE' overlay at top left corner.
castDebugLogger.setEnabled(true);
// Show debug overlay
castDebugLogger.showDebugLogs(true);
// Clear log messages on debug overlay
castDebugLogger.clearDebugLogs();
}
});
13. Xin chúc mừng
Giờ đây, bạn đã biết cách tạo ứng dụng nhận trang web tuỳ chỉnh bằng cách sử dụng SDK Truyền web.
Để biết thêm thông tin chi tiết, hãy xem hướng dẫn dành cho nhà phát triển về Bộ thu trên web.