VisioForge

Grabación de pantalla multiplataforma en C# y .NET

Cree un grabador de pantalla en C# con una sola API para Windows, macOS, Linux, Android e iOS: la pantalla completa, una ventana o una región, con sonido, el cursor y el resaltado de clics, a MP4 o a una transmisión en vivo. Video Capture SDK .NET y Media Blocks SDK .NET usan la API de captura nativa de cada plataforma.

Un bucle de capturas de pantalla no es un grabador de pantalla

Graphics.CopyFromScreen le da un único mapa de bits en Windows. Un grabador necesita además una velocidad de fotogramas estable, el cursor, sonido, un codificador y un archivo cuyo audio se mantenga sincronizado con el vídeo, y en cada uno de los demás sistemas operativos la API de captura vuelve a ser distinta: AVFoundation o ScreenCaptureKit en macOS, X11 en Linux, MediaProjection en Android, ReplayKit en iOS. En los SDK de VisioForge la pantalla es una fuente de vídeo como una cámara web. ScreenSourceBlock usa la API nativa de la plataforma en la que se ejecuta, y el codificador, el archivo y la transmisión son el mismo código en todas partes.

Construir un grabador de pantalla multiplataforma por su cuenta o usar el SDK

Solución propia típicaVisioForge Video Capture SDK .NET y Media Blocks SDK .NET
Capturar la pantallaUna API nativa distinta en cada sistema operativo, cada una detrás de su propio código de interoperabilidad: Desktop Duplication o Windows Graphics Capture en Windows, ScreenCaptureKit o AVFoundation en macOS, X11 o PipeWire en Linux, MediaProjection en Android, ReplayKit en iOSScreenSourceBlock con una clase de configuración por plataforma; ScreenSourceBlock() sin argumentos toma la fuente predeterminada de la plataforma
Una ventana o una regiónIdentificadores de ventana y código de recorte que cambian según el sistema operativo: HWND en Windows, un ID de ventana X11 en LinuxWindowHandle en Windows o XID en Linux para una ventana, Rectangle para una región, MonitorIndex en Windows o Monitor en macOS para el monitor
Cursor y clicsComponer usted mismo el cursor y las marcas de clic en cada fotogramaCaptureCursor en Windows, macOS y Linux; MouseHighlight dibuja un círculo que se expande en cada clic, tomado de un hook global del ratón en Windows y pasado por su código en las demás plataformas
SonidoUna API de audio distinta por sistema operativo para el micrófono, más WASAPI loopback para el sonido del sistema en Windows, sincronizado con el vídeo por su códigoSystemAudioSourceBlock para un micrófono en todas las plataformas, LoopbackAudioCaptureDeviceSourceSettings para el sonido del sistema en Windows, en la misma línea de tiempo que el vídeo
Codificación y archivoEnvolver Media Foundation, VideoToolbox y MediaCodec uno a uno, o distribuir una compilación de FFmpeg con cada aplicaciónH264EncoderBlock elige MediaCodec, VideoToolbox, o NVENC, AMF y Quick Sync con OpenH264 como alternativa; salida a MP4, WebM, MKV, MOV, AVI o MPEG-TS
Código que mantenerCinco implementaciones por plataforma que escribir, probar y mantener alineadasUna sola canalización en C#; solo la configuración de la fuente cambia según la plataforma

Captura de pantalla en cada plataforma

ScreenSourceBlock() sin argumentos elige la fuente predeterminada de la plataforma. Pase un objeto de configuración para elegir la API, la ventana o la región.

PlataformaAPI de capturaClase de configuraciónSonidoNotas
WindowsWindows Graphics Capture, DXGI Desktop Duplication, DirectX 9, GDIScreenCaptureD3D11SourceSettings, ScreenCaptureDX9SourceSettings, ScreenCaptureGDISourceSettingsSonido del sistema (WASAPI loopback) o un micrófonoMonitor, región o una ventana; resaltado de clics
macOSAVFoundationScreenCaptureMacOSSourceSettingsMicrófonoRequiere el permiso de grabación de pantalla: ScreenSourceBlock.AskPermissions()
Mac Catalyst (.NET MAUI)ScreenCaptureKitScreenCaptureMacOSSourceSettingsMicrófonoLa misma clase de configuración que en macOS
LinuxX11ScreenCaptureXDisplaySourceSettingsMicrófonoRequiere una sesión X11; XID o XName selecciona una ventana
AndroidMediaProjectionAndroidScreenCaptureSourceSettingsMicrófonoEl usuario acepta el aviso del sistema; la grabación se ejecuta en un servicio en primer plano
iOSReplayKitIOSScreenSourceSettings, IOSBroadcastSourceSettingsMicrófonoSu propia aplicación, o todo el dispositivo mediante una Broadcast Upload Extension

Lo que el SDK hace por un grabador de pantalla

