Chia sẻ thẻ hiệu quả hơn nhờ tính năng Chụp ảnh vùng

François Beaufort
François Beaufort

Nền tảng web đã cho phép ứng dụng web quay video của thẻ hiện tại. Hiện tại, tính năng này đi kèm với tính năng Chụp vùng, một cơ chế để cắt các kênh video này. Ứng dụng web chỉ định một phần của thẻ hiện tại làm khu vực quan tâm và trình duyệt sẽ cắt tất cả các pixel nằm ngoài khu vực đó.

Trước đây, các ứng dụng web có thể cắt các kênh video "theo cách thủ công". Tức là các ứng dụng web có thể trực tiếp thao tác với từng khung hình. Cách này không mạnh mẽ và hiệu quả. Tính năng Chụp vùng giải quyết những điểm yếu này. Giờ đây, ứng dụng web có thể hướng dẫn trình duyệt thay mặt thực hiện công việc.

Giới thiệu về tính năng Chụp vùng

Vậy là bạn đã tạo một trang web bằng Dynamic Content™. Đây là ứng dụng web tốt nhất từ trước đến nay và mọi người không thể ngừng sử dụng ứng dụng này, thường là cùng nhau. Bước tiếp theo có thể là nhúng các tính năng hội nghị ảo. Bạn quyết định làm như vậy. Bạn hợp tác với một nhà cung cấp dịch vụ hội nghị truyền hình hiện có, nhúng ứng dụng web của họ dưới dạng iframe trên nhiều nguồn gốc. Ứng dụng hội nghị truyền hình trên web sẽ ghi lại thẻ hiện tại dưới dạng một kênh video và truyền kênh đó đến những người tham gia từ xa.

Ảnh chụp màn hình cửa sổ trình duyệt có một ứng dụng web làm nổi bật khu vực nội dung chính và iframe trên nhiều nguồn gốc.
Khu vực nội dung chính có màu xanh dương và iframe trên nhiều nguồn gốc có màu đỏ.

Chậm lại một chút… Bạn không muốn gửi lại video của chính họ cho họ chứ? Bạn nên cắt bỏ phần đó. Nhưng làm cách nào? Iframe được nhúng không biết bạn hiển thị nội dung nào và ở đâu, vì vậy, iframe không thể cắt nếu không có sự trợ giúp. Về lý thuyết, bạn có thể truyền toạ độ dự định. Nhưng điều gì sẽ xảy ra nếu người dùng đổi kích thước cửa sổ? Cuộn khung nhìn? Phóng to hay thu nhỏ? Tương tác với trang theo cách tạo ra thay đổi về bố cục? Ngay cả khi bạn gửi toạ độ mới đến iframe chụp, các vấn đề về thời gian vẫn có thể dẫn đến một số khung hình bị cắt sai.

Vậy thì hãy sử dụng tính năng Chụp vùng. Có một Element trên trang của bạn, có thể là <div>, chứa nội dung chính. Hãy gọi lớp này là mainContentArea. Bạn muốn ứng dụng web hội nghị truyền hình chụp và chia sẻ từ xa khu vực được xác định bằng hộp giới hạn của phần tử này. Vì vậy, bạn sẽ lấy CropTarget từ mainContentArea. Bạn truyền CropTarget này đến ứng dụng web hội nghị truyền hình. Sau khi cắt bớt kênh video bằng CropTarget này, các khung trên kênh đó hiện chỉ bao gồm các pixel nằm trong hộp giới hạn của mainContentArea. Nếu mainContentArea thay đổi kích thước, hình dạng hoặc vị trí, thì kênh video sẽ thay đổi theo mà không cần ứng dụng web nào phải nhập thêm dữ liệu.

Hãy cùng xem lại các bước này:

Bạn xác định CropTarget trong ứng dụng web bằng cách gọi CropTarget.fromElement() với phần tử mà bạn chọn làm dữ liệu đầu vào.

// In the main web app, associate mainContentArea with a new CropTarget
const mainContentArea = document.querySelector("#mainContentArea");
const cropTarget = await CropTarget.fromElement(mainContentArea);

Bạn truyền CropTarget đến ứng dụng web hội nghị truyền hình.

// Send the CropTarget to the video conferencing web app.
const iframe = document.querySelector("#videoConferenceIframe");
iframe.contentWindow.postMessage(cropTarget);

