PiP Cam é um widget de câmera flutuante inteligente desenvolvido com Python 3.12+ e PyQt6. Provides a highly customizable, always-on-top webcam overlay designed for content creators, streamers, and presenters who need a persistent picture-in-picture feed during screen sharing or live broadcasts.
PiP Cam resolve um problema comum para streamers e apresentadores: necessidade de uma visão persistente de webcam enquanto usam software de captura de tela que não suporta nativamente picture-in-picture. O aplicativo cria uma janela flutuante sem borda e sempre visível que permanece sobre outras aplicações, com processamento de vídeo em tempo real, mascaramento de formas geométricas e feedback visual reativo ao áudio.
O aplicativo opera em dois modos:
- Modo Configuração (Launcher): Uma interface de configuração para selecionar câmeras, ajustar parâmetros e iniciar widgets
- Modo Widget: A sobreposição de câmera flutuante com controles interativos
| Configuração Launcher | Widget Flutuante |
|---|---|
![]() |
| Modo Multi-Câmera |
|---|
![]() |
- Círculo: Máscara circular com borda com anti-aliasing
- Quadrado (1:1): Retângulo com cantos arredondados em proporção 1:1
- Retângulo (4:3): Proporção clássica 4:3 com cantos arredondados
- Inicie múltiplas instâncias independentes de widget de diferentes câmeras simultaneamente
- Cada widget mantém seu próprio estado (posição, tamanho, zoom, formato)
- Navegue pelas câmeras disponíveis com atalhos globais
- Alterna entre feed de câmera ao vivo e uma foto de perfil estática
- Suporta formatos PNG, JPG e JPEG
- A imagem é cortada ao centro para preencher as dimensões do widget
- Armazenamento de configuração por câmera:
- Nível de zoom (100%-500%)
- Posição Pan X/Y (0-100%)
- Tamanho do widget (pixels)
- Posição da janela (coordenadas X, Y)
- Persistência de configurações globais:
- Última câmera selecionada
- Último formato usado
- Cor da borda
- Modo da borda
- Caminho do avatar
- Dispositivo de microfone
- Sensibilidade do microfone
- Estado inicial de mute
- Visibilidade da borda
- Modo Slim (Toolbar oculta)
- Modo Multi-Câmeras
- Exclua câmeras ou microfones indesejados das listas de dispositivos
- Dispositivos filtrados são ocultados mas não desabilitados no nível do SO
- Oculta controles da barra flutuante
- Opera o widget exclusivamente via atalhos globais
O projeto segue uma arquitetura inspirada em MVC com separação clara entre lógica de negócio, componentes de UI e utilitários.
pip-cam/
├── main.py # Ponto de entrada do aplicativo
├── pyproject.toml # Metadados do projeto e dependências
├── inno-setup-action.iss # Script para gerar instalador Windows
├── classes/
│ ├── core/ # Camada de lógica de negócio
│ │ ├── config_manager.py # Singleton de configuração com I/O debounced
│ │ ├── device_manager.py # Enumeração de câmera/microfone
│ │ ├── video_processor.py # Processamento de frames e geração de máscaras
│ │ ├── audio_analyzer.py # Análise de RMS de áudio em tempo real
│ │ └── hotkey_manager.py # Atalhos de teclado globais
│ ├── views/ # Widgets principais de UI
│ │ ├── launcher.py # Janela de configuração
│ │ └── pip_widget.py # Widget de câmera flutuante
│ ├── ui/ # Componentes reutilizáveis de UI
│ │ ├── floating_toolbar.py # Botões de controle do overlay
│ │ └── filter_dialogs.py # Diálogos de filtragem de dispositivos
│ └── shortcut_signals.py # Definições de sinais PyQt
├── utils/
│ └── functions.py # Leitura/escrita de config, caminhos de recursos, migrações
├── tests/ # Suíte de testes automatizados
├── assets/ # Ícones e imagens
└── docs/ # Documentação adicional
Para detalhes de cada categoria de teste, consulte docs/sobre-os-testes.md.
- Sistema Operacional: Windows 10/11 (alvo principal), Linux/macOS
- Python: 3.12+ (testado em 3.12 e 3.14)
- Dependências: Ver
pyproject.toml
keyboard>=0.13.5 # Hooks globais de teclado
numpy>=2.2.6 # Operações numéricas para processamento de áudio
opencv-python>=4.13.0.92 # Captura de vídeo e manipulação de frames
pygrabber>=0.2 # Enumeração de dispositivos DirectShow (Windows)
pyqt6>=6.11.0 # Bindings Qt6 para GUI
sounddevice>=0.5.5 # Stream de entrada de áudio
pytest>=9.0.3 # Framework de testes
pytest-qt>=4.5.0 # Integração de testes com PyQt6
pytest-cov>=7.1.0 # Relatório de cobertura de testes
pytest-mock>=3.15.1 # Mocks para testes
coverage>=7.13.5 # Ferramenta de cobertura independente
poe>=0.30.0 # Task runner (poethepoet)
Todos os atalhos usam o modificador Alt e funcionam em todo o sistema, mesmo quando o aplicativo não está em foco.
| Atalho | Ação |
|---|---|
Alt + S |
Alternar visibilidade do widget (fade in/out) |
Alt + C |
Navegar pelas câmeras disponíveis |
Alt + M |
Alternar mute do microfone |
Alt + A |
Alternar modo avatar (câmera ↔ foto de perfil) |
Alt + F |
Navegar pelas formas geométricas (Círculo → 1:1 → 4:3) |
Alt + D |
Alternar modo da borda (Cor Sólida ↔ Reativo ao Áudio) |
Alt + B |
Exibir/Ocultar borda |
Alt + + |
Aumentar tamanho do widget (+20px) |
Alt + - |
Diminuir tamanho do widget (-20px) |
Esc |
Fechar widget e retornar ao launcher |
Usando uv
Caso não tenha o uv em sua máquina, link para instalação aqui.
# Clone o repositório
git clone https://github.com/silv4b/pip-cam.git
cd pip-cam
# Instale as dependências
uv sync
# Execute o aplicativo
uv run main.pyCopie e cole o comando abaixo no PowerShell:
irm https://raw.githubusercontent.com/silv4b/pip-cam/main/install.ps1 | iexOs atalhos globais de teclado requerem permissão de acesso ao dispositivo de input. No Linux, há duas maneiras:
Método 1 - Adicionar ao grupo input (Recomendado):
# Adicione seu usuário ao grupo input
sudo usermod -aG input $USER
# Faça logout e login para aplicar
# (ou reinicie o computador)Método 2 - Regra udev (Alternativa):
Crie o arquivo /etc/udev/rules.d/99-pipcam-input.rules:
sudo nano /etc/udev/rules.d/99-pipcam-input.rulesAdicione:
KERNEL=="event*", GROUP="input", MODE="0660"
Recarregue as regras:
sudo udevadm control --reload-rules
sudo udevadm triggerNota: Sem essa permissão, os atalhos globais não funcionarão. Você poderá controlar o widget apenas via clique na barra de ferramentas.
uv buildIsso executa o PyInstaller com as seguintes opções:
- Saída em arquivo único (
--onefile) - Modo windowed (sem console,
--windowed) - Ícone customizado (
assets/pipcam_icon.ico) - Agrupa diretórios
classes/,utils/eassets/
Saída: dist/pipcamwin.exe
O projeto inclui inno-setup-action.iss para criar um instalador Windows. Abra o arquivo no Inno Setup Compiler para gerar PipCamSetup.exe.
As configurações do projeto são salvas em: %APPDATA%/PiP_Cam/ no Windows.
{
"border_color": "#4d6fc4", // default color
"border_mode": "Cor Sólida", // default mode
"last_mode": "Círculo", // default shape
"last_camera_name": "USB Camera", // default camera
"use_avatar": false, // default avatar
"avatar_path": "",
"multi_cam_mode": false,
"hide_toolbar": false,
"show_border": true,
"starts_muted": false,
"ignored_cameras": [],
"ignored_mics": [],
"mic_device": 0,
"audio_sensitivity": 2.0,
"USB Camera_Círculo": {
"size": 300,
"zoom": 100,
"pan_x": 50,
"pan_y": 50,
"x": 960,
"y": 540
}
}O aplicativo migra automaticamente arquivos de configuração legados de:
pip_config.jsonlocal →%APPDATA%/PiP_Cam/- Diretório
avatar/local →%APPDATA%/PiP_Cam/avatars/
- Inicie o aplicativo: Execute
main.pyoupipcamwin.exe - Configure no Launcher:
- Selecione uma câmera no dropdown
- Escolha o formato geométrico (Círculo, Quadrado, Retângulo)
- Ajuste a largura inicial (100-2000px)
- Defina o nível de zoom (1.0x-5.0x)
- Configure o alinhamento Pan (eixos X e Y)
- Escolha o comportamento da borda (Cor Sólida ou Reativo ao Áudio)
- Ajuste a sensibilidade do áudio para o modo reativo
- Defina se o áudio deve iniciar mutado ou se a borda ficará oculta
- Opcionalmente selecione uma imagem de avatar
- Habilite o modo Multi-Câmera para múltiplas instâncias
- Habilite o modo Slim para ocultar a toolbar
- Clique em "Iniciar Câmera" para criar o widget flutuante
- Posicione e redimensione o widget arrastando
- Use os atalhos globais para controlar todos os widgets abertos simultaneamente
Este projeto está sob a Licença MIT. Veja o arquivo LICENSE para detalhes.
O último release do GitHub v1.3.0 pode estar atrás do código fonte. O projeto está em desenvolvimento ativo, e funcionalidades ou correções de bugs presentes no branch principal podem não estar refletidas no release publicado. Para a versão mais atualizada, compile a partir do código fonte seguindo as instruções acima.

