Picture-in-picture automático para apps da Web

François Beaufort
François Beaufort

Com a introdução recente da API Document Picture-in-Picture (e até antes), os desenvolvedores da Web estão cada vez mais interessados em abrir automaticamente uma janela picture-in-picture quando o usuário muda o foco da guia atual. Isso é especialmente útil para apps da Web de videoconferência, em que os apresentadores podem ver e interagir com os participantes em tempo real enquanto apresentam um documento ou usam outras guias ou janelas.

Uma janela picture-in-picture aberta e fechada automaticamente quando o usuário alterna entre guias.

Entrar no modo picture-in-picture automaticamente

Para oferecer suporte a esses casos de uso de videoconferência, a partir do Chrome 120, os apps da Web para computador podem entrar automaticamente no modo picture-in-picture, com algumas restrições para garantir uma experiência positiva do usuário. Um app da Web só pode usar o picture-in-picture automático se atender a todas as condições a seguir:

  • Ele registrou um gerenciador de ação de sessão de mídia para a ação "enterpictureinpicture".

  • Ele está capturando ativamente a câmera ou o microfone usando getUserMedia.

  • O usuário permite o "picture-in-picture automático" usando uma configuração do navegador ativada por padrão.

Captura de tela da configuração automática do picture-in-picture no painel de informações do site do navegador Chrome.
Configuração automática de Picture-in-Picture no painel de informações do site do navegador Chrome.

Quando um app da Web está qualificado, a função de callback do manipulador de ações da sessão de mídia para a ação "enterpictureinpicture" é acionada quando o usuário muda o foco para outra guia, permitindo que ele abra uma janela picture-in-picture sem um gesto do usuário.

Os desenvolvedores da Web podem usar a API Picture-in-Picture para <video> para abrir uma janela picture-in-picture de um elemento HTML <video> ou a API Document Picture-in-Picture para abrir uma janela sempre visível e preencher com conteúdo HTML arbitrário. A janela picture-in-picture não é focada quando aberta e é fechada automaticamente quando a visibilidade da página volta a ficar visível.

O exemplo a seguir mostra como solicitar acesso à câmera do usuário. Em seguida, registre com segurança um gerenciador de ação de sessão de mídia para a ação "enterpictureinpicture" com uma função de callback que abre uma janela picture-in-picture. Essa janela contém o fluxo de vídeo da câmera do usuário com a API Picture-in-Picture para <video>.

const video = document.querySelector("video");
// Request access to the user's camera.
navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => {
  video.srcObject = stream;
});

try {
  // Request video to automatically enter picture-in-picture when eligible.
  navigator.mediaSession.setActionHandler("enterpictureinpicture", () => {
    video.requestPictureInPicture();
  });
} catch (error) {
  console.log("The enterpictureinpicture action is not yet supported.");
}

Teste o exemplo de sessão de mídia de videoconferência.

Entrar no modo picture-in-picture pelo controle de mídia do navegador

A ação de sessão de mídia "enterpictureinpicture" também é útil quando o usuário quer entrar no modo picture-in-picture usando o controle de mídia na interface do navegador Chrome.

Captura de tela do controle de mídia no navegador Chrome, com o cursor no controle do usuário picture-in-picture.
Controle de mídia no navegador Chrome, com o cursor no controle de usuário de imagem em janela Picture-in-Picture.

Quando não há um elemento HTML <video> sendo reproduzido, mas apenas áudio, o registro do manipulador de ações da sessão de mídia para "enterpictureinpicture" informa ao navegador que o app da Web sabe como processar e vai cuidar da abertura de uma janela picture-in-picture.

Também é útil quando o app da Web quer usar a API Picture-in-Picture do Document para abrir uma janela picture-in-picture em vez de deixar o navegador processar com a API Picture-in-Picture para <video>.

O exemplo a seguir demonstra como registrar com segurança um gerenciador de ações de sessão de mídia para a ação "enterpictureinpicture". A função de callback abre uma janela picture-in-picture com a API Document Picture-in-Picture quando o usuário entra no picture-in-picture usando o controle de mídia na interface do navegador Chrome.

try {
  // Use the Document Picture-in-Picture API when entering
  // picture-in-picture from browser media control.
  navigator.mediaSession.setActionHandler("enterpictureinpicture", async () => {
    const pipWindow = await documentPictureInPicture.requestWindow();
    // Populate HTML content and handle closing window...
  });
} catch (error) {
  console.log("The enterpictureinpicture action is not yet supported.");
}

Teste a demonstração do player VideoJS da API Document Picture-in-Picture ou o exemplo da API Media Session.

Engajamento e compartilhamento de feedback

Se você tiver feedback ou encontrar algum problema, compartilhe em crbug.com.

Recursos

Agradecimentos

Agradecemos a Tommy Steimel, Ryan Flores, Shimi Rahim, Frank Liberato e Rachel Andrew pelas avaliações.