Thêm các tính năng cốt lõi vào trình thu nhận web tuỳ chỉnh

Trang này chứa các đoạn mã và nội dung mô tả về các tính năng dành cho ứng dụng Trình thu phát web tuỳ chỉnh.

  1. 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 người chơi được cung cấp kèm theo Trình thu phát web.
  2. Định kiểu giống như CSS tuỳ chỉnh cho phần tử cast-media-player để tạo kiểu cho các phần tử trên giao diện người dùng như background-image, splash-imagefont-family.
  3. Một phần tử của tập lệnh để tải khung Web receiver.
  4. Mã JavaScript để chặn thông báo và xử lý sự kiện.
  5. Danh sách chờ tự động phát.
  6. Các tuỳ chọn để định cấu hình chế độ phát.
  7. Các tuỳ chọn để đặt ngữ cảnh Web receiver.
  8. Các tuỳ chọn đặt lệnh mà ứng dụng Web receiver hỗ trợ.
  9. 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

CastReceiverContext là lớp ngoài cùng mà nhà phát triển nhìn thấy, đồng thời quản lý việc tải các thư viện cơ sở cũng như 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 truyề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 kết nối của người gửi có vẫn đang được kết nối hay không. Khi Trình nhận web không thể giao tiếp với người gửi trong maxInactivity giây, sự kiện SENDER_DISCONNECTED sẽ được gửi đi. Cấu hình bên dưới sẽ ghi đè thời gian chờ này. Thao tác này có thể hữu ích khi gỡ lỗi sự cố vì nó ngăn ứng dụng Web receiver đóng phiên Chrome Remote Debugger (Trình gỡ lỗi từ xa Chrome) khi không có trình gửi đượ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 của Bộ nhận web cung cấp một cách để định cấu hình các biến phát, chẳng hạn như thông tin DRM, cấu hình thử lại và trình xử lý yêu cầu bằng cách sử dụng cast.framework.PlaybackConfig. Thông tin này do PlayerManager xử lý và được đánh giá tại thời điểm tạo người chơi. Trình phát được tạo mỗi khi có một lượt tải mới được truyền đến SDK Web receiver. Các sửa đổi đối với PlaybackConfig sau khi tạo trình phát sẽ được đánh giá trong lần tải nội dung tiếp theo. 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ạy CastReceiverContext.
  • PlayerManager.getPlaybackConfig() để lấy cấu hình hiện tại.
  • PlayerManager.setPlaybackConfig() để ghi đè cấu hình hiện tại. Chế độ cài đặt này được áp dụng cho tất cả các lần tải tiếp theo hoặc cho đến khi bị ghi đè lần nữa.
  • PlayerManager.setMediaPlaybackInfoHandler() để chỉ áp dụng các cấu hình bổ sung 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ý này được gọi ngay trước khi tạo người chơi. Các 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 các truy vấn đối với getPlaybackConfig(). Khi mục nội dung nghe nhì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 thấy cách đặt PlaybackConfig khi khởi động CastReceiverContext. Cấu hình này ghi đè các yêu cầu gửi đi để nhận tệp kê khai. Bộ xử lý này chỉ định việc thực hiện các yêu cầu Kiểm soát quyền truy cập của CORS bằng cách sử dụ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 cách sử dụng phương thức getter và setter được cung cấp trong PlayerManager. Chế độ cài đặt này định cấu hình trình phát để tiếp tục phát nội dung sau khi tải 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 yêu cầu tải cụ thể bằng cách sử dụng trình xử lý thông tin phát nội dung nghe nhìn. Trình xử lý này gọi một phương thức đã triển khai getLicenseUrlForMedia của ứng dụng để 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. Trình nghe sự kiện sẽ lấy một tham số cast.framework.events.EventType (hoặc một mảng các tham số này) chỉ định(các) sự kiện sẽ kích hoạt trình nghe. Bạn có thể tìm thấy các mảng được định cấu hình sẵn của 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 thay đổi mediaStatus sẽ được phát đi, 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

SDK Web receiver 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 những thông báo đó. Trình chặn thông báo sẽ lấy một tham số cast.framework.messages.MessageType để xác định loại thông báo cần được chặn.

Trình chặn sẽ trả về yêu cầu đã sửa đổi hoặc một Promise phân giải bằng giá trị yêu cầu đã sửa đổi. Việc trả về null sẽ ngăn việc gọi trình xử lý thông báo 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 để chặn và sửa đổi dữ liệu đó:

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 lỗi xảy ra trong trình chặn thông báo, ứng dụng Trình nhận web sẽ trả về một cast.framework.messages.ErrorTypecast.framework.messages.ErrorReason thích hợp.

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

