Kiểm soát tính năng kéo, nghiêng và thu phóng của máy ảnh

Cuối cùng, bạn có thể điều khiển các tính năng xoay, nghiêng và thu phóng trên máy ảnh trên web.

François Beaufort
François Beaufort

Các giải pháp hội nghị truyền hình ở quy mô phòng triển khai camera bằng tính năng xoay, nghiêng và thu phóng (PTZ) giúp phần mềm hướng camera vào cuộc họp người tham gia. Kể từ Chrome 87, các tính năng xoay, nghiêng và thu phóng sẽ được bật Camera được cung cấp cho những trang web sử dụng chế độ hạn chế bản nhạc nội dung đa phương tiện trong MediaDevices.getUserMedia()MediaStreamTrack.applyConstraints().

Sử dụng API

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

Tính năng phát hiện tính năng cho phần cứng khác với tính năng mà bạn có thể đã quen thuộc. Sự có mặt của tên quy tắc ràng buộc "pan", "tilt""zoom" trong navigator.mediaDevices.getSupportedConstraints() cho bạn biết rằng trình duyệt có hỗ trợ API để kiểm soát PTZ của máy ảnh nhưng không hỗ trợ phần cứng máy ảnh hỗ trợ nó. Kể từ Chrome 87, tính năng kiểm soát PTZ của máy ảnh được hỗ trợ trên máy tính để bàn trong khi Android vẫn chỉ hỗ trợ tính năng thu phóng.

const supports = navigator.mediaDevices.getSupportedConstraints();
if (supports.pan && supports.tilt && supports.zoom) {
  // Browser supports camera PTZ.
}

Yêu cầu quyền truy cập vào PTZ của camera

Trang web chỉ được phép kiểm soát PTZ của camera nếu người dùng đã thể hiện rõ ràng đã cấp quyền PTZ cho camera thông qua một lời nhắc.

Để yêu cầu quyền truy cập vào PTZ của máy ảnh, hãy gọi navigator.mediaDevices.getUserMedia() bằng các điều kiện ràng buộc PTZ như được hiển thị dưới đây. Thao tác này sẽ nhắc người dùng cấp cả hai camera và camera thông thường có quyền PTZ.

Ảnh chụp màn hình lời nhắc người dùng PTZ sử dụng máy ảnh trong Chrome dành cho macOS.
Lời nhắc dành cho người dùng PTZ sử dụng máy ảnh.

Lời hứa được trả về sẽ phân giải bằng đối tượng MediaStream dùng để cho thấy luồng video của camera đến người dùng. Nếu camera không hỗ trợ PTZ, người dùng sẽ nhận được lời nhắc thông thường của camera.

try {
  // User is prompted to grant both camera and PTZ access in a single call.
  // If camera doesn't support PTZ, it falls back to a regular camera prompt.
  const stream = await navigator.mediaDevices.getUserMedia({
    // Website asks to control camera PTZ as well without altering the
    // current pan, tilt, and zoom settings.
    video: { pan: true, tilt: true, zoom: true }
  });

  // Show camera video stream to user.
  document.querySelector("video").srcObject = stream;
} catch (error) {
  // User denies prompt or matching media is not available.
  console.log(error);
}

Một quyền truy cập vào camera đã được cấp trước đó, cụ thể là quyền truy cập vào PTZ (không có quyền truy cập vào PTZ) không tự động có được quyền truy cập PTZ nếu quyền truy cập đó có sẵn. Đúng vậy ngay cả khi máy ảnh hỗ trợ PTZ. Bạn phải yêu cầu cấp quyền một lần nữa. May mắn là bạn có thể sử dụng Permissions API để truy vấn và giám sát trạng thái của quyền PTZ.

try {
  const panTiltZoomPermissionStatus = await navigator.permissions.query({
    name: "camera",
    panTiltZoom: true
  });

  if (panTiltZoomPermissionStatus.state == "granted") {
    // User has granted access to the website to control camera PTZ.
  }

  panTiltZoomPermissionStatus.addEventListener("change", () => {
    // User has changed PTZ permission status.
  });
} catch (error) {
  console.log(error);
}

Để biết liệu trình duyệt dựa trên Chromium có hỗ trợ PTZ cho máy ảnh hay không, hãy truy cập trang about://media-internals nội bộ và xem tính năng "Pan-Tilt-Zoom" cột trong phần "Quay video" ; "nghiêng" và "thu phóng" có nghĩa là máy ảnh hỗ trợ "PanTilt (Tuyệt đối)" và "Thu phóng (Tuyệt đối)" Kiểm soát UVC. "PanTilt (Tương đối)" và "Thu phóng (Tương đối)" Các trình duyệt dựa trên Chromium không hỗ trợ các chế độ điều khiển UVC.

Ảnh chụp màn hình trang nội bộ trong ChromeOS để gỡ lỗi hỗ trợ camera PTZ.
Trang nội bộ để gỡ lỗi hỗ trợ camera PTZ.

