VisioForge

C# と .NET によるクロスプラットフォーム画面録画

Windows、macOS、Linux、Android、iOS で共通の 1 つの API を使い、C# で画面録画アプリを構築できます。全画面、ウィンドウ、領域を、音声、カーソル、クリック強調付きで MP4 またはライブ配信に出力します。Video Capture SDK .NET と Media Blocks SDK .NET は各プラットフォームのネイティブキャプチャ API を使用します。

スクリーンショットのループは画面録画ではない

Graphics.CopyFromScreen で得られるのは Windows 上の 1 枚のビットマップだけです。録画にはさらに、安定したフレームレート、カーソル、音声、エンコーダー、そして音声と映像の同期が保たれたファイルが必要です。しかも他の OS ではキャプチャ API がまた別物です。macOS では AVFoundation または ScreenCaptureKit、Linux では X11、Android では MediaProjection、iOS では ReplayKit です。VisioForge の SDK では、画面は Web カメラと同じ映像ソースです。ScreenSourceBlock は実行中のプラットフォームのネイティブ API を使い、エンコーダー、ファイル、配信はどこでも同じコードです。

クロスプラットフォームの画面録画を自作する場合と SDK を使う場合

一般的な自作構成VisioForge Video Capture SDK .NET と Media Blocks SDK .NET
画面のキャプチャOS ごとに異なるネイティブ API を、それぞれ独自の相互運用コード越しに使う。Windows では Desktop Duplication または Windows Graphics Capture、macOS では ScreenCaptureKit または AVFoundation、Linux では X11 または PipeWire、Android では MediaProjection、iOS では ReplayKitプラットフォームごとに 1 つの設定クラスを持つ ScreenSourceBlock。引数なしの ScreenSourceBlock() はプラットフォームの既定ソースを使用
1 つのウィンドウまたは領域OS ごとに異なるウィンドウ識別子と切り抜きコード。Windows では HWND、Linux では X11 ウィンドウ IDウィンドウは Windows では WindowHandle、Linux では XID、領域は Rectangle、モニターは Windows では MonitorIndex、macOS では Monitor
カーソルとクリックカーソルとクリックの印を各フレームに自分で合成Windows、macOS、Linux で CaptureCursor。MouseHighlight はクリックごとに広がる円を描画。クリックは Windows ではグローバルマウスフックから取得し、他のプラットフォームではアプリのコードから渡す
音声マイク用に OS ごとの別の音声 API、Windows のシステム音には WASAPI ループバック。映像との同期は自前のコード全プラットフォームのマイクに SystemAudioSourceBlock、Windows のシステム音に LoopbackAudioCaptureDeviceSourceSettings。映像と同じタイムライン上で処理
エンコードとファイルMedia Foundation、VideoToolbox、MediaCodec を 1 つずつラップするか、アプリごとに FFmpeg のビルドを同梱H264EncoderBlock が MediaCodec、VideoToolbox、または NVENC、AMF、Quick Sync を選択し、フォールバックは OpenH264。出力は MP4、WebM、MKV、MOV、AVI、MPEG-TS
保守するコード作成、テスト、整合の維持が必要な 5 つのプラットフォーム実装C# のパイプラインは 1 つ。プラットフォームごとに変わるのはソースの設定だけ

プラットフォームごとの画面キャプチャ

引数なしの ScreenSourceBlock() はプラットフォームの既定ソースを選びます。API、ウィンドウ、領域を指定するには設定オブジェクトを渡します。

プラットフォームキャプチャ API設定クラス音声備考
WindowsWindows Graphics Capture、DXGI Desktop Duplication、DirectX 9、GDIScreenCaptureD3D11SourceSettings、ScreenCaptureDX9SourceSettings、ScreenCaptureGDISourceSettingsシステム音(WASAPI ループバック)またはマイクモニター、領域、1 つのウィンドウ。クリック強調
macOSAVFoundationScreenCaptureMacOSSourceSettingsマイク画面収録の許可が必要: ScreenSourceBlock.AskPermissions()
Mac Catalyst (.NET MAUI)ScreenCaptureKitScreenCaptureMacOSSourceSettingsマイクmacOS と同じ設定クラス
LinuxX11ScreenCaptureXDisplaySourceSettingsマイクX11 セッションが必要。XID または XName でウィンドウを選択
AndroidMediaProjectionAndroidScreenCaptureSourceSettingsマイクユーザーがシステムのダイアログを承認。録画はフォアグラウンドサービスで実行
iOSReplayKitIOSScreenSourceSettings、IOSBroadcastSourceSettingsマイク自分のアプリ、または Broadcast Upload Extension 経由でデバイス全体

画面録画アプリのために SDK がすること

画面とデスクトップの録画は、VideoCaptureCoreX(Video Capture SDK .NET)では映像ソース、Media Blocks SDK .NET では ScreenSourceBlock です。ソースより後の処理はカメラと同じように動作します。プレビュー、録画、配信、映像エフェクトです。

  • 3 つのキャプチャモード: 任意のモニターの全画面、ハンドルで指定した 1 つのアプリケーションウィンドウ、デスクトップの矩形領域
  • Windows 10 バージョン 1803 以降では Windows Graphics Capture が既定で選択されます。DXGI Desktop Duplication、DirectX 9、GDI のソースも利用できます
  • PC の音声を WASAPI ループバックで、またはマイクから取得。Media Blocks SDK .NET では AudioMixerBlock で両方を 1 つのトラックにミックス
  • チュートリアルやデモ向けに、色、半径、表示時間を設定できるカーソルキャプチャとクリック強調。Windows ではクリックをグローバルマウスフックから取得します。MouseHighlight を設定すると VideoCaptureCoreX は開始時にフックを登録し、Media Blocks では MouseHighlightSubscribe() を呼び出します。他のプラットフォームでは、アプリのコードが各クリックを MouseHighlightAddClickEvent(VideoCaptureCoreX では MouseHighlight_AddClickEvent)に渡します
  • ハードウェア H.264: Android では MediaCodec、Apple プラットフォームでは VideoToolbox。Windows では SDK が NVENC、AMF、Quick Sync を試し、なければ OpenH264 を使用
  • 複数の出力を同時に: 同じ画面を RTMP、SRT、NDI で YouTube に配信しながら MP4 に録画。プレビューを止めずに録画の一時停止と再開、新しいファイルの開始が可能
  • Windows、macOS、Linux、Android、iOS で 1 つの API。WinForms、WPF、.NET MAUI、ネイティブの macOS、Android、iOS アプリから利用でき、それぞれにサンプルがあります

ユースケース

チュートリアルと e ラーニングの録画

ナレーションとクリック強調付きでウィンドウまたは画面全体を録画し、レッスンを MP4 に保存します。

サポートとセッション録画

問題が起きるまでにユーザーが何をしたかを録画し、その動画をサポートチケットに添付します。

QA とテスト自動化

自動 UI テストの実行をすべて録画し、失敗したテストの動画を証拠として保存します。

プレゼンテーションとライブ配信

画面を YouTube や NDI レシーバーに配信し、同じキャプチャからローカルの MP4 コピーも保存します。

コード例

Video Capture SDK .NET と Media Blocks SDK .NET の Screen Capture デモを要約したものです。最初の 2 つは WinForms フォーム、3 つ目は .NET MAUI ページで動作し、それぞれ videoView1 または videoView という名前の VisioForge VideoView を持ちます。

画面とシステム音を MP4 に録画

C#

クリック強調付きで 1 つのウィンドウを録画

C#

Windows、macOS、Android、iOS 向けの 1 つの録画アプリ(.NET MAUI)

C#

パイプライン

ウィンドウの例と .NET MAUI の例は同じ 4 つのブロックを使います。ScreenSourceBlock がプラットフォームの API で画面をキャプチャし、TeeBlock がフレームをプレビューとエンコーダーに分け、MP4SinkBlock がファイルを書き込みます。プラットフォームごとに変わるのはソースの設定だけです。

ScreenSourceBlock
TeeBlock
H264EncoderBlock
MP4SinkBlock

よくある質問

PC で再生中の音声を録音するには?▼
DeviceEnumerator.Shared.AudioOutputsAsync(AudioOutputDeviceAPI.WASAPI2) で取得した出力デバイスを LoopbackAudioCaptureDeviceSourceSettings に渡し、最初の例のように Audio_Record を true にします。ナレーションには代わりに AudioSourcesAsync のマイクを使います。両方を録音するには、Media Blocks SDK .NET の AudioMixerBlock でミックスします。
他のウィンドウに覆われたウィンドウを録画できますか?▼
はい、Windows Graphics Capture を使います。API を D3D11ScreenCaptureAPI.WGC に、WindowHandle をウィンドウのハンドルに設定します。WGC はウィンドウ自身の内容をキャプチャするため、重なったウィンドウは録画に映りません。最小化されたウィンドウは何も描画しないためキャプチャされません。
macOS と Linux で動作しますか?▼
はい。macOS では画面ソースが AVFoundation を使い、画面収録の許可が必要です。ScreenSourceBlock.AskPermissions() がシステムのダイアログを表示し、新しい許可はアプリの再起動後に macOS が適用します。Linux では ScreenCaptureXDisplaySourceSettings が X11 ディスプレイをキャプチャするため、アプリには X11 セッションが必要です。エンコーダー、ファイル、配信は Windows と同じです。システム音のループバックは Windows 専用なので、これらのプラットフォームではマイクを録音します。
Android と iOS で画面を録画できますか?▼
はい、Media Blocks SDK .NET で可能です。Android では、ユーザーがシステムのダイアログを承認した後にアプリが受け取る MediaProjection を AndroidScreenCaptureSourceSettings に渡します。iOS では、IOSScreenSourceSettings が ReplayKit で自分のアプリを録画し、IOSBroadcastSourceSettings が Broadcast Upload Extension でデバイス全体を録画します。
録画が真っ黒になるのはなぜですか?▼
DRM 付き動画などの保護されたコンテンツは、OS によってキャプチャがブロックされます。それ以外の黒いフレームには、もう一方のキャプチャ API(WGC または DXGI Desktop Duplication)か DirectX 9 ソースを試してください。GPU が 2 つあるノート PC では、Desktop Duplication をディスプレイを駆動しているアダプターで実行する必要があります。DXGIAdapter でそのアダプターを選択します。
どの SDK が必要ですか?▼
すぐに使えるキャプチャエンジンが必要なら Video Capture SDK .NET です。Video_Source、Audio_Source、出力を設定して StartAsync を呼び出します。ブロックからパイプラインを組み立てる場合、たとえば画面とエンコーダーの間に独自の処理を加える場合は Media Blocks SDK .NET です。どちらも同じ画面ソースを使います。