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 imagem em janela no painel de informações do site do navegador Chrome.

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

Os desenvolvedores Web podem usar a API Picture-in-Picture para <vídeo> para abrir uma janela picture-in-picture a partir de um elemento HTML <video> ou a API Document Picture-in-Picture para abrir uma janela sempre em cima para 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 fica visível novamente.

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 do usuário de imagem em janela

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 de documentos 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 modo 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 comentários ou encontrar problemas, compartilhe-os em crbug.com.

Recursos

Agradecimentos

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