VisioForge

Wieloplatformowe nagrywanie ekranu w C# i .NET

Zbuduj rejestrator ekranu w C# z jednym API dla Windows, macOS, Linux, Android i iOS: cały ekran, okno lub obszar, z dźwiękiem, kursorem i podświetleniem kliknięć, do pliku MP4 lub transmisji na żywo. Video Capture SDK .NET i Media Blocks SDK .NET korzystają z natywnego API przechwytywania każdej platformy.

Pętla zrzutów ekranu to nie rejestrator ekranu

Graphics.CopyFromScreen daje jedną bitmapę w systemie Windows. Rejestrator potrzebuje jeszcze stałej liczby klatek, kursora, dźwięku, kodera i pliku, w którym dźwięk pozostaje zsynchronizowany z obrazem, a w każdym innym systemie operacyjnym API przechwytywania jest znowu inne: AVFoundation lub ScreenCaptureKit w macOS, X11 w Linuksie, MediaProjection w Androidzie, ReplayKit w iOS. W SDK VisioForge ekran jest źródłem wideo jak kamera internetowa. ScreenSourceBlock używa natywnego API platformy, na której działa, a koder, plik i transmisja to wszędzie ten sam kod.

Własny wieloplatformowy rejestrator ekranu czy SDK

Typowe rozwiązanie własneVisioForge Video Capture SDK .NET i Media Blocks SDK .NET
Przechwytywanie ekranuInne natywne API w każdym systemie, każde za własnym kodem interop: Desktop Duplication lub Windows Graphics Capture w Windows, ScreenCaptureKit lub AVFoundation w macOS, X11 lub PipeWire w Linuksie, MediaProjection w Androidzie, ReplayKit w iOSScreenSourceBlock z jedną klasą ustawień na platformę; ScreenSourceBlock() bez argumentów bierze domyślne źródło platformy
Jedno okno lub obszarIdentyfikatory okien i kod przycinania różne w każdym systemie: HWND w Windows, identyfikator okna X11 w LinuksieWindowHandle w Windows lub XID w Linuksie dla okna, Rectangle dla obszaru, MonitorIndex w Windows lub Monitor w macOS dla monitora
Kursor i kliknięciaSamodzielne nakładanie kursora i znaczników kliknięć na każdą klatkęCaptureCursor w Windows, macOS i Linuksie; MouseHighlight rysuje rozszerzający się okrąg przy każdym kliknięciu, pobranym z globalnego hooka myszy w Windows i przekazanym przez Twój kod na innych platformach
DźwiękOsobne API audio w każdym systemie dla mikrofonu, plus loopback WASAPI dla dźwięku systemowego w Windows, synchronizowane z obrazem przez Twój kodSystemAudioSourceBlock dla mikrofonu na każdej platformie, LoopbackAudioCaptureDeviceSourceSettings dla dźwięku systemowego w Windows, na tej samej osi czasu co obraz
Kodowanie i plikMedia Foundation, VideoToolbox i MediaCodec opakowane jeden po drugim albo kompilacja FFmpeg dołączana do każdej aplikacjiH264EncoderBlock wybiera MediaCodec, VideoToolbox albo NVENC, AMF i Quick Sync z OpenH264 jako rezerwą; wyjście MP4, WebM, MKV, MOV, AVI lub MPEG-TS
Kod do utrzymaniaPięć implementacji platformowych do napisania, przetestowania i utrzymania w zgodnościJeden potok w C#; zmieniają się tylko ustawienia źródła na danej platformie

Przechwytywanie ekranu na każdej platformie

ScreenSourceBlock() bez argumentów wybiera domyślne źródło platformy. Przekaż obiekt ustawień, aby wybrać API, okno lub obszar.