La grabación de pantalla y de escritorio es una fuente de vídeo en VideoCaptureCoreX (Video Capture SDK .NET) y un ScreenSourceBlock en Media Blocks SDK .NET. Todo lo que viene después de la fuente funciona igual que con una cámara: vista previa, grabación, transmisión y efectos de vídeo.

  • Tres modos de captura: la pantalla completa de cualquier monitor, una ventana de aplicación por su identificador o un rectángulo del escritorio
  • Windows Graphics Capture se selecciona de forma predeterminada en Windows 10 versión 1803 y posteriores; DXGI Desktop Duplication, DirectX 9 y GDI también están disponibles
  • Sonido del equipo mediante WASAPI loopback o de un micrófono; en Media Blocks SDK .NET, AudioMixerBlock mezcla ambos en una sola pista
  • Captura del cursor y resaltado de clics con color, radio y duración configurables, para tutoriales y demostraciones. En Windows los clics llegan de un hook global del ratón: cuando MouseHighlight está definido, VideoCaptureCoreX lo instala al iniciar; en Media Blocks se llama a MouseHighlightSubscribe(). En otras plataformas su código pasa cada clic a MouseHighlightAddClickEvent (MouseHighlight_AddClickEvent en VideoCaptureCoreX)
  • H.264 por hardware: MediaCodec en Android, VideoToolbox en las plataformas de Apple; en Windows el SDK prueba NVENC, AMF y Quick Sync y recurre a OpenH264
  • Varias salidas a la vez: grabar MP4 mientras se transmite la misma pantalla a YouTube por RTMP, SRT o NDI; pausar y reanudar una grabación o empezar un archivo nuevo sin detener la vista previa
  • Una sola API en Windows, macOS, Linux, Android e iOS, desde WinForms, WPF, .NET MAUI y aplicaciones nativas de macOS, Android e iOS; con un ejemplo para cada una

Casos de uso

Grabadores de tutoriales y e-learning

Grabe una ventana o toda la pantalla con narración y resaltado de clics, y guarde la lección en MP4.

Soporte y grabación de sesiones

Grabe lo que hizo un usuario antes de que apareciera un problema y adjunte el vídeo al ticket de soporte.

QA y automatización de pruebas

Grabe cada ejecución de pruebas de interfaz automatizadas y conserve el vídeo de las fallidas como evidencia.

Presentaciones y transmisiones en vivo

Transmita la pantalla a YouTube o a un receptor NDI y conserve una copia MP4 local de la misma captura.

Ejemplos de código

Resumidos a partir de las demos Screen Capture de Video Capture SDK .NET y Media Blocks SDK .NET. Los dos primeros se ejecutan en un formulario WinForms y el tercero en una página .NET MAUI; cada uno tiene un VideoView de VisioForge llamado videoView1 o videoView.

Grabar la pantalla y el sonido del sistema a MP4

C#

Grabar una ventana con resaltado de clics

C#

Un grabador para Windows, macOS, Android e iOS (.NET MAUI)

C#

La canalización

El ejemplo de la ventana y el de .NET MAUI usan los mismos cuatro bloques. ScreenSourceBlock captura la pantalla con la API de la plataforma, TeeBlock reparte los fotogramas entre la vista previa y el codificador, y MP4SinkBlock escribe el archivo. Solo la configuración de la fuente cambia de una plataforma a otra.

ScreenSourceBlock
TeeBlock
H264EncoderBlock
MP4SinkBlock

Preguntas frecuentes

¿Cómo grabo el sonido que reproduce el equipo?▼
Use LoopbackAudioCaptureDeviceSourceSettings con un dispositivo de salida de DeviceEnumerator.Shared.AudioOutputsAsync(AudioOutputDeviceAPI.WASAPI2) y ponga Audio_Record a true, como en el primer ejemplo. Para la narración, use en su lugar un micrófono de AudioSourcesAsync. Para grabar ambos, mézclelos con AudioMixerBlock en Media Blocks SDK .NET.
¿Puedo grabar una ventana tapada por otras ventanas?▼
Sí, con Windows Graphics Capture: ponga API a D3D11ScreenCaptureAPI.WGC y WindowHandle al identificador de la ventana. WGC captura el propio contenido de la ventana, así que las ventanas superpuestas no aparecen en la grabación. Una ventana minimizada no dibuja nada y no se captura.
¿Funciona en macOS y Linux?▼
Sí. En macOS la fuente de pantalla usa AVFoundation y requiere el permiso de grabación de pantalla: ScreenSourceBlock.AskPermissions() muestra el aviso del sistema, y macOS aplica un permiso nuevo después de reiniciar la aplicación. En Linux, ScreenCaptureXDisplaySourceSettings captura una pantalla X11, así que la aplicación necesita una sesión X11. Los codificadores, archivos y transmisiones son los mismos que en Windows; el loopback del sonido del sistema solo existe en Windows, así que en esas plataformas grabe un micrófono.
¿Puedo grabar la pantalla en Android e iOS?▼
Sí, con Media Blocks SDK .NET. En Android, AndroidScreenCaptureSourceSettings recibe la MediaProjection que obtiene su aplicación después de que el usuario acepte el aviso del sistema. En iOS, IOSScreenSourceSettings graba su propia aplicación mediante ReplayKit, e IOSBroadcastSourceSettings graba todo el dispositivo mediante una Broadcast Upload Extension.
¿Por qué la grabación sale en negro?▼
El sistema operativo bloquea la captura del contenido protegido, como el vídeo con DRM. Para otros fotogramas negros, pruebe la otra API de captura (WGC o DXGI Desktop Duplication) o la fuente DirectX 9. En un portátil con dos GPU, Desktop Duplication tiene que ejecutarse en el adaptador que controla la pantalla; DXGIAdapter lo selecciona.
¿Qué SDK necesito?▼
Video Capture SDK .NET si quiere un motor de captura listo: defina Video_Source, Audio_Source y una salida, y llame a StartAsync. Media Blocks SDK .NET si construye la canalización con bloques, por ejemplo para añadir su propio procesamiento entre la pantalla y el codificador. Ambos usan las mismas fuentes de pantalla.