VisioForge

Plattformübergreifende Bildschirmaufnahme in C# und .NET

Bauen Sie einen Bildschirmrekorder in C# mit einer API für Windows, macOS, Linux, Android und iOS: den ganzen Bildschirm, ein Fenster oder einen Bereich, mit Ton, Mauszeiger und Klick-Hervorhebung, als MP4 oder Livestream. Video Capture SDK .NET und Media Blocks SDK .NET nutzen auf jeder Plattform deren native Aufnahme-API.

Eine Screenshot-Schleife ist kein Bildschirmrekorder

Graphics.CopyFromScreen liefert unter Windows ein einzelnes Bitmap. Ein Rekorder braucht außerdem eine stabile Bildrate, den Mauszeiger, Ton, einen Encoder und eine Datei, deren Ton synchron zum Bild bleibt – und auf jedem anderen Betriebssystem ist die Aufnahme-API wieder eine andere: AVFoundation oder ScreenCaptureKit unter macOS, X11 unter Linux, MediaProjection unter Android, ReplayKit unter iOS. In den VisioForge SDKs ist der Bildschirm eine Videoquelle wie eine Webcam. ScreenSourceBlock verwendet die native API der Plattform, auf der er läuft, und Encoder, Datei und Stream sind überall derselbe Code.

Plattformübergreifenden Bildschirmrekorder selbst bauen oder das SDK nutzen

Typischer EigenbauVisioForge Video Capture SDK .NET und Media Blocks SDK .NET
Bildschirm aufnehmenAuf jedem Betriebssystem eine andere native API, jeweils hinter eigenem Interop-Code: Desktop Duplication oder Windows Graphics Capture unter Windows, ScreenCaptureKit oder AVFoundation unter macOS, X11 oder PipeWire unter Linux, MediaProjection unter Android, ReplayKit unter iOSScreenSourceBlock mit einer Einstellungsklasse pro Plattform; ScreenSourceBlock() ohne Argumente nimmt die Standardquelle der Plattform
Ein Fenster oder ein BereichFensterkennungen und Zuschneide-Code, die sich je Betriebssystem unterscheiden: HWND unter Windows, eine X11-Fenster-ID unter LinuxWindowHandle unter Windows oder XID unter Linux für ein Fenster, Rectangle für einen Bereich, MonitorIndex unter Windows oder Monitor unter macOS für den Monitor
Mauszeiger und KlicksZeiger und Klickmarkierungen selbst in jedes Bild einzeichnenCaptureCursor unter Windows, macOS und Linux; MouseHighlight zeichnet bei jedem Klick einen wachsenden Kreis – unter Windows über einen globalen Maus-Hook, auf anderen Plattformen aus Klicks, die Ihr Code übergibt
TonFür das Mikrofon eine eigene Audio-API pro Betriebssystem, dazu WASAPI-Loopback für den Systemton unter Windows, von Ihrem Code mit dem Bild synchronisiertSystemAudioSourceBlock für ein Mikrofon auf jeder Plattform, LoopbackAudioCaptureDeviceSourceSettings für den Systemton unter Windows, auf derselben Zeitachse wie das Bild
Kodierung und DateiMedia Foundation, VideoToolbox und MediaCodec einzeln einbinden oder mit jeder App einen FFmpeg-Build ausliefernH264EncoderBlock wählt MediaCodec, VideoToolbox oder NVENC, AMF und Quick Sync mit OpenH264 als Rückfall; Ausgabe als MP4, WebM, MKV, MOV, AVI oder MPEG-TS
Zu pflegender CodeFünf Plattform-Implementierungen, die geschrieben, getestet und synchron gehalten werden müssenEine C#-Pipeline; nur die Quelleinstellungen unterscheiden sich je Plattform

Bildschirmaufnahme auf jeder Plattform

ScreenSourceBlock() ohne Argumente wählt die Standardquelle der Plattform. Mit einem Einstellungsobjekt wählen Sie API, Fenster oder Bereich.

