Tích hợp Cast SDK vào ứng dụng Web Sender

Hướng dẫn dành cho nhà phát triển này mô tả cách thêm tính năng hỗ trợ Google Cast vào ứng dụng WebSender bằng cách sử dụng SDK Cast.

Thuật ngữ

Thiết bị di động hoặc trình duyệt là sender, điều khiển quá trình phát; thiết bị Google Cast là receiver (trình thu nhận) hiển thị nội dung trên màn hình để phát.

Web Sender SDK bao gồm hai phần: API khung (cast.framework) và API cơ sở (chrome.cast). Nhìn chung, bạn thực hiện các lệnh gọi trên API khung đơn giản hơn, cấp cao hơn, sau đó sẽ được Base API cấp thấp xử lý.

Khung người gửi đề cập đến API khung, mô-đun và các tài nguyên liên kết cung cấp một trình bao bọc cho chức năng cấp thấp hơn. Ứng dụng người gửi hoặc ứng dụng Google Cast Chrome đề cập đến một ứng dụng web (HTML/JavaScript) chạy trong trình duyệt Chrome trên một thiết bị của người gửi. Ứng dụng Web receiver đề cập đến một ứng dụng HTML/JavaScript chạy trên Chromecast hoặc thiết bị Google Cast.

Khung người gửi sử dụng thiết kế gọi lại không đồng bộ để thông báo cho ứng dụng gửi về các sự kiện và để chuyển đổi giữa các trạng thái khác nhau của vòng đời ứng dụng Truyền.

Tải thư viện

Để triển khai các tính năng của Google Cast, ứng dụng của bạn cần biết vị trí của SDK Web Sender của Google Cast, như minh hoạ dưới đây. Thêm tham số truy vấn URL loadCastFramework để tải API Khung người gửi web. Mọi trang của ứng dụng đều phải tham chiếu đến thư viện như sau:

<script src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>

Khung

SDK Web Sender sử dụng không gian tên cast.framework.*. Không gian tên đại diện cho nội dung sau:

  • Phương thức hoặc hàm gọi thao tác trên API
  • Trình nghe sự kiện cho các hàm trình nghe trong API

Khung này bao gồm các thành phần chính sau:

  • CastContext là một đối tượng singleton cung cấp thông tin về trạng thái Truyền hiện tại và kích hoạt các sự kiện cho các thay đổi về trạng thái Truyền và trạng thái phiên Truyền.
  • Đối tượng CastSession quản lý phiên – cung cấp thông tin trạng thái và kích hoạt các sự kiện, chẳng hạn như thay đổi âm lượng thiết bị, trạng thái tắt tiếng và siêu dữ liệu ứng dụng.
  • Phần tử nút Cast, một phần tử tuỳ chỉnh HTML đơn giản có chức năng mở rộng nút HTML. Nếu nút Truyền được cung cấp là chưa đủ, bạn có thể sử dụng trạng thái Truyền để triển khai nút Truyền.
  • RemotePlayerController cung cấp liên kết dữ liệu để đơn giản hoá việc triển khai trình phát từ xa.

Xem lại Tài liệu tham khảo API Google Cast Web Sender để biết nội dung mô tả đầy đủ về không gian tên.

Nút truyền

Thành phần nút Truyền trong ứng dụng của bạn do khung xử lý hoàn toàn. Điều này bao gồm việc quản lý chế độ hiển thị cũng như xử lý sự kiện nhấp chuột.

<google-cast-launcher></google-cast-launcher>

Ngoài ra, bạn có thể tạo nút theo phương thức lập trình:

document.createElement("google-cast-launcher");

Bạn có thể áp dụng bất kỳ kiểu bổ sung nào, chẳng hạn như kích thước hoặc vị trí, cho phần tử nếu cần. Sử dụng thuộc tính --connected-color để chọn màu cho trạng thái Trình nhận web đã kết nối và --disconnected-color cho trạng thái đã ngắt kết nối.

Khởi chạy

Sau khi tải API khung, ứng dụng sẽ gọi trình xử lý window.__onGCastApiAvailable. Bạn phải đảm bảo rằng ứng dụng sẽ đặt trình xử lý này trên window trước khi tải thư viện người gửi.

Trong trình xử lý này, bạn khởi chạy hoạt động tương tác Truyền bằng cách gọi phương thức setOptions(options) của CastContext.