PlatformaAPI przechwytywaniaKlasa ustawieńDźwiękUwagi
WindowsWindows Graphics Capture, DXGI Desktop Duplication, DirectX 9, GDIScreenCaptureD3D11SourceSettings, ScreenCaptureDX9SourceSettings, ScreenCaptureGDISourceSettingsDźwięk systemowy (loopback WASAPI) lub mikrofonMonitor, obszar lub jedno okno; podświetlenie kliknięć
macOSAVFoundationScreenCaptureMacOSSourceSettingsMikrofonWymaga uprawnienia do nagrywania ekranu: ScreenSourceBlock.AskPermissions()
Mac Catalyst (.NET MAUI)ScreenCaptureKitScreenCaptureMacOSSourceSettingsMikrofonTa sama klasa ustawień co w macOS
LinuxX11ScreenCaptureXDisplaySourceSettingsMikrofonWymaga sesji X11; XID lub XName wybiera okno
AndroidMediaProjectionAndroidScreenCaptureSourceSettingsMikrofonUżytkownik akceptuje monit systemowy; nagrywanie działa w usłudze pierwszoplanowej
iOSReplayKitIOSScreenSourceSettings, IOSBroadcastSourceSettingsMikrofonWłasna aplikacja albo całe urządzenie przez Broadcast Upload Extension

Co SDK robi dla rejestratora ekranu

Nagrywanie ekranu i pulpitu to źródło wideo w VideoCaptureCoreX (Video Capture SDK .NET) i ScreenSourceBlock w Media Blocks SDK .NET. Wszystko za źródłem działa tak samo jak dla kamery: podgląd, nagrywanie, transmisja i efekty wideo.

  • Trzy tryby przechwytywania: cały ekran dowolnego monitora, jedno okno aplikacji według uchwytu lub prostokąt pulpitu
  • Windows Graphics Capture jest wybierany domyślnie w Windows 10 w wersji 1803 i nowszych; dostępne są też źródła DXGI Desktop Duplication, DirectX 9 i GDI
  • Dźwięk z komputera przez loopback WASAPI lub z mikrofonu; w Media Blocks SDK .NET AudioMixerBlock miksuje oba w jedną ścieżkę
  • Przechwytywanie kursora i podświetlanie kliknięć z konfigurowalnym kolorem, promieniem i czasem trwania, do samouczków i prezentacji. W Windows kliknięcia pochodzą z globalnego hooka myszy: gdy ustawiono MouseHighlight, VideoCaptureCoreX instaluje go przy starcie; w Media Blocks wywołujesz MouseHighlightSubscribe(). Na innych platformach Twój kod przekazuje każde kliknięcie do MouseHighlightAddClickEvent (MouseHighlight_AddClickEvent w VideoCaptureCoreX)
  • Sprzętowe H.264: MediaCodec w Androidzie, VideoToolbox na platformach Apple; w Windows SDK próbuje NVENC, AMF i Quick Sync, a w razie braku używa OpenH264
  • Kilka wyjść naraz: nagrywaj MP4, transmitując ten sam ekran do YouTube przez RTMP, SRT lub NDI; wstrzymuj i wznawiaj nagrywanie albo zaczynaj nowy plik bez zatrzymywania podglądu
  • Jedno API w Windows, macOS, Linuksie, Androidzie i iOS, z WinForms, WPF, .NET MAUI oraz natywnych aplikacji macOS, Android i iOS; przykład dla każdej

Zastosowania

Rejestratory samouczków i e-learningu

Nagraj okno lub cały ekran z komentarzem i podświetleniem kliknięć, a lekcję zapisz do MP4.

Wsparcie i nagrywanie sesji

Nagraj, co użytkownik robił przed pojawieniem się problemu, i dołącz wideo do zgłoszenia.

QA i automatyzacja testów

Nagrywaj każde uruchomienie automatycznych testów interfejsu i zachowuj wideo z nieudanych jako dowód.

Prezentacje i transmisje na żywo

Transmituj ekran do YouTube lub odbiornika NDI i zachowaj lokalną kopię MP4 z tego samego przechwytywania.

Przykłady kodu

Skrócone z demonstracji Screen Capture z Video Capture SDK .NET i Media Blocks SDK .NET. Dwa pierwsze działają w formularzu WinForms, trzeci na stronie .NET MAUI; każdy ma VideoView VisioForge o nazwie videoView1 lub videoView.

Nagrywanie ekranu i dźwięku systemowego do MP4

C#

Nagrywanie jednego okna z podświetleniem kliknięć

C#

Jeden rejestrator dla Windows, macOS, Android i iOS (.NET MAUI)

C#

Potok

Przykład z oknem i przykład .NET MAUI używają tych samych czterech bloków. ScreenSourceBlock przechwytuje ekran przez API platformy, TeeBlock dzieli klatki między podgląd a koder, a MP4SinkBlock zapisuje plik. Między platformami zmieniają się tylko ustawienia źródła.

ScreenSourceBlock
TeeBlock
H264EncoderBlock
MP4SinkBlock

Najczęściej zadawane pytania

Jak nagrać dźwięk odtwarzany przez komputer?▼
Użyj LoopbackAudioCaptureDeviceSourceSettings z urządzeniem wyjściowym z DeviceEnumerator.Shared.AudioOutputsAsync(AudioOutputDeviceAPI.WASAPI2) i ustaw Audio_Record na true, jak w pierwszym przykładzie. Do komentarza użyj zamiast tego mikrofonu z AudioSourcesAsync. Aby nagrać oba, zmiksuj je za pomocą AudioMixerBlock w Media Blocks SDK .NET.
Czy mogę nagrać okno zasłonięte innymi oknami?▼
Tak, przez Windows Graphics Capture: ustaw API na D3D11ScreenCaptureAPI.WGC, a WindowHandle na uchwyt okna. WGC przechwytuje własną zawartość okna, więc nakładające się okna nie pojawiają się w nagraniu. Zminimalizowane okno niczego nie rysuje i nie jest przechwytywane.
Czy to działa w macOS i Linuksie?▼
Tak. W macOS źródło ekranu używa AVFoundation i wymaga uprawnienia do nagrywania ekranu: ScreenSourceBlock.AskPermissions() wyświetla monit systemowy, a macOS stosuje nowe uprawnienie po ponownym uruchomieniu aplikacji. W Linuksie ScreenCaptureXDisplaySourceSettings przechwytuje ekran X11, więc aplikacja potrzebuje sesji X11. Kodery, pliki i transmisje są takie same jak w Windows; loopback dźwięku systemowego istnieje tylko w Windows, więc tam nagrywaj mikrofon.
Czy mogę nagrywać ekran w Androidzie i iOS?▼
Tak, za pomocą Media Blocks SDK .NET. W Androidzie AndroidScreenCaptureSourceSettings przyjmuje MediaProjection, którą aplikacja otrzymuje po zaakceptowaniu monitu systemowego przez użytkownika. W iOS IOSScreenSourceSettings nagrywa Twoją aplikację przez ReplayKit, a IOSBroadcastSourceSettings całe urządzenie przez Broadcast Upload Extension.
Dlaczego nagranie jest czarne?▼
System operacyjny blokuje przechwytywanie chronionych treści, takich jak wideo z DRM. W przypadku innych czarnych klatek spróbuj drugiego API przechwytywania (WGC lub DXGI Desktop Duplication) albo źródła DirectX 9. Na laptopie z dwoma GPU Desktop Duplication musi działać na karcie, która obsługuje ekran; wybiera ją DXGIAdapter.
Którego SDK potrzebuję?▼
Video Capture SDK .NET, jeśli chcesz gotowy silnik przechwytywania: ustaw Video_Source, Audio_Source i wyjście, a potem wywołaj StartAsync. Media Blocks SDK .NET, jeśli budujesz potok z bloków, na przykład aby dodać własne przetwarzanie między ekranem a koderem. Oba używają tych samych źródeł ekranu.