Sau đâ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:

  • 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 thông báo cho phép bạn nghe, chặn thông báo và sửa đổi chính dữ liệu của 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 nội dung nghe nhìn trong thông báo cast.framework.messages.MessageType.LOAD, bao gồm entity, contentUrlcontentId.

  • entity là thuộc tính được đề xuất sử dụng trong quá trình triển khai cho cả ứng dụng gửi và nhận. Thuộc tính này có thể là một URL liên kết sâu có thể là danh sách phát hoặc nội dung nghe nhìn. Ứng dụng của bạn nên phân tích cú pháp URL này và điề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à người chơi 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ủa thuộc tính contentUrl) hoặc giá trị nhận dạng duy nhất của nội dung hoặc danh sách phát đang được tải. Nếu sử dụng thuộc tính này làm giá trị nhận dạng, thì ứng dụng của bạn sẽ điền một URL có thể phát vào contentUrl.

Bạn nên sử dụng entity để lưu trữ mã nhận dạng thực hoặc các tham số chính và sử dụng contentUrl cho URL của nội dung nghe nhìn. Ví dụ về điều này được minh hoạ trong đoạn mã sau đây, trong đó entity có trong yêu cầu LOADcontentUrl 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ị

Phương thức getDeviceCapabilities cung cấp thông tin về thiết bị trên Thiết bị truyền đã kết nối và thiết bị video hoặc âm thanh đi kèm với thiết bị đó. Phương thức getDeviceCapabilities cung cấp thông tin hỗ trợ cho Trợ lý Google, Bluetooth, các thiết bị âm thanh và màn hình đã kết nối.

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 một trong các giá trị enum được chỉ định để nhận chức năng của thiết bị cho enum đó. Enum được định nghĩa trong cast.framework.system.DeviceCapabilities.

Ví dụ này sẽ kiểm tra xem thiết bị Web Nhận có thể phát HDR và DolbyVision (DV) lần lượt bằng các phím IS_HDR_SUPPORTEDIS_DV_SUPPORTED hay khô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 thu phát web thông qua các ứng dụng gửi (Web, Android và iOS), lệnh thoại trên thiết bị có Trợ lý, chế độ điều khiển cảm ứng trên màn hình thông minh và chế độ điều khiển từ xa trên thiết bị Android TV. Cast SDK cung cấp nhiều API để cho phép ứng dụng Web receiver xử lý những hoạt động 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 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 trên giao diện người dùng được quyết định bởi MediaStatus.supportedMediaCommands cho bộ điều khiển mở rộng dành cho người gửi trên iOS và Android, ứng dụng bộ nhận và ứng dụng điều khiển từ xa chạy trên thiết bị cảm ứng, cũng như ứng dụng bộ nhận trên thiết bị Android TV. Khi bạn bật một Command bitwise cụ thể trong thuộc tính, các nút liên quan đến thao tác đó sẽ được bật. Nếu bạn không đặt giá trị này thì nút sẽ bị tắt. Bạn có thể thay đổi các giá trị này trên Web receiver bằng cách:

  1. Sử dụng PlayerManager.setSupportedMediaCommands để đặt Commands cụ thể
  2. Thêm một lệnh mới bằng cách sử dụng addSupportedMediaCommands
  3. Xoá một lệnh hiện có bằng removeSupportedMediaCommands.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

Khi receiver chuẩn bị MediaStatus đã cập nhật, broadcast receiver sẽ đưa vào các thay đổi trong thuộc tính supportedMediaCommands. Khi trạng thái được truyền, các ứng dụng gửi đã 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 hướng dẫn của Accessing UI controls.

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 việc phát nội dung và các thuộc tính liên quan đến nội dung đang phát. Các yêu cầu kiểm soát việc phát sẽ do SDK xử lý tự động. Các yêu cầu sửa đổi thuộc tính cho mục đang phát (chẳng hạn như lệnh LIKE) đòi hỏi ứng dụng nhận phải xử lý các thuộc tính đó. 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, bạn phải làm những việc sau:

  • Đặt MediaInformation userActionStates theo 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 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ý việc gọi phần phụ trợ với thay đổi được yêu cầu. Sau đó, ứng dụng này thực hiện lệnh gọi để cập nhật UserActionState trên receiver.

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 sẽ 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 phần phụ trợ hỗ trợ hành động đó.

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 đây sẽ lấy UserActionRequestData và thêm hoặc xoá UserActionState khỏi MediaInformation. Việc cập nhật UserActionState của MediaInformation sẽ thay đổi trạng thái của nút liên kết với hành động được yêu cầu. Thay đổi này được phản ánh trong giao diện người dùng của bộ điều khiển màn hình thông minh, ứng dụng điều khiển từ xa và giao diện người dùng của Android TV. Lệnh này cũng được 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 nội dung nghe nhìn sau đây hiện được hỗ trợ trong SDK Web receiver cho thiết bị có Trợ lý. Bạn có thể tìm thấy cách triển khai mặc định của các lệnh này trong cast.framework.PlayerManager.