PlattformAufnahme-APIEinstellungsklasseTonHinweise
WindowsWindows Graphics Capture, DXGI Desktop Duplication, DirectX 9, GDIScreenCaptureD3D11SourceSettings, ScreenCaptureDX9SourceSettings, ScreenCaptureGDISourceSettingsSystemton (WASAPI-Loopback) oder ein MikrofonMonitor, Bereich oder ein Fenster; Klick-Hervorhebung
macOSAVFoundationScreenCaptureMacOSSourceSettingsMikrofonBenötigt die Berechtigung zur Bildschirmaufnahme: ScreenSourceBlock.AskPermissions()
Mac Catalyst (.NET MAUI)ScreenCaptureKitScreenCaptureMacOSSourceSettingsMikrofonDieselbe Einstellungsklasse wie unter macOS
LinuxX11ScreenCaptureXDisplaySourceSettingsMikrofonBenötigt eine X11-Sitzung; XID oder XName wählt ein Fenster
AndroidMediaProjectionAndroidScreenCaptureSourceSettingsMikrofonDer Nutzer bestätigt die Systemabfrage; die Aufnahme läuft in einem Foreground Service
iOSReplayKitIOSScreenSourceSettings, IOSBroadcastSourceSettingsMikrofonDie eigene App oder über eine Broadcast Upload Extension das ganze Gerät

Was das SDK für einen Bildschirmrekorder übernimmt

Bildschirm- und Desktopaufnahme ist in VideoCaptureCoreX (Video Capture SDK .NET) eine Videoquelle und in Media Blocks SDK .NET ein ScreenSourceBlock. Alles nach der Quelle funktioniert wie bei einer Kamera: Vorschau, Aufnahme, Streaming und Videoeffekte.

  • Drei Aufnahmemodi: der ganze Bildschirm eines beliebigen Monitors, ein Anwendungsfenster über sein Handle oder ein Rechteck des Desktops
  • Windows Graphics Capture ist ab Windows 10 Version 1803 standardmäßig gewählt; DXGI Desktop Duplication, DirectX 9 und GDI stehen ebenfalls zur Verfügung
  • Ton vom PC über WASAPI-Loopback oder von einem Mikrofon; in Media Blocks SDK .NET mischt AudioMixerBlock beides in eine Spur
  • Mauszeiger-Aufnahme und Klick-Hervorhebung mit einstellbarer Farbe, Größe und Dauer, für Tutorials und Demos. Unter Windows kommen die Klicks über einen globalen Maus-Hook: Ist MouseHighlight gesetzt, installiert VideoCaptureCoreX ihn beim Start; in Media Blocks rufen Sie MouseHighlightSubscribe() auf. Auf anderen Plattformen übergibt Ihr Code jeden Klick an MouseHighlightAddClickEvent (MouseHighlight_AddClickEvent in VideoCaptureCoreX)
  • Hardware-H.264: MediaCodec unter Android, VideoToolbox auf Apple-Plattformen; unter Windows probiert das SDK NVENC, AMF und Quick Sync und fällt auf OpenH264 zurück
  • Mehrere Ausgaben gleichzeitig: MP4 aufnehmen und denselben Bildschirm per RTMP, SRT oder NDI zu YouTube streamen; eine Aufnahme pausieren und fortsetzen oder eine neue Datei beginnen, ohne die Vorschau anzuhalten
  • Eine API für Windows, macOS, Linux, Android und iOS, aus WinForms, WPF, .NET MAUI sowie nativen macOS-, Android- und iOS-Apps; zu jedem gibt es ein Beispiel

Anwendungsfälle

Tutorial- und E-Learning-Rekorder

Ein Fenster oder den ganzen Bildschirm mit Sprechertext und Klick-Hervorhebung aufnehmen und die Lektion als MP4 speichern.

Support und Sitzungsaufzeichnung

Aufzeichnen, was ein Nutzer vor dem Auftreten eines Problems getan hat, und das Video an das Support-Ticket anhängen.

QA und Testautomatisierung

Jeden automatisierten UI-Testlauf aufnehmen und die Videos fehlgeschlagener Läufe als Nachweis behalten.

Präsentationen und Livestreams

Den Bildschirm zu YouTube oder einem NDI-Empfänger streamen und aus derselben Aufnahme eine lokale MP4-Kopie behalten.

Codebeispiele

Gekürzt aus den Screen-Capture-Demos von Video Capture SDK .NET und Media Blocks SDK .NET. Die ersten beiden laufen in einem WinForms-Formular, das dritte in einer .NET-MAUI-Seite; jedes hat einen VisioForge VideoView namens videoView1 oder videoView.