Ví dụ:

<script>
window['__onGCastApiAvailable'] = function(isAvailable) {
  if (isAvailable) {
    initializeCastApi();
  }
};
</script>

Sau đó, bạn sẽ khởi chạy API như sau:

initializeCastApi = function() {
  cast.framework.CastContext.getInstance().setOptions({
    receiverApplicationId: applicationId,
    autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
  });
};

Trước tiên, ứng dụng truy xuất thực thể singleton của đối tượng CastContext do khung cung cấp. Sau đó, hàm này sử dụng setOptions(options) bằng cách sử dụng đối tượng CastOptions để đặt applicationID.

Nếu đang dùng Trình nhận nội dung nghe nhìn mặc định mà không cần đăng ký, bạn sẽ dùng một hằng số được SDK Web Sender xác định trước, như minh hoạ bên dưới, thay vì applicationID:

cast.framework.CastContext.getInstance().setOptions({
  receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID
});

Điều khiển phương tiện

Sau khi khởi động CastContext, ứng dụng có thể truy xuất CastSession hiện tại bất cứ lúc nào bằng cách sử dụng getCurrentSession().

var castSession = cast.framework.CastContext.getInstance().getCurrentSession();

Bạn có thể dùng CastSession để tải nội dung nghe nhìn cho Thiết bị truyền đã kết nối bằng loadMedia(loadRequest). Trước tiên, hãy tạo một MediaInfo bằng cách sử dụng contentIdcontentType cũng như mọi thông tin khác liên quan đến nội dung. Sau đó, hãy tạo một LoadRequest từ đó, đặt tất cả thông tin liên quan cho yêu cầu. Cuối cùng, hãy gọi loadMedia(loadRequest) trên CastSession.

var mediaInfo = new chrome.cast.media.MediaInfo(currentMediaURL, contentType);
var request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
  function() { console.log('Load succeed'); },
  function(errorCode) { console.log('Error code: ' + errorCode); });

Phương thức loadMedia sẽ trả về một Promise có thể được dùng để thực hiện mọi thao tác cần thiết nhằm mang lại một kết quả thành công. Nếu Promise bị từ chối, đối số hàm sẽ là chrome.cast.ErrorCode.

Bạn có thể truy cập vào các biến trạng thái người chơi trong RemotePlayer. Mọi hoạt động tương tác với RemotePlayer, bao gồm cả các lệnh và lệnh gọi lại sự kiện đa phương tiện, đều được xử lý bằng RemotePlayerController.

var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);

RemotePlayerController cấp cho ứng dụng toàn quyền kiểm soát nội dung đa phương tiện như PLAY, PAUSE, DỪNG và READK đối với nội dung nghe nhìn đã tải.

  • PHÁT/TẠM DỪNG: playerController.playOrPause();
  • DỪNG: playerController.stop();
  • ĐÃ TÌM KIẾM: playerController.seek();

Bạn có thể sử dụng RemotePlayerRemotePlayerController với các khung liên kết dữ liệu, chẳng hạn như Polymer hoặc Angular, để triển khai trình phát từ xa.

Dưới đây là một đoạn mã cho Angular:

<button id="playPauseButton" class="playerButton"
  ng-disabled="!player.canPause"
  ng-click="controller.playOrPause()">
    {{player.isPaused ? 'Play' : 'Pause'}}
</button>
<script>
var player = new cast.framework.RemotePlayer();
var controller = new cast.framework.RemotePlayerController(player);
// Listen to any player update, and trigger angular data binding
update.controller.addEventListener(
  cast.framework.RemotePlayerEventType.ANY_CHANGE,
  function(event) {
    if (!$scope.$$phase) $scope.$apply();
  });
</script>

Trạng thái phương tiện

Trong quá trình phát nội dung nghe nhìn, nhiều sự kiện xảy ra. Bạn có thể ghi lại nhiều sự kiện bằng cách đặt trình nghe cho nhiều sự kiện cast.framework.RemotePlayerEventType trên đối tượng RemotePlayerController.

Để biết thông tin về trạng thái nội dung nghe nhìn, hãy sử dụng sự kiện cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED. Sự kiện này sẽ kích hoạt khi chế độ phát thay đổi và CastSession.getMediaSession().media thay đổi.