Ứng dụng web hội nghị truyền hình yêu cầu trình duyệt cắt video theo khu vực do CropTarget xác định bằng cách gọi cropTo() trên kênh video tự quay có mục tiêu cắt được nhận từ ứng dụng web chính.

// In the embedded video conferencing web app, ask the user for permission
// to start capturing the current tab.
const stream = await navigator.mediaDevices.getDisplayMedia({
  preferCurrentTab: true,
});
const [track] = stream.getVideoTracks();

// Start cropping the self-capture video track using the CropTarget
// received over window.onmessage.
await track.cropTo(cropTarget);

// Enjoy! Transmit remotely the cropped video track with RTCPeerConnection.

Et voilà! Bạn đã hoàn tất.

Tìm hiểu chuyên sâu

Phát hiện tính năng

Để kiểm tra xem CropTarget.fromElement() có được hỗ trợ hay không, hãy sử dụng:

if ("CropTarget" in self && "fromElement" in CropTarget) {
  // Deriving a target is supported.
}

Trích xuất CropTarget

Hãy tập trung vào Phần tử có tên là mainContentArea. Để lấy CropTarget từ đó, hãy gọi CropTarget.fromElement(mainContentArea). Lời hứa được trả về sẽ được phân giải bằng đối tượng CropTarget mới nếu thành công. Nếu không, yêu cầu này sẽ bị từ chối nếu bạn đã tạo một số lượng đối tượng CropTarget không hợp lý.

const mainContentArea = document.querySelector("#mainContentArea");
const cropTarget = await CropTarget.fromElement(mainContentArea);

Không giống như Element, đối tượng CropTargetcó thể chuyển đổi tuần tự. Bạn có thể chuyển giá trị này đến một tài liệu khác bằng cách sử dụng Window.postMessage().

Cắt

Khi chụp thẻ, kênh video được tạo bản sao dưới dạng BrowserCaptureMediaStreamTrack, là một lớp con của MediaStreamTrack. Lớp con đó hiển thị cropTo(). Gọi track.cropTo(cropTarget) để bắt đầu cắt theo đường viền của mainContentArea (Phần tử mà cropTarget được lấy từ đó).

Nếu thành công, Lời hứa sẽ được giải quyết khi có thể đảm bảo rằng tất cả các khung hình video tiếp theo sẽ bao gồm các pixel nằm trong hộp giới hạn của mainContentArea.

Nếu không thành công, Lời hứa sẽ bị từ chối. Điều này sẽ xảy ra nếu:

  • CropTarget đã được tạo trong một thẻ khác. (Hãy chú ý theo dõi trong thời gian tới.)
  • CropTarget được lấy từ một Phần tử không còn tồn tại.
  • Bản nhạc có bản sao. (Xem vấn đề 1509418.)
  • Bản nhạc hiện tại không phải là bản nhạc video tự quay; hãy xem bên dưới.

Phương thức cropTo() được hiển thị trên mọi kênh video quay lại thẻ, chứ không chỉ dành cho tính năng tự quay. Do đó, bạn nên kiểm tra xem người dùng đã chọn thẻ hiện tại hay chưa trước khi thử cắt bản nhạc. Bạn có thể thực hiện việc này bằng cách sử dụng Tên người dùng chụp. Bạn cũng có thể yêu cầu trình duyệt nhắc người dùng tự chụp bằng preferCurrentTab.

// Start cropping the self-capture video track using the CropTarget.
await track.cropTo(cropTarget);

Để quay lại trạng thái chưa cắt, hãy gọi cropTo() bằng null.

// Stop cropping.
await track.cropTo(null);

Nội dung che khuất và bị che khuất

Đối với tính năng Chụp vùng, chỉ vị trí và kích thước của mục tiêu mới quan trọng, chứ không phải chỉ mục z. Các pixel che khuất mục tiêu sẽ được chụp. Các phần bị che khuất của mục tiêu sẽ không được chụp.

Đây là hệ quả của việc Chụp vùng màn hình về cơ bản là cắt. Một phương án thay thế, sẽ là API riêng trong tương lai, là tính năng Chụp ở cấp phần tử; tức là chỉ chụp các pixel liên kết với mục tiêu, bất kể bị che khuất. API như vậy có một bộ yêu cầu bảo mật và quyền riêng tư khác với việc cắt đơn giản.