Bildschirm und Systemton als MP4 aufnehmen

C#

Ein Fenster mit Klick-Hervorhebung aufnehmen

C#

Ein Rekorder für Windows, macOS, Android und iOS (.NET MAUI)

C#

Die Pipeline

Das Fensterbeispiel und das .NET-MAUI-Beispiel verwenden dieselben vier Blöcke. ScreenSourceBlock nimmt den Bildschirm mit der API der Plattform auf, TeeBlock verteilt die Bilder auf Vorschau und Encoder, und MP4SinkBlock schreibt die Datei. Nur die Quelleinstellungen ändern sich von Plattform zu Plattform.

ScreenSourceBlock
TeeBlock
H264EncoderBlock
MP4SinkBlock

Häufige Fragen

Wie nehme ich den Ton auf, den der PC abspielt?▼
Verwenden Sie LoopbackAudioCaptureDeviceSourceSettings mit einem Ausgabegerät aus DeviceEnumerator.Shared.AudioOutputsAsync(AudioOutputDeviceAPI.WASAPI2) und setzen Sie Audio_Record auf true, wie im ersten Beispiel. Für Sprechertext nehmen Sie stattdessen ein Mikrofon aus AudioSourcesAsync. Um beides aufzunehmen, mischen Sie es mit AudioMixerBlock in Media Blocks SDK .NET.
Kann ich ein Fenster aufnehmen, das von anderen Fenstern verdeckt ist?▼
Ja, mit Windows Graphics Capture: Setzen Sie API auf D3D11ScreenCaptureAPI.WGC und WindowHandle auf das Handle des Fensters. WGC nimmt den eigenen Inhalt des Fensters auf, überlappende Fenster erscheinen also nicht in der Aufnahme. Ein minimiertes Fenster zeichnet nichts und wird nicht aufgenommen.
Funktioniert es unter macOS und Linux?▼
Ja. Unter macOS verwendet die Bildschirmquelle AVFoundation und benötigt die Berechtigung zur Bildschirmaufnahme: ScreenSourceBlock.AskPermissions() zeigt die Systemabfrage, und macOS wendet eine neue Berechtigung nach einem Neustart der App an. Unter Linux nimmt ScreenCaptureXDisplaySourceSettings ein X11-Display auf, die App braucht also eine X11-Sitzung. Encoder, Dateien und Streams sind dieselben wie unter Windows; Systemton-Loopback gibt es nur unter Windows, nehmen Sie dort also ein Mikrofon auf.
Kann ich den Bildschirm unter Android und iOS aufnehmen?▼
Ja, mit Media Blocks SDK .NET. Unter Android übernimmt AndroidScreenCaptureSourceSettings die MediaProjection, die Ihre App erhält, nachdem der Nutzer die Systemabfrage bestätigt hat. Unter iOS nimmt IOSScreenSourceSettings über ReplayKit Ihre eigene App auf, und IOSBroadcastSourceSettings nimmt über eine Broadcast Upload Extension das ganze Gerät auf.
Warum ist die Aufnahme schwarz?▼
Geschützte Inhalte wie DRM-Video werden vom Betriebssystem für die Aufnahme gesperrt. Bei anderen schwarzen Bildern probieren Sie die andere Aufnahme-API (WGC oder DXGI Desktop Duplication) oder die DirectX-9-Quelle. Auf einem Laptop mit zwei GPUs muss Desktop Duplication auf dem Adapter laufen, der das Display ansteuert; DXGIAdapter wählt ihn aus.
Welches SDK brauche ich?▼
Video Capture SDK .NET, wenn Sie eine fertige Aufnahme-Engine wollen: Video_Source, Audio_Source und eine Ausgabe setzen, dann StartAsync aufrufen. Media Blocks SDK .NET, wenn Sie die Pipeline aus Blöcken zusammensetzen, zum Beispiel um eigene Verarbeitung zwischen Bildschirm und Encoder einzufügen. Beide verwenden dieselben Bildschirmquellen.

Bildschirmaufnahme starten

Laden Sie die voll funktionsfähige 30-Tage-Testversion herunter und starten Sie die Screen-Capture-Demos. Je nach Engine und Ausgabe kann ein Wasserzeichen oder ein Hinweis auf die nicht registrierte Version erscheinen.

SDKs mit Bildschirmaufnahme