Lệnh Nội dung 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

Để ngăn lệnh thoại kích hoạt một lệnh nghe nhìn trên một thiết bị có Trợ lý, trước tiên, bạn phải đặt các lệnh phát 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 thuộc tính CastReceiverOptions.enforceSupportedCommands. 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 để phản ánh những cấu hình này. Nếu cờ này không được bật, thì các lệnh thoại đến sẽ thực thi.

Ví dụ: nếu cho phép PAUSE từ các ứng dụng gửi và thiết bị hỗ trợ cảm ứng, bạn cũng phải định cấu hình bộ nhận để phản ánh các chế độ cài đặt đó. Khi được định cấu hình, mọi lệnh thoại đến sẽ bị loại bỏ 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 khởi động CastReceiverContext. Chúng tôi đã thêm tính năng hỗ trợ cho lệnh PAUSE và buộc người chơi chỉ hỗ trợ lệnh đó. Giờ đây, 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ì thao tác đó 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ế. Xoá cờ enforceSupportedCommands và đối với 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 đưa ra để các lệnh SEEK được đưa ra cho thiết bị có Trợ lý không kích hoạt thao tác tìm kiếm trong ứng dụng Trình nhận web của bạn.

Đối với các lệnh nội dung nghe nhìn mà ứng dụng của bạn không hỗ trợ, hãy trả về một lý do lỗi thích hợp, 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 chạy ở chế độ nền âm thanh của ứng dụng do hoạt động của Trợ lý như nghe giọng nói của người dùng hoặc nói lại, thì thông báo FocusState của NOT_IN_FOCUS sẽ được gửi đến ứng dụng Trình nhận web 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. Tuỳ thuộc vào ứng dụng và nội dung nghe nhìn đang phát, bạn nên tạm dừng nội dung nghe nhìn khi FocusStateNOT_IN_FOCUS bằng cách chặn loại thông báo FOCUS_STATE.

Ví dụ: Người dùng nên tạm dừng phát sách nói nếu Trợ lý đang phản hồi 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ụ đề sẽ chính là ngôn ngữ dùng lệnh. Trong các trường hợp này, tham số isSuggestedLanguage của tin nhắn đến cho biết liệu ngôn ngữ liên kết có được người dùng đề xuất hoặc yêu cầu rõ ràng hay không.

Ví dụ: isSuggestedLanguage được đặt thành true cho lệnh "Ok Google, bật phụ đề" vì ngôn ngữ được suy ra theo ngôn ngữ dùng để đọc lệnh. 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 sẽ đượ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 receiver xử lý, nhưng bạn cần đảm bảo siêu dữ liệu cho nội dung của mình hoàn chỉnh và chính xác. Điều này đảm bảo rằng Trợ lý xử lý lệnh thoại đúng cách và siêu dữ liệu sẽ xuất hiện đú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 giữ nguyên trạng thái phiên là cơ sở của quá trình chuyển sự kiện phát trực tuyến, trong đó người dùng có thể di chuyển các luồng âm thanh và video hiện có trên 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 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 (đí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.

Luồng sự kiện để chuyển sự kiện phát trực tiếp là:

  1. Trên thiết bị nguồn:
    1. Nội dung nghe nhìn sẽ ngừng phát.
    2. Ứng dụng Web receiver nhận được lệnh để lưu trạng thái hiện tại của nội dung nghe nhìn.
    3. Ứng dụng Trình nhận web đã tắt.
  2. Trên thiết bị đích:
    1. Đã tải ứng dụng Web receiver.
    2. Ứng dụng Web receiver nhận được lệnh để khôi phục trạng thái của nội dung nghe nhìn đã lưu.
    3. 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:

  1. Cập nhật supportedMediaCommands bằng lệnh STREAM_TRANSFER:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. Tuỳ ý ghi đè các trình chặn thông báo SESSION_STATERESUME_SESSION như mô tả trong phần Bảo tồn trạng thái phiên. Chỉ ghi đè các giá trị này nếu dữ liệu tuỳ chỉnh cần được lưu trữ dưới dạng một phần của ảnh chụp nhanh phiên. Nếu không, phương thức triển khai mặc định để duy trì trạng thái phiên sẽ hỗ trợ tính năng 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 để duy trì trạng thái phiên bằng cách chụp nhanh trạng thái nội dung nghe nhìn hiện tại, chuyển đổi trạng thái thành yêu cầu tải và tiếp tục phiên có yêu cầu tải.

Bạn có thể ghi đè yêu cầu tải do Trình nhận web tạo ra trong trình chặn thông báo SESSION_STATE nếu cần. Nếu muốn thêm dữ liệu tuỳ chỉnh vào yêu cầu tải, bạn nên đưa các dữ liệu này 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;
    });

Bạn có thể truy xuất dữ liệu tuỳ chỉnh 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 mục phát hiện tại 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 giá trị preloadTime 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, tương ứng với điểm kết thúc của mục đang phát . Chỉ các giá trị dương mới 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 hoàn tất. Nếu thời gian tải trước cao hơn thời gian còn lại trên mục currentItem, thì quá trình tải trước sẽ diễn ra sớm nhất có thể. Vì vậy, nếu chỉ định một giá trị tải trước rất lớn trên hàng đợiItem, thì chúng ta có thể đạt được hiệu quả mỗi khi chúng ta phát mục hiện tại mà chúng ta đã tải trước mục tiếp theo. Tuy nhiên, chúng tôi sẽ trao quyền cài đặt và lựa chọn điều 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 vì thiết bị Truyền 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ột 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.

Một người gửi gửi thông báo cho một Trình nhận web bằng cách sử dụng các API của 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 (là tệp kê khai của một thông báo) được chuyển đến trình nghe sự kiện có phần tử dữ liệu (event.data), trong đó dữ liệu lấy các thuộc tính của loại sự kiện cụ thể.

Ứng dụng Trình nhận web có thể chọn theo dõi thông báo trên một không gian tên đã chỉ định. Để làm như vậy, ứng dụng Web receiver được cho là hỗ trợ giao thức không gian tên đó. Sau đó, bạn có thể chọn bất kỳ người gửi được kết nối nào muốn giao tiếp trên không gian tên đó để sử dụng giao thức thích hợp.

Tất cả không gian tên đượ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 thư tuỳ chỉnh của những 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 Web receiver có thể thông báo cho người gửi về trạng thái của Web receiver bằng cách gửi thông báo đến người gửi đã kết nối. Ứng dụng Web receiver có thể gửi tin nhắn bằng cách sử dụng sendCustomMessage(namespace, senderId, message) trên CastReceiverContext. Trình nhận trên web có thể gửi tin nhắn cho từng người gửi, để phản hồi tin nhắn đã nhận hoặc do sự thay đổi trạng thái của ứng dụng. Ngoài tính năng nhắn tin từ điểm này đến điểm khác (giới hạn 64 KB), Trình nhận web cũng có thể truyền thông báo cho tất cả người gửi được kết nối.

Truyền cho thiết bị âm thanh

Hãy xem hướng dẫn của Google Cast cho thiết bị âm thanh để được hỗ trợ về tính năng chỉ phát âm thanh.

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

Google Web receiver chạy trên thiết bị Android TV sẽ chuyển dữ liệu đầu vào từ các đầu vào điều khiển của thiết bị (tức là điều khiển từ xa cầm tay) thành các thông báo phát nội dung nghe nhìn được xác định cho không gian tên urn:x-cast:com.google.cast.media, như mô tả trong Thông báo phát nội dung nghe nhìn. Ứng dụng của bạn phải hỗ trợ các thông báo này để điều khiển việc phát nội dung nghe nhìn của ứng dụng nhằm cho phép chức năng điều khiển chế độ phát cơ bản từ các đầu vào điều khiển của Android TV.

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à lỗi phổ biến bạn cần tránh để đảm bảo ứng dụng 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 đến một trang web chỉ dành cho thiết bị di động vì chúng phát hiện thấy nhãn "Android". Đừng giả định rằng "Android" trong chuỗi tác nhân người dùng luôn biểu thị 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 đa phương tiện của bạn có thể phản hồi Accept-Encoding: gzip.
  • Các sự kiện nội dung đa phương tiện HTML5 trên Android TV có thể được kích hoạt ở các thời gian khác với Chromecast. Điều này có thể cho thấy các vấn đề đã bị ẩ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 kích hoạt bởi các phần tử <audio>/<video>, như timeupdate, pausewaiting. Tránh sử dụng các sự kiện liên quan đến kết nối mạng như progress, suspendstalled, vì những sự kiện này thường phụ thuộc vào nền tảng. Xem Sự kiện đa phương tiện để 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ớ bao gồm chứng chỉ CA trung gian. Hãy xem trang kiểm tra SSL của Qualsys để xác minh: nếu đường dẫn chứng nhận đáng tin cậy cho trang web của bạn có chứa chứng chỉ CA có nhãn "tải xuống bổ sung", thì trang đó có thể không tải trên các nền tảng dựa trên Android.
  • Mặc dù Chromecast hiển thị trang bộ nhận trên mặt phẳng đồ hoạ 720p, nhưng các nền tảng Truyền khác, bao gồm cả Android TV có thể hiển thị trang ở độ phân giải lên đến 1080p. Hãy đảm bảo trang receiver của bạn điều chỉnh kích thước một cách linh hoạt ở nhiều độ phân giải.