Controlla panoramica, inclinazione e zoom della videocamera

Le funzionalità di panoramica, inclinazione e zoom delle videocamere sono finalmente controllabili sul web.

François Beaufort
François Beaufort

Le soluzioni di videoconferenza su scala stanza utilizzano videocamere con funzionalità di panoramica, inclinazione e zoom (PTZ) in modo che il software possa puntare la videocamera verso i partecipanti alla riunione. A partire da Chrome 87, le funzionalità di panoramica, inclinazione e zoom delle videocamere sono disponibili per i siti web che utilizzano i vincoli delle tracce multimediali in MediaDevices.getUserMedia() e MediaStreamTrack.applyConstraints().

Utilizzo dell'API

Rilevamento delle caratteristiche

Il rilevamento delle funzionalità per l'hardware è diverso da quello a cui probabilmente sei abituato. La presenza dei nomi dei vincoli "pan", "tilt" e "zoom" in navigator.mediaDevices.getSupportedConstraints() indica che il browser supporta l'API per controllare la funzionalità PTZ della videocamera, ma non se l'hardware della videocamera la supporta. A partire da Chrome 87, il controllo PTZ della videocamera è supportato su computer, mentre Android supporta ancora solo lo zoom.

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

Richiedi l'accesso PTZ alla videocamera

Un sito web è autorizzato a controllare la funzionalità PTZ della videocamera solo se l'utente ha concesso esplicitamente l'autorizzazione PTZ alla videocamera tramite un prompt.

Per richiedere l'accesso PTZ alla videocamera, chiama navigator.mediaDevices.getUserMedia() con i vincoli PTZ come mostrato di seguito. In questo modo, all'utente verrà chiesto di concedere le autorizzazioni per la fotocamera normale e per la fotocamera con PTZ.

Screenshot di un prompt utente PTZ della videocamera in Chrome per macOS.
Prompt utente PTZ della videocamera.

La promessa restituita si risolve con un oggetto MediaStream utilizzato per mostrare lo stream video della videocamera all'utente. Se la videocamera non supporta PTZ, all'utente viene mostrato un prompt della videocamera normale.

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);
}

Un'autorizzazione fotocamera concessa in precedenza, in particolare una senza accesso PTZ, non ottiene automaticamente l'accesso PTZ se diventa disponibile. Questo vale anche se la videocamera supporta la funzionalità PTZ. L'autorizzazione deve essere richiesta di nuovo. Fortunatamente, puoi utilizzare l'API Permissions per eseguire query e monitorare lo stato dell'autorizzazione 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);
}

Per sapere se un browser basato su Chromium supporta PTZ per una videocamera, vai alla pagina interna about://media-internals e controlla la colonna "Pan-Tilt-Zoom" nella scheda "Video Capture". "pan tilt" e "zoom" indicano rispettivamente che la videocamera supporta i controlli UVC "PanTilt (Absolute)" e "Zoom (Absolute)". I controlli UVC "PanTilt (Relative)" e "Zoom (Relative)" non sono supportati nei browser basati su Chromium.

Pagina di debug interna di ChromeOS.
Pagina interna per eseguire il debug del supporto della videocamera PTZ.

Controllare la videocamera PTZ

Manipola le funzionalità e le impostazioni PTZ della videocamera utilizzando l'anteprima MediaStreamTrack dall'oggetto stream ottenuto in precedenza. MediaStreamTrack.getCapabilities() restituisce un dizionario con le funzionalità supportate e gli intervalli o i valori consentiti. Di conseguenza, MediaStreamTrack.getSettings() restituisce le impostazioni correnti.

Le funzionalità e le impostazioni di panoramica, inclinazione e zoom sono disponibili solo se supportate dalla videocamera e se l'utente ha concesso l'autorizzazione PTZ alla videocamera.

Controllo della videocamera PTZ.

Chiama videoTrack.applyConstraints() con i vincoli PTZ avanzati appropriati per controllare la panoramica, l'inclinazione e lo zoom della videocamera, come mostrato nell'esempio. La promessa restituita viene risolta se l'operazione ha esito positivo. Rifiuta se:

  • La videocamera con autorizzazione PTZ non è concessa.
  • L'hardware della videocamera non supporta il vincolo PTZ.
  • La pagina non è visibile all'utente. Utilizza l'API Page Visibility per rilevare le modifiche alla visibilità della pagina.
// 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...
}

È anche possibile configurare la panoramica, l'inclinazione e lo zoom della videocamera chiamando navigator.mediaDevices.getUserMedia() con alcuni valori di vincolo ideali per la videocamera PTZ. Questa opzione è utile quando le funzionalità PTZ della videocamera sono note in anticipo. Tieni presente che i vincoli obbligatori (min, max, exact) non sono consentiti qui.

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

Parco giochi

Puoi sperimentare con l'API eseguendo la demo.

Considerazioni sulla sicurezza

Gli autori della specifica hanno progettato e implementato questa API utilizzando il nucleo, tra cui il controllo utente, la trasparenza e l'ergonomia. La possibilità di utilizzare questa API è regolata principalmente dallo stesso modello di autorizzazioni dell'API Media Capture and Streams. In risposta a un prompt dell'utente, il sito web è autorizzato a controllare la funzionalità PTZ della videocamera solo quando la pagina è visibile all'utente.

Compatibilità del browser

API MediaStream

Browser Support

  • Chrome: 55.
  • Edge: 12.
  • Firefox: 15.
  • Safari: 11.

Source

API Permissions

Browser Support

  • Chrome: 43.
  • Edge: 79.
  • Firefox: 46.
  • Safari: 16.

Source

API Page Visibility

Browser Support

  • Chrome: 33.
  • Edge: 12.
  • Firefox: 18.
  • Safari: 7.

Source

MediaDevices.getUserMedia()

Browser Support

  • Chrome: 53.
  • Edge: 12.
  • Firefox: 36.
  • Safari: 11.

Source

MediaDevices.getSupportedConstraints()

Browser Support

  • Chrome: 53.
  • Edge: 12.
  • Firefox: 44.
  • Safari: 11.

Source

MediaStreamTrack.applyConstraints()

Browser Support

  • Chrome: 59.
  • Edge: 12.
  • Firefox: 43.
  • Safari: 11.

Source

MediaStreamTrack.getCapabilities()

Browser Support

  • Chrome: 59.
  • Edge: 12.
  • Firefox: 132.
  • Safari: 11.

Source

MediaStreamTrack.getSettings()

Browser Support

  • Chrome: 59.
  • Edge: 12.
  • Firefox: 50.
  • Safari: 11.

Source

Link utili

Ringraziamenti

Questo articolo è stato rivisto da Joe Medley e Thomas Steiner. Ringraziamo Rijubrata Bhaumik ed Eero Häkkinen di Intel per il loro lavoro sulla specifica e sull'implementazione.