Uma aplicação multiplataforma de gravação de tela poderosa e fácil de usar (Apenas grava a tela)
Construída com Avalonia UI e FFmpeg para performance superior
- 🖥️ Captura de múltiplos monitores: Grave qualquer monitor ou a área de trabalho virtual completa
- 🎯 Preview em tempo real: Visualização overlay da área selecionada para captura
- 📁 Pasta personalizável: Escolha onde salvar suas gravações
- ⚡ Performance otimizada: Usa codificadores de hardware quando disponíveis (h264_videotoolbox, h264_mf)
- 🌐 Multiplataforma: Windows, macOS e Linux
- 🎵 Suporte a áudio: Captura de áudio opcional (configurável)
- 💾 Auto-save: Salvamento automático com timestamps
- 🔄 Interface responsiva: UI moderna com MVVM pattern
- .NET 6.0 ou superior
- FFmpeg (incluído no bundle ou disponível no PATH do sistema)
- Clone o repositório:
git clone https://github.com/seu-usuario/screenforge.git
cd screenforge- Restore e build:
dotnet restore
dotnet build- Execute:
dotnet run --project ScreenForge.App- Selecione o monitor: Escolha qual monitor você deseja gravar na lista suspensa
- Defina a pasta de destino: Clique no botão de pasta para escolher onde salvar
- Inicie a gravação: Clique no botão "Iniciar Gravação"
- Pare quando necessário: Clique novamente para finalizar
ScreenForge/
├── ScreenForge.App/ # Interface do usuário (Avalonia)
│ ├── ViewModels/ # ViewModels (MVVM)
│ ├── Views/ # Views (XAML)
│ ├── Models/ # Modelos de dados
│ └── Services/ # Serviços da aplicação
├── ScreenForge.Core/ # Lógica principal
│ └── ScreenRecorder.cs # Gravador de tela
└── ScreenForge.FFmpeg/ # Wrapper do FFmpeg
└── FFmpegLocator.cs # Localizador do FFmpeg
O coração da aplicação, responsável por:
- Iniciar/parar gravações via FFmpeg
- Gerenciar processos de captura
- Suporte a diferentes plataformas
- Detecção automática de codificadores
var recorder = new ScreenRecorder();
// Iniciar gravação
var region = new CaptureRegion(false, 0, 0, 1920, 1080, null);
await recorder.StartAsync(region, "output.mp4", audioDevice: null);
// Parar gravação
await recorder.StopAsync();Localiza automaticamente o FFmpeg:
- Verifica se está no PATH do sistema
- Procura no bundle local da aplicação
- Detecta o RID correto da plataforma
var ffmpegPath = FFmpegLocator.Locate();
// Retorna: "ffmpeg" (se no PATH) ou caminho completo para o executávelViewModel principal com:
- Gerenciamento de estado da gravação
- Lista de monitores disponíveis
- Configurações persistentes
- Preview overlay
public void RefreshMonitors()
{
Monitors.Clear();
foreach (var monitor in DisplayService.GetMonitors(_window))
Monitors.Add(monitor);
SelectedMonitor ??= Monitors.Count > 0 ? Monitors[0] : null;
}Mostra uma sobreposição visual da área que será gravada:
private void ShowOverlayPreview(int autoHideMs)
{
if (_window is null || SelectedMonitor is null) return;
var rect = OverlayService.RectFor(_window, SelectedMonitor.Region);
OverlayService.Show(_window, rect, border: 3, autoHideMs);
}public class AppSettings
{
public string? SaveFolder { get; set; }
}
// Carregar configurações
var settings = SettingsService.Load();
// Salvar configurações
SettingsService.Save(new AppSettings { SaveFolder = "/path/to/folder" });- Codificadores testados:
libx264,h264_mf,mpeg4 - Captura:
gdigrabpara desktop - Áudio:
dshowpara dispositivos DirectShow
- Codificadores:
h264_videotoolbox(hardware acceleration) - Captura:
avfoundation - Áudio: Sistema de áudio nativo
- Codificadores:
libx264 - Captura:
x11grab - Áudio:
pulse(PulseAudio)
# Hardware acceleration (quando disponível)
h264_videotoolbox -b:v 6000k
# Software encoding - alta qualidade
libx264 -preset veryfast -crf 23
# Fallback
mpeg4 -q:v 5# Configuração padrão
-c:a aac -b:a 160k<PackageReference Include="Avalonia" Version="11.0.0" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.0" />A aplicação segue o padrão MVVM com:
- Models:
MonitorItem,CaptureRegion,AppSettings - ViewModels:
MainWindowViewModel(comObservablePropertyeRelayCommand) - Views: Interface Avalonia UI
- Services:
DisplayService,OverlayService,SettingsService
[RelayCommand] private void RefreshMonitors()
[RelayCommand] private async Task ChooseFolder()
[RelayCommand] private async Task ToggleRecord()- Execute a aplicação
- Verifique se os monitores são detectados corretamente
- Teste a gravação em diferentes resoluções
- Verifique se o áudio é capturado (se configurado)
A aplicação redireciona a saída de erro do FFmpeg para o console:
_proc.ErrorDataReceived += (_, e) =>
{
if (!string.IsNullOrEmpty(e.Data))
Console.WriteLine(e.Data);
};Inclua os binários do FFmpeg na estrutura:
runtimes/
├── win-x64/native/ffmpeg.exe
├── osx-x64/native/ffmpeg
├── osx-arm64/native/ffmpeg
└── linux-x64/native/ffmpeg
# Windows
dotnet publish -c Release -r win-x64 --self-contained
# macOS
dotnet publish -c Release -r osx-x64 --self-contained
# Linux
dotnet publish -c Release -r linux-x64 --self-containedpublic async Task SafeShutdownAsync()
{
try
{
if (IsRecording)
await _rec.StopAsync();
}
catch
{
_rec.ForceKill();
}
finally
{
OverlayService.Close();
}
}Se o FFmpeg trava, a aplicação tenta:
- Comando graceful "q"
- Timeout de 2 segundos
- Kill forçado se necessário
- Suporte a gravação de janela específica
- Configurações de qualidade ajustáveis
- Gravação com webcam
- Streaming ao vivo
- Edição básica de vídeo
- Hotkeys globais
- Gravação agendada
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
- Use async/await para operações assíncronas
- Siga o padrão MVVM
- Adicione tratamento de erro adequado
- Documente métodos públicos
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
- Avalonia UI - Framework UI multiplataforma
- FFmpeg - Biblioteca de processamento multimídia
- CommunityToolkit.Mvvm - Helpers MVVM
Feito com ❤️ para a comunidade de desenvolvedores