Điều khiển camera PTZ

Thao tác với các chức năng và chế độ cài đặt PTZ của máy ảnh bằng bản xem trước MediaStreamTrack từ đối tượng stream đã thu được trước đó. MediaStreamTrack.getCapabilities() trả về một từ điển có các thuộc tính khả năng và phạm vi hoặc giá trị được phép. Tương ứng, MediaStreamTrack.getSettings() trả về các chế độ cài đặt hiện tại.

Bạn chỉ có thể sử dụng các chế độ cài đặt và xoay, nghiêng, thu phóng nếu được hỗ trợ bởi camera và người dùng đã cấp quyền PTZ cho camera.

Điều khiển PTZ camera.

Gọi videoTrack.applyConstraints() bằng PTZ nâng cao thích hợp các hạn chế để điều khiển chế độ xoay, nghiêng và thu phóng của máy ảnh như minh hoạ trong ví dụ bên dưới. Lời hứa được trả về sẽ phân giải nếu thành công. Nếu không, Chrome sẽ từ chối nếu hoặc:

  • máy ảnh có quyền PTZ chưa được cấp.
  • phần cứng máy ảnh không hỗ trợ quy tắc ràng buộc PTZ.
  • trang không hiển thị với người dùng. Sử dụng API Chế độ hiển thị trang để phát hiện các thay đổi về chế độ hiển thị trang.
// Get video track capabilities and settings.
const [videoTrack] = stream.getVideoTracks();
const capabilities = videoTrack.getCapabilities();
const settings = videoTrack.getSettings();

// Let the user control the camera pan motion if the camera supports it
// and PTZ access is granted.
if ("pan" in settings) {
  const input = document.querySelector("input[type=range]");
  input.min = capabilities.pan.min;
  input.max = capabilities.pan.max;
  input.step = capabilities.pan.step;
  input.value = settings.pan;

  input.addEventListener("input", async () => {
    await videoTrack.applyConstraints({ advanced: [{ pan: input.value }] });
  });
}

if ("tilt" in settings) {
  // similar for tilt...
}
if ("zoom" in settings) {
  // similar for zoom...
}

Bạn cũng có thể định cấu hình tính năng xoay, nghiêng và thu phóng máy ảnh bằng cách gọi navigator.mediaDevices.getUserMedia() với một số giới hạn lý tưởng PTZ của máy ảnh giá trị. Điều này rất tiện lợi khi xác định trước các chức năng PTZ của camera. Ghi chú không được phép sử dụng các quy tắc ràng buộc bắt buộc (tối thiểu, tối đa, chính xác) ở đây.

const stream = await navigator.mediaDevices.getUserMedia({
  // Website asks to reset known camera pan.
  video: { pan: 0, deviceId: { exact: "myCameraDeviceId" } }
});

Sân chơi

Bạn có thể sử dụng API này bằng cách chạy bản minh hoạ trên Glitch. Hãy nhớ thanh toán mã nguồn.

Những điều cần cân nhắc về bảo mật

Các tác giả thông số kỹ thuật đã thiết kế và triển khai API này bằng cách sử dụng bao gồm cả quyền kiểm soát của người dùng, tính minh bạch và công thái học. Khả năng sử dụng tính năng này API chủ yếu được kiểm soát theo cùng một mô hình cấp quyền như API Thu thập nội dung nghe nhìn và API Luồng. Để phản hồi lời nhắc của người dùng, trang web này được phép kiểm soát camera PTZ chỉ khi trang hiển thị với người dùng.

Khả năng tương thích với trình duyệt

API MediaStream

Hỗ trợ trình duyệt

  • 55
  • 12
  • 15
  • 11

Nguồn

API Quyền

Hỗ trợ trình duyệt

  • 43
  • 79
  • 46
  • 16

Nguồn

API Hiển thị trang

Hỗ trợ trình duyệt

  • 33
  • 12
  • 18
  • 7

Nguồn

MediaDevices.getUserMedia()

Hỗ trợ trình duyệt

  • 53
  • 12
  • 36
  • 11

Nguồn

MediaDevices.getSupportedConstraints()

Hỗ trợ trình duyệt

  • 53
  • 12
  • 44
  • 11

Nguồn

MediaStreamTrack.applyConstraints()

Hỗ trợ trình duyệt

  • 59
  • 12
  • 43
  • 11

Nguồn

MediaStreamTrack.getCapabilities()

Hỗ trợ trình duyệt

  • 59
  • 12
  • x
  • 11

Nguồn

MediaStreamTrack.getSettings()

Hỗ trợ trình duyệt

  • 59
  • 12
  • 50
  • 11

Nguồn

Các đường liên kết hữu ích

Xác nhận

Bài viết này do Joe MedleyThomas Steiner đánh giá. Xin cảm ơn Rijubrata BhaumikEero Häkkinen tại Intel vì những đóng góp của họ đặc tả kỹ thuật và cách triển khai. Hình ảnh chính của Christina @ wocintechchat.com trên Unsplash.