playerController.addEventListener(
  cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function() {
    // Use the current session to get an up to date media status.
    let session = cast.framework.CastContext.getInstance().getCurrentSession();

    if (!session) {
        return;
    }

    // Contains information about the playing media including currentTime.
    let mediaStatus = session.getMediaSession();
    if (!mediaStatus) {
        return;
    }

    // mediaStatus also contains the mediaInfo containing metadata and other
    // information about the in progress content.
    let mediaInfo = mediaStatus.media;
  });

Khi xảy ra các sự kiện như tạm dừng, phát, tiếp tục hoặc tua, ứng dụng cần thao tác trên các sự kiện đó và đồng bộ hoá giữa chính ứng dụng đó và ứng dụng Web receiver trên thiết bị Truyền. Xem phần Cập nhật trạng thái để biết thêm thông tin.

Cách hoạt động của tính năng quản lý phiên

Cast SDK giới thiệu khái niệm về phiên Truyền, quy trình thiết lập phiên này kết hợp các bước kết nối với thiết bị, khởi chạy (hoặc tham gia) ứng dụng Trình thu web, kết nối với ứng dụng đó và khởi chạy kênh điều khiển nội dung nghe nhìn. Xem Hướng dẫn về vòng đời của ứng dụng của Bộ thu web để biết thêm thông tin về các phiên Truyền và vòng đời Bộ thu web.

Các phiên hoạt động được quản lý bằng lớp CastContext mà ứng dụng của bạn có thể truy xuất thông qua cast.framework.CastContext.getInstance(). Các phiên riêng lẻ được biểu thị bằng các lớp con của lớp Session. Ví dụ: CastSession đại diện cho các phiên có thiết bị truyền. Ứng dụng của bạn có thể truy cập vào phiên Truyền đang hoạt động qua CastContext.getCurrentSession().

Để theo dõi trạng thái phiên, hãy thêm một trình nghe vào CastContext cho loại sự kiện CastContextEventType.SESSION_STATE_CHANGED.

var context = cast.framework.CastContext.getInstance();
context.addEventListener(
  cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
  function(event) {
    switch (event.sessionState) {
      case cast.framework.SessionState.SESSION_STARTED:
      case cast.framework.SessionState.SESSION_RESUMED:
        break;
      case cast.framework.SessionState.SESSION_ENDED:
        console.log('CastContext: CastSession disconnected');
        // Update locally as necessary
        break;
    }
  })

Đối với trường hợp ngắt kết nối, chẳng hạn như khi người dùng nhấp vào nút "dừng truyền" trong hộp thoại Truyền, bạn có thể thêm trình nghe cho loại sự kiện RemotePlayerEventType.IS_CONNECTED_CHANGED trong trình nghe của mình. Trong trình nghe, hãy kiểm tra xem RemotePlayer có bị ngắt kết nối hay không. Trong trường hợp đó, hãy cập nhật trạng thái của trình phát trên máy (nếu cần). Ví dụ:

playerController.addEventListener(
  cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
    if (!player.isConnected) {
      console.log('RemotePlayerController: Player disconnected');
      // Update local player to disconnected state
    }
  });

Mặc dù người dùng có thể trực tiếp điều khiển quá trình chấm dứt tính năng Truyền thông qua nút Truyền khung, nhưng chính người gửi có thể tự dừng truyền bằng cách sử dụng đối tượng CastSession hiện tại.

function stopCasting() {
  var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
  // End the session and pass 'true' to indicate
  // that Web Receiver app should be stopped.
  castSession.endSession(true);
}

Chuyển luồng

Việc duy trì 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 các luồng âm thanh và video hiện có giữa các thiết bị bằng lệnh thoại, Ứng dụng Google Home hoặc màn hình thông minh. Nội dung nghe nhìn dừng phát trên một thiết bị (nguồn) và tiếp tục trên một thiết bị khác (đích đến). Mọi thiết bị Truyền có chương trình cơ sở mới nhất đều có thể đóng vai trò là nguồn hoặc đích đến trong quá trình chuyển luồng.

Để nhận thiết bị đích mới trong quá trình chuyển luồng, hãy gọi CastSession#getCastDevice() khi sự kiện cast.framework.SessionState.SESSION_RESUMED được gọi.

Vui lòng xem bài viết Chuyển luồng trên Bộ thu web để biết thêm thông tin.