Hình ảnh về các kết quả khác nhau cho API Chụp vùng và API Chụp cấp phần tử.
Hành vi của tính năng Chụp vùng có nội dung che khuất.

Bảo mật và quyền riêng tư

Tính năng Chụp vùng cho phép một ứng dụng web đang quan sát tất cả các pixel trong thẻ tự nguyện xoá một số pixel đó. Phương thức này rõ ràng là an toàn vì không thể thu thập được thông tin mới.

Bạn có thể sử dụng tính năng Chụp vùng để giới hạn thông tin được gửi đến người tham gia từ xa. Ví dụ: có thể bạn muốn chia sẻ một số trang trình bày nhưng không muốn chia sẻ ghi chú của người nói.

Ảnh chụp màn hình cửa sổ trình duyệt chứa các trang trình bày và ghi chú của người thuyết trình.
Ứng dụng web chứa các trang trình bày và ghi chú của người nói.
Không nên chia sẻ ghi chú từ xa. Chụp vùng theo tín hiệu.

Xin lưu ý rằng tính năng Chụp vùng trên thiết bị không đảm bảo bất kỳ tính năng bảo mật nào. Khi chuyển một bản nhạc sang một tài liệu khác, tài liệu nhận vẫn có thể huỷ cắt bản nhạc và truy cập vào tất cả các pixel của thẻ đã chụp.

Chrome vẽ đường viền màu xanh dương xung quanh các cạnh của thẻ đã chụp. Khi cắt, Chrome thường vẽ đường viền màu xanh dương xung quanh mục tiêu đã cắt.

Bản minh hoạ

Bạn có thể thử nghiệm tính năng Chụp vùng bằng cách chạy bản minh hoạ trên Glitch. Hãy nhớ xem mã nguồn.

Hỗ trợ trình duyệt

Hỗ trợ trình duyệt

  • Chrome: 104.
  • Edge: 104.
  • Firefox: không được hỗ trợ.
  • Safari: không được hỗ trợ.

Tính năng Chụp vùng chỉ có trên máy tính từ Chrome 104.

Bước tiếp theo

Sau đây là thông tin xem trước về những tính năng sắp ra mắt giúp cải thiện tính năng chia sẻ màn hình trên web:

  • Tính năng Chụp vùng sẽ hỗ trợ tính năng chụp các thẻ khác.
  • Tiêu điểm có điều kiện sẽ cho phép ứng dụng web chụp ảnh hướng dẫn trình duyệt chuyển tiêu điểm sang nền tảng hiển thị được chụp hoặc tránh thay đổi tiêu điểm như vậy.
  • Có thể cung cấp API chụp ở cấp phần tử.

Phản hồi

Nhóm Chrome và cộng đồng tiêu chuẩn web muốn biết trải nghiệm của bạn với tính năng Chụp vùng.

Giới thiệu về thiết kế

Có điều gì về tính năng Chụp vùng không hoạt động như mong đợi không? Hay có phương thức hoặc thuộc tính nào bị thiếu mà bạn cần để triển khai ý tưởng của mình không? Bạn có câu hỏi hoặc nhận xét về mô hình bảo mật?

  • Gửi vấn đề về thông số kỹ thuật trên kho lưu trữ GitHub hoặc thêm ý kiến của bạn vào một vấn đề hiện có.

Bạn gặp vấn đề khi triển khai?

Bạn có phát hiện lỗi khi triển khai Chrome không? Hay cách triển khai có khác với thông số kỹ thuật không?

  • Gửi lỗi tại https://new.crbug.com. Hãy nhớ cung cấp càng nhiều thông tin chi tiết càng tốt và hướng dẫn đơn giản để tái tạo lỗi. Glitch rất hữu ích để chia sẻ các bản tái hiện nhanh chóng và dễ dàng.

Thể hiện sự ủng hộ

Bạn có định sử dụng tính năng Chụp vùng không? Sự ủng hộ công khai của bạn giúp nhóm Chrome ưu tiên các tính năng và cho các nhà cung cấp trình duyệt khác thấy tầm quan trọng của việc hỗ trợ các tính năng đó.

Hãy gửi một tweet đến @ChromiumDev và cho chúng tôi biết bạn đang sử dụng công cụ này ở đâu và như thế nào.

Lời cảm ơn

Cảm ơn Joe Medley đã xem xét bài viết này.