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

François Beaufort
François Beaufort

Com a recente introdução da API Document Picture-in-Picture (e até mesmo antes), os desenvolvedores da Web estão cada vez mais interessados em poder abrir automaticamente uma janela picture-in-picture quando o usuário muda o foco da guia atual. Isso é útil principalmente para apps da Web de videoconferência, que permitem que os apresentadores vejam e interajam 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 troca de guia.

Entrar no modo picture-in-picture automaticamente

Para oferecer suporte a esses casos de uso de videoconferência, os apps da Web para computador do Chrome 120 podem entrar automaticamente no modo picture-in-picture, com algumas restrições para garantir uma experiência do usuário positiva. Um app da Web só está qualificado para 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 via getUserMedia.

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

Captura de tela da configuração automática de picture-in-picture no painel de informações do site do navegador Chrome.
Configuração automática do modo 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 gerenciador de ações de 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 <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 ativada 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 se torna 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ções 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 stream 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 a amostra Sessão de mídia de videoconferência.

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

A ação da 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 de usuário picture-in-picture.
Controle de mídia no navegador Chrome, com o cursor no controle de usuário picture-in-picture.

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

Ela também é útil quando o app da Web quer usar a API Document Picture-in-Picture para abrir uma janela picture-in-picture em vez de permitir que o navegador processe isso com a API Picture-in-Picture para <vídeo>.

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 de sessão de mídia de vídeo (links em inglês).

Interaja e compartilhe feedback

Se você tiver comentários ou encontrar algum problema, compartilhe-os em crbug.com.

Recursos

Agradecimentos

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

Imagem principal por pine watt no Unsplash.