Last updated: Januar 2026
Video Capture SDK .NET vs FFmpeg Wrappers
Umfassender .NET Video-Capture-Vergleich
Die Wahl des richtigen Video-Capture-Frameworks für Ihre .NET-Anwendung ist eine entscheidende architektonische Entscheidung. Dieser Leitfaden bietet einen detaillierten, unvoreingenommenen Vergleich zwischen VisioForge Video Capture SDK .NET — einer speziell entwickelten Capture-Engine — und FFmpeg-basierten Wrappern wie FFmpeg.AutoGen, Xabe.FFmpeg und FFMpegCore. Wir untersuchen Architektur, Funktionen, Leistung, Lizenzierung und praxisnahen Code, damit Sie eine fundierte Entscheidung treffen können.
Zusammenfassung
| Aspekt | Video Capture SDK .NET | FFmpeg Wrappers |
|---|---|---|
| Architektur | VideoCaptureCore (Windows): DirectShow/Media Foundation. VideoCaptureCoreX (plattformübergreifend): GStreamer | CLI-Prozess-Wrapper um ffmpeg.exe / libavcodec |
| Capture-Quellen | Webcams, Bildschirme, IP-Kameras, Capture-Karten, TV-Tuner, virtuelle Quellen | Abhängig von FFmpeg-Build-Flags; typischerweise Webcams, Bildschirme, RTSP |
| Live-Vorschau | Integrierte GPU-beschleunigte Vorschau mit Overlays | Keine native Vorschau; erfordert Piping von Frames an einen separaten Renderer |
| Aufnahmeformate | MP4, MKV, WebM, AVI, WMV, MOV, TS, GIF + 30 weitere | Alle von FFmpeg unterstützten Formate (umfangreich) |
| Multi-Output | Gleichzeitige Aufnahme + Streaming + Snapshots aus einer Pipeline | Mehrere Ausgaben über Tee-Muxer oder mehrere Prozesse |
| Hardwarebeschleunigung | NVENC, QSV, AMF, DXVA2, D3D11VA, VideoToolbox | NVENC, QSV, AMF, VAAPI, VDPAU (falls mit Unterstützung kompiliert) |
| .NET-Integration | Native .NET-API, Events, async/await, WinForms/WPF/MAUI-Steuerelemente | Process.Start() oder P/Invoke; eingeschränkte .NET-Idiome |
| Lizenzierung | Kommerzielle Pro-Entwickler-Lizenz (unbefristet oder Abonnement) | LGPL/GPL — Verknüpfungseinschränkungen; Wrapper MIT/Apache |
| Preise | Ab EUR 489 (Home) bis EUR 6.999 (Team) | Kostenlos (aber GPL-Compliance-Kosten sind nicht trivial) |
| Support | Dediziertes Ticketsystem, Prioritäts-SLA, individuelle Builds | Community-Foren, Stack Overflow, Mailinglisten |
Architektur im Detail
Video Capture SDK .NET Architektur
Das Video Capture SDK bietet zwei eigenständige Engines. VideoCaptureCore umschließt DirectShow und Media Foundation unter Windows und bietet nativen Zugriff auf jedes vom Betriebssystem bereitgestellte Capture-Gerät. VideoCaptureCoreX ist eine plattformübergreifende Engine (Windows, macOS, Linux, iOS, Android), die auf GStreamer basiert und IP-Kamera-Einspeisung sowie plattformübergreifende Aufnahme unterstützt. Beide Engines teilen sich eine einheitliche .NET-API-Oberfläche.
- ▶Native Windows-Capture über DirectShow- und Media Foundation-Filtergraphen
- ▶VideoCaptureCoreX: GStreamer-basierte plattformübergreifende Engine (Windows, macOS, Linux, iOS, Android)
- ▶GPU-beschleunigte Vorschau über Direct3D / OpenGL-Renderer
- ▶Ereignisgesteuerte Architektur mit .NET async/await-Unterstützung
- ▶Einzelprozessmodell — keine Verwaltung von Kindprozessen erforderlich
FFmpeg Wrapper Architektur
FFmpeg-Wrapper (.NET-Bibliotheken wie FFmpeg.AutoGen, Xabe.FFmpeg, FFMpegCore oder MediaToolkit) bieten eine verwaltete Schnittstelle zur FFmpeg-CLI oder zu den libav*-Bibliotheken. Der CLI-Ansatz startet ffmpeg.exe als Kindprozess und kommuniziert über Befehlszeilenargumente und Standard-E/A-Pipes. Der P/Invoke-Ansatz verknüpft sich direkt mit libav*-Shared-Libraries für niedrigeren Zugriff.
- ▶CLI-Wrapper starten ffmpeg.exe und parsen die stdout/stderr-Ausgabe
- ▶P/Invoke-Wrapper (FFmpeg.AutoGen) rufen libav*-C-Funktionen direkt auf
- ▶Keine integrierte UI-Integration — Frames müssen manuell gerendert werden
- ▶Multiprozess-Architektur erhöht die Komplexität der Zustandsverwaltung
- ▶Volle FFmpeg-Codec-/Formatunterstützung bei Kompilierung mit allen Flags
Wesentliche architektonische Unterschiede
| Aspekt | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Prozessmodell | Einzelprozess, In-Proc-Engine | Kindprozess (CLI) oder In-Proc (P/Invoke) |
| Geräteerkennung | Native OS-Aufzählungs-APIs | ffmpeg -list_devices oder manuelle Abfrage |
| Frame-Pipeline | Interner Filtergraph mit verwalteten Callbacks | Rohe Frames über stdout oder Shared Memory pipen |
| Fehlerbehandlung | .NET-Ausnahmen und ereignisbasierte Fehler | Stderr-Parsing oder C-Rückgabecodes |
| Zustandsverwaltung | Verwaltete Zustandsmaschine mit Events | Prozesslebenszyklus-Management |
| Speichermodell | Verwaltet + gepinnte native Puffer | Unverwaltete Allokation über libav* oder Pipe-Puffer |
Funktionsvergleich im Detail
Capture-Quellen
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| USB-Webcams | ✅ | ✅ |
| Integrierte Laptop-Kameras | ✅ | ✅ |
| Bildschirm- / Desktop-Capture | ✅ | ✅ |
| Anwendungsfenster-Capture | ✅ | ⚠️(Eingeschränkt; erfordert plattformspezifische Flags) |
| IP-Kameras (RTSP/ONVIF) | ✅ | ✅ |
| Capture-Karten (Blackmagic, Magewell) | ✅ | ⚠️(Über DirectShow/V4L2, wenn Treiber diese bereitstellen) |
| TV-Tuner (BDA/DVB) | ✅ | ❌ |
| Virtuelle Kameras (OBS, NDI) | ✅ | ⚠️(Über DirectShow unter Windows) |
| NDI-Quellen | ✅ | ⚠️(Erfordert benutzerdefinierten FFmpeg-Build mit NDI) |
| DECKLINK-Eingang | ✅ | ✅(FFmpeg hat decklink-Eingangsunterstützung) |
Live-Vorschau
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Integrierte Video-Vorschau | ✅ | ❌ |
| GPU-beschleunigtes Rendering | ✅ | ❌ |
| Text- / Bild-Overlays in der Vorschau | ✅ | ❌(Muss extern gerendert werden) |
| Vorschau ohne Aufnahme | ✅ | ❌ |
| Mehrere Vorschaufenster | ✅ | ❌ |
| WinForms / WPF / MAUI-Steuerelemente | ✅ | ❌(Keine nativen UI-Steuerelemente) |
Aufnahme
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| MP4 (H.264 / H.265) | ✅ | ✅ |
| MKV-Container | ✅ | ✅ |
| WebM (VP8 / VP9 / AV1) | ✅ | ✅ |
| AVI | ✅ | ✅ |
| WMV / ASF | ✅ | ✅ |
| MOV (ProRes) | ✅ | ✅ |
| MPEG-TS | ✅ | ✅ |
| Animiertes GIF | ✅ | ✅ |
| Nur Audio (MP3, AAC, WAV, FLAC, OGG) | ✅ | ✅ |
| Segmentierte Aufnahme (Aufteilung nach Zeit/Größe) | ✅ | ✅ |
| Pre-Event-Aufnahme (Ringpuffer) | ✅ | ❌(Keine integrierte Ringpuffer-API; erfordert eigene Implementierung) |
Multi-Output & Streaming
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Gleichzeitige Aufnahme + Stream | ✅ | ⚠️(Über Tee-Muxer oder mehrere Prozesse) |
| Mehrere Aufnahmeausgaben | ✅ | ⚠️(Tee-Muxer hat Einschränkungen) |
| RTMP-Streaming | ✅ | ✅ |
| RTSP-Server | ✅ | ❌(FFmpeg ist ein Client, kein Server) |
| SRT-Streaming | ✅ | ✅(Erfordert SRT-fähigen Build) |
| HLS / DASH-Ausgabe | ✅ | ✅ |
| NDI-Ausgabe | ✅ | ⚠️(Erfordert benutzerdefinierten Build) |
| Snapshot während der Aufnahme | ✅ | ⚠️(Erfordert separate Frame-Extraktion) |
Streaming-Protokolle
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| RTMP Push | ✅ | ✅ |
| RTSP-Servermodus | ✅ | ❌ |
| SRT (Caller / Listener) | ✅ | ✅ |
| HLS-Segmentgenerierung | ✅ | ✅ |
| MPEG-DASH | ✅ | ✅ |
| UDP / TCP Unicast / Multicast | ✅ | ✅ |
Videoverarbeitung
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Echtzeit-Größenänderung / Zuschneiden | ✅ | ✅ |
| Deinterlacing | ✅ | ✅ |
| Farbanpassung (Helligkeit, Kontrast, Sättigung) | ✅ | ✅(Über FFmpeg-Filter) |
| Text-Overlay (Zeitstempel, Wasserzeichen) | ✅ | ✅(drawtext-Filter) |
| Bild-Overlay / Logo | ✅ | ✅(overlay-Filter) |
| Bild-in-Bild | ✅ | ✅(overlay-Filter) |
| Chroma Key (Greenscreen) | ✅ | ⚠️(chromakey-Filter — einfach) |
| GPU-beschleunigte Filter | ✅ | ⚠️(Beschränkt auf bestimmte hwaccel-Filter) |
Audio
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Audiogerät-Capture | ✅ | ✅ |
| Systemaudio (Loopback) Capture | ✅ | ⚠️(Erfordert WASAPI-Loopback-Einrichtung) |
| Audio-Mixing (mehrere Eingänge) | ✅ | ✅(amix-Filter) |
| Echtzeit-Lautstärke- / Verstärkungsregelung | ✅ | ✅(volume-Filter) |
| Audioeffekte (Echo, Hall) | ✅ | ✅(Verschiedene Audiofilter) |
| VU-Meter / Pegelüberwachung | ✅ | ❌(Muss loudnorm-Ausgabe parsen) |
Erkennung & Analyse
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Bewegungserkennung | ✅ | ❌ |
| Gesichtserkennung | ✅ | ❌ |
| Barcode- / QR-Code-Lesung | ✅ | ❌ |
| Objektverfolgung | ✅ | ❌ |
| Audiopegelerkennung | ✅ | ⚠️(Über volumedetect / ebur128-Filter) |
Erweiterte Funktionen
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| NVIDIA NVENC-Encoding | ✅ | ✅ |
| Intel QSV-Encoding | ✅ | ✅ |
| AMD AMF-Encoding | ✅ | ✅ |
| Hardwarebeschleunigte Dekodierung | ✅ | ✅ |
| Benutzerdefinierte Filter-Plugin-API | ✅ | ❌(Muss benutzerdefinierte FFmpeg-Filter in C erstellen) |
Frame-Zugriff & Integration
| Funktion | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Raw-Frame-Callback (RGB / YUV) | ✅ | ⚠️(Über Pipe oder P/Invoke) |
| Bitmap / SKBitmap / WriteableBitmap | ✅ | ❌(Manuelle Konvertierung erforderlich) |
| Integration mit ML.NET / ONNX | ✅ | ⚠️(Erfordert Frame-Extraktions-Pipeline) |
| OpenCV-Interop | ✅ | ⚠️(Frames an OpenCV pipen) |
| Direkter GPU-Textur-Zugriff | ✅ | ❌ |
Plattformunterstützung
Betriebssystem-Kompatibilität
| Plattform | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| Windows x64 | ✅ | ✅ |
| Windows ARM64 | ✅ | ✅ |
| macOS (Apple Silicon + Intel) | ✅ | ✅ |
| Linux x64 (Ubuntu, Debian, Fedora) | ✅ | ✅ |
| Linux ARM64 (Raspberry Pi) | ✅ | ✅ |
| Android (über .NET MAUI) | ✅ | ⚠️(Erfordert benutzerdefinierten Build) |
| iOS (über .NET MAUI) | ✅ | ⚠️(Erfordert benutzerdefinierten Build) |
UI-Framework-Kompatibilität
| Framework | Video Capture SDK | FFmpeg Wrappers |
|---|---|---|
| WinForms | ✅ | ❌(Keine integrierten Steuerelemente) |
| WPF | ✅ | ❌(Keine integrierten Steuerelemente) |
| .NET MAUI | ✅ | ❌(Keine integrierten Steuerelemente) |
| Avalonia UI | ✅ | ❌(Keine integrierten Steuerelemente) |
| Console / Service | ✅ | ✅ |
| ASP.NET Core (Background Service) | ✅ | ✅ |
| Blazor (serverseitige Verarbeitung) | ✅ | ✅ |
Preisvergleich
Video Capture SDK .NET Preise
1 Entwickler, nicht-kommerzielle Nutzung
1 Entwickler, kommerzielle Nutzung, 1 Jahr Updates
Bis zu 3 Entwickler, kommerzielle Nutzung, 1 Jahr Updates
Bis zu 8 Entwickler, kommerzielle Nutzung, 1 Jahr Updates
All licenses include:
- ✓ Lizenzgebührenfreie Verteilung
- ✓ Alle Quellcode-Beispiele
- ✓ Prioritäts-Ticket-Support
- ✓ Alle Plattformziele enthalten
FFmpeg Wrapper Kosten
MIT-Lizenz — Low-Level P/Invoke-Bindings
Nicht-kommerziell kostenlos; kommerzielle Lizenz erforderlich
MIT-Lizenz — CLI-Wrapper
MIT-Lizenz — CLI-Wrapper
GPL-Compliance-Überlegungen
FFmpeg selbst ist unter LGPL 2.1 oder GPL 2/3 lizenziert, abhängig von der Build-Konfiguration. Wenn Ihr FFmpeg-Build GPL-Komponenten enthält (libx264, libx265, libfdk-aac), kann Ihre Anwendung GPL-Verpflichtungen unterliegen. Das bedeutet, Sie müssen entweder:
- ⚠Ihre Anwendung unter einer GPL-kompatiblen Lizenz als Open Source veröffentlichen
- ⚠Nur LGPL-lizenzierte FFmpeg-Komponenten verwenden und dynamisch verknüpfen
- ⚠Eine kommerzielle FFmpeg-Lizenz von FFmpeg-Urheberrechtsinhabern erwerben (komplex, da FFmpeg Hunderte von Mitwirkenden hat)
- ⚠FFmpeg nur mit LGPL-kompatiblen Codecs bauen (was die Funktionalität einschränkt)
Viele Unternehmen investieren erhebliche juristische Ressourcen in die Sicherstellung der GPL-Compliance. Die Kosten für die rechtliche Prüfung übersteigen oft den Preis einer kommerziellen SDK-Lizenz.
Codebeispiele
Beispiel 1: Webcam-Aufnahme als MP4
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
// Create the capture engine (pass a VideoView for built-in preview)
var capture = new VideoCaptureCore(VideoView1 as IVideoView);
// Set video source (first available webcam)
var devices = capture.Video_CaptureDevices();
capture.Video_CaptureDevice = new VideoCaptureSource(devices[0].Name);
// Set audio source (first available audio device)
var audioDevices = capture.Audio_CaptureDevices();
capture.Audio_CaptureDevice = new AudioCaptureSource(audioDevices[0].Name);
capture.Audio_RecordAudio = true;
// Configure MP4 output with H.264 + AAC
var mp4 = new MP4Output();
mp4.Video.Bitrate = 4000;
mp4.Video.Profile = H264Profile.ProfileMain;
mp4.Audio_AAC.Bitrate = 192;
capture.Output_Format = mp4;
capture.Output_Filename = "recording.mp4";
// Capture mode (preview is provided by the VideoView passed above)
capture.Mode = VideoCaptureMode.VideoCapture;
// Start recording with preview
await capture.StartAsync();FFMpegCore (CLI Wrapper)
C#using FFMpegCore;
using FFMpegCore.Enums;
using System.Diagnostics;
// Note: No built-in device enumeration
// You must know your device name beforehand
var deviceName = "Integrated Camera";
var audioDevice = "Microphone (Realtek Audio)";
// Build the FFmpeg command
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments = $"-f dshow -i video=\"{deviceName}\":audio=\"{audioDevice}\" " +
"-c:v libx264 -preset fast -b:v 4000k " +
"-c:a aac -b:a 192k " +
"-y recording.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// No preview — video goes directly to file
// To stop: send 'q' to stdin or kill process
// Error handling: parse stderr outputBeispiel 2: Bildschirmaufnahme mit Overlay
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
using VisioForge.Core.Types.VideoEffects;
var capture = new VideoCaptureCore(VideoView1 as IVideoView);
// Screen capture source
capture.Screen_Capture_Source = new ScreenCaptureSourceSettings
{
FullScreen = true,
FrameRate = new VideoFrameRate(30),
GrabMouseCursor = true
};
// Enable the video effects pipeline
capture.Video_Effects_Enabled = true;
capture.Video_Effects_Clear();
// Add timestamp overlay
capture.Video_Effects_Add(new VideoEffectTextLogo(true)
{
Text = "{TIME}",
Left = 10,
Top = 10,
Font = new System.Drawing.Font("Arial", 14),
FontColor = System.Drawing.Color.White
});
// Add watermark image
capture.Video_Effects_Add(new VideoEffectImageLogo(true)
{
Filename = "logo.png",
Left = 10,
Top = 50,
TransparencyLevel = 77
});
// Configure output
var mp4 = new MP4Output();
mp4.Video.Bitrate = 8000;
capture.Output_Format = mp4;
capture.Output_Filename = "screen_recording.mp4";
capture.Mode = VideoCaptureMode.ScreenCapture;
await capture.StartAsync();FFmpeg CLI
C#using System.Diagnostics;
// Screen capture with overlay using FFmpeg
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
// Windows screen capture via GDI
"-f gdigrab -framerate 30 -i desktop " +
// Complex filter for overlays
"-vf \"" +
"drawtext=text='%{localtime}':" +
"x=10:y=10:fontsize=14:fontcolor=white," +
"movie=logo.png[wm];[in][wm]overlay=10:50:" +
"format=auto,colorchannelmixer=aa=0.7\" " +
// Encoding settings
"-c:v libx264 -b:v 8000k -y screen_recording.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// Monitor stderr for progress / errors
string output = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();Beispiel 3: RTSP-Kamera zu RTMP-Stream
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
using VisioForge.Core.Types.FFMPEGEXE;
var capture = new VideoCaptureCore(VideoView1 as IVideoView);
// IP camera source (RTSP)
capture.IP_Camera_Source = new IPCameraSourceSettings
{
URL = new Uri("rtsp://192.168.1.100:554/stream"),
Login = "admin",
Password = "password",
Type = IPSourceEngine.RTSP_LowLatency
};
capture.Mode = VideoCaptureMode.IPCapture;
// Stream to YouTube/Twitch via RTMP (FFMPEG EXE muxer to FLV)
capture.Network_Streaming_Enabled = true;
capture.Network_Streaming_Audio_Enabled = true;
capture.Network_Streaming_Format = NetworkStreamingFormat.RTMP_FFMPEG_EXE;
var rtmpOutput = new FFMPEGEXEOutput();
rtmpOutput.FillDefaults(DefaultsProfile.MP4_H264_AAC, true);
rtmpOutput.OutputMuxer = OutputMuxer.FLV;
capture.Network_Streaming_Output = rtmpOutput;
capture.Network_Streaming_URL = "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY";
// Also record locally to MP4
var mp4 = new MP4Output();
mp4.Video.Bitrate = 4500;
mp4.Video.IDR_Period = 60;
mp4.Audio_AAC.Bitrate = 128;
capture.Output_Format = mp4;
capture.Output_Filename = "backup.mp4";
await capture.StartAsync();FFmpeg CLI
C#using System.Diagnostics;
// RTSP to RTMP relay + local recording
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
// Input: RTSP camera
"-rtsp_transport tcp " +
"-i rtsp://admin:password@192.168.1.100:554/stream " +
// Tee muxer for multiple outputs
"-c:v libx264 -b:v 4500k -g 60 " +
"-c:a aac -b:a 128k " +
"-f tee " +
"\"[f=flv]rtmp://a.rtmp.youtube.com/live2/YOUR_STREAM_KEY|" +
"[f=mp4]backup.mp4\"",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
// Note: Error recovery (reconnect on stream drop)
// must be implemented manually by monitoring stderr
// and restarting the processBeispiel 4: Mehrkamera-Überwachungssystem
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
// Create multiple capture engines - one per camera
var cameras = new List<VideoCaptureCore>();
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
foreach (var url in cameraUrls)
{
var cam = new VideoCaptureCore();
cam.IP_Camera_Source = new IPCameraSourceSettings
{
URL = new Uri(url),
Type = IPSourceEngine.RTSP_LowLatency,
// Fires OnNetworkSourceDisconnect when no frames arrive within this interval
DisconnectEventInterval = TimeSpan.FromSeconds(5)
};
cam.Mode = VideoCaptureMode.IPCapture;
// Motion detection on each camera
cam.Motion_Detection.Enabled = true;
cam.Motion_Detection.Highlight_Threshold = 30;
cam.OnMotion += (s, e) =>
{
Console.WriteLine($"Motion on {url} (level {e.Level}) at {DateTime.Now}");
};
// Segmented recording (1-hour files)
cam.Output_Format = new MP4Output();
cam.Output_Filename = $"cam_{cameras.Count}_{DateTime.Now:yyyyMMdd}.mp4";
cam.SeparateCapture_Enabled = true;
cam.SeparateCapture_Mode = SeparateCaptureMode.SplitByDuration;
cam.SeparateCapture_AutostartCapture = true;
cam.SeparateCapture_TimeThreshold = TimeSpan.FromHours(1);
cameras.Add(cam);
}
// Start all cameras
foreach (var cam in cameras)
await cam.StartAsync();FFmpeg CLI (Mehrere Prozesse)
C#using System.Diagnostics;
// Multi-camera: spawn one FFmpeg process per camera
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
var processes = new List<Process>();
for (int i = 0; i < cameraUrls.Length; i++)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = "ffmpeg",
Arguments =
$"-rtsp_transport tcp -i {cameraUrls[i]} " +
// Segmented recording (1-hour segments)
$"-c:v libx264 -b:v 2000k " +
$"-f segment -segment_time 3600 " +
$"-reset_timestamps 1 " +
$"cam_{i}_%Y%m%d_%H%M%S.mp4",
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
}
};
process.Start();
processes.Add(process);
}
// Note: No built-in motion detection
// No automatic reconnection on stream failure
// Must implement process monitoring + restart logic
// 4 separate processes consume more resourcesBeispiel 5: Dateikonvertierung mit Fortschritt
Video Capture SDK .NET
C#// File-to-file conversion uses VideoEditCoreX (Video Edit SDK .NET),
// not VideoCaptureCore. VideoCaptureCore is a live-source capture engine.
using VisioForge.Core.VideoEdit;
var editor = new VideoEditCoreX();
// Add source file
editor.Input_AddVideoFile("input.avi");
// Configure H.265 MP4 output
editor.Output_Format = new MP4Output("output.mp4");
// Track conversion progress
editor.OnProgress += (s, e) =>
{
Console.WriteLine($"Progress: {e.Progress}%");
};
await editor.StartAsync();FFMpegCore Wrapper
C#using FFMpegCore;
using FFMpegCore.Enums;
// File conversion using FFMpegCore
await FFMpegArguments
.FromFileInput("input.avi")
.OutputToFile("output.mp4", overwrite: true, options => options
.WithVideoCodec(VideoCodec.LibX265)
.WithVideoBitrate(6000)
.WithAudioCodec(AudioCodec.Aac)
.WithAudioBitrate(256)
.WithSpeedPreset(Speed.Slow)
)
.NotifyOnProgress(percent =>
{
Console.WriteLine($"Progress: {percent}%");
})
.ProcessAsynchronously();
// Note: Progress reporting works well in FFMpegCore
// This is one area where the wrapper experience is good
// However, error details are limited to stderr outputLeistungsvergleich
Benchmarks durchgeführt auf Windows 11, Intel i7-13700K, 32 GB RAM, NVIDIA RTX 4070. Ergebnisse können je nach Hardware und Konfiguration variieren.
| Metrik | Video Capture SDK | FFmpeg CLI | Anmerkungen |
|---|---|---|---|
| Webcam-Capture-Startzeit | ~120 ms | ~800 ms | FFmpeg-Prozess-Startup-Overhead |
| Speicherverbrauch (einzelne Webcam) | ~80 MB | ~120 MB | FFmpeg-Prozess + Pipe-Puffer |
| CPU-Auslastung (1080p H.264-Aufnahme) | ~8% | ~10% | Ähnlich bei Verwendung desselben Encoders |
| CPU-Auslastung (1080p NVENC-Aufnahme) | ~3% | ~4% | GPU-Offload ist vergleichbar |
| Frame-Latenz (Capture bis Vorschau) | ~16 ms (1 Frame) | N/A | FFmpeg hat keine integrierte Vorschau |
| Multi-Kamera (4x 1080p) | ~25% CPU, ~320 MB | ~35% CPU, ~480 MB | 4 Prozesse vs. 1 Prozess |
| RTSP-Wiederverbindung | ~2 Sekunden (automatisch) | Manueller Neustart erforderlich | SDK hat integrierte Wiederverbindung |
| Start bis erstes Frame | ~200 ms | ~1.200 ms | Prozess-Init + Codec-Aushandlung |
Wann welche Lösung wählen
Wählen Sie das Video Capture SDK, wenn Sie benötigen
- ✓Integrierte Live-Vorschau mit Overlays in WinForms/WPF/MAUI-Anwendungen
- ✓Mehrkamera-Überwachung mit Bewegungserkennung und automatischer Wiederverbindung
- ✓Kommerzielle Produktverteilung ohne GPL-Lizenzbedenken
- ✓Capture mit niedriger Latenz und GPU-beschleunigtem Vorschau-Rendering
- ✓Integriertes Barcode-/QR-Code-Scanning oder Gesichtserkennung während der Aufnahme
- ✓Eine einzige verwaltete .NET-API ohne externe Prozesse
- ✓Professioneller Support mit SLA und Unterstützung bei individueller Entwicklung
- ✓Schnelle Entwicklung — Funktionen, die mit FFmpeg Stunden dauern, sind mit dem SDK in Minuten erledigt
Wählen Sie FFmpeg Wrappers, wenn Sie benötigen
- ✓Serverseitige Stapelverarbeitung ohne UI (Headless-Transkodierung)
- ✓Maximale Codec- und Formatunterstützung aus einem einzigen Tool
- ✓Budgetbeschränkte Projekte, bei denen GPL-Compliance akzeptabel ist
- ✓Einfache einmalige Dateikonvertierungen oder Stream-Relay-Aufgaben
- ✓Plattformübergreifendes CLI-Scripting und Automatisierungs-Pipelines
- ✓Open-Source-Projekte, die bereits unter GPL lizenziert sind
- ✓Akademische oder Forschungsprojekte, die benutzerdefinierte Codec-Änderungen erfordern
- ✓Integration mit bestehender FFmpeg-Infrastruktur und Skripten
Hybrid-Ansatz: Das Beste aus beiden Welten
Viele Produktionssysteme kombinieren beide Technologien. Das Video Capture SDK übernimmt Echtzeit-Capture, Vorschau und Erkennung, während FFmpeg die Offline-Stapelverarbeitung und Formatkonvertierungen für Sonderfälle abwickelt.
- ▶Verwenden Sie das SDK für alle Echtzeit-Capture-, Vorschau- und interaktiven Funktionen
- ▶Verwenden Sie FFmpeg für Offline-Stapeltranskodierung aufgenommener Dateien
- ▶Verwenden Sie FFmpeg für seltene Formatkonvertierungen, die das SDK nicht unterstützt
- ▶Halten Sie FFmpeg als Hintergrunddienst für Archivverarbeitung bereit
Bereitstellung & Verteilung
Video Capture SDK Bereitstellung
- ✓NuGet-Paket enthält alle nativen Abhängigkeiten
- ✓Einzelne NuGet-Referenz — keine externen Tools zu installieren
- ✓Lizenzgebührenfreie Weiterverteilung mit kommerzieller Lizenz
- ✓xcopy / MSIX / ClickOnce-Bereitstellung unterstützt
- ✓Docker-Container unterstützt (Linux und Windows)
- ✓Keine GPL-Verpflichtungen — sicher für proprietäre Software
FFmpeg Wrapper Bereitstellung
- ⚠Muss ffmpeg.exe (oder Äquivalent) mit Ihrer Anwendung bündeln
- ⚠Binärgröße: ~80-150 MB je nach Build-Konfiguration
- ⚠Muss sicherstellen, dass der korrekte FFmpeg-Build zur Zielplattform passt
- ⚠GPL-Compliance kann Quellcode-Offenlegung erfordern
- ⚠Versionsverwaltung über Plattformen hinweg ist manuell
- ⚠Auto-Update der FFmpeg-Binärdateien muss von Ihrem Code gehandhabt werden
Entscheidungsmatrix
| Anforderung | Video Capture SDK | FFmpeg Wrappers | Gewinner |
|---|---|---|---|
| Live-Vorschau in Desktop-App | Video Capture SDK | ||
| Headless-Server-Transkodierung | FFmpeg | ||
| Multi-Kamera mit Bewegungserkennung | Video Capture SDK | ||
| GPL-freie kommerzielle Verteilung | Video Capture SDK | ||
| Maximale Formatunterstützung | FFmpeg | ||
| Niedriges Startbudget | FFmpeg | ||
| Schnelle Entwicklungszeit | Video Capture SDK | ||
| Professioneller Support/SLA | Video Capture SDK | ||
| Plattformübergreifende UI-Steuerelemente | Video Capture SDK | ||
| Benutzerdefinierte Codec-Entwicklung | FFmpeg | ||
| Echtzeit-Erkennungsfunktionen | Video Capture SDK | ||
| Community-Ressourcen/Tutorials | FFmpeg | ||
| Audiopegel-Überwachung | Video Capture SDK | ||
| Stream-Relay (RTSP zu RTMP) | Unentschieden | ||
| Stapel-Dateiverarbeitung | FFmpeg | ||
| Unternehmens-Compliance/Lizenzierung | Video Capture SDK |
Fazit
Video Capture SDK .NET
Das Video Capture SDK ist hervorragend als schlüsselfertige Lösung für .NET-Desktop- und plattformübergreifende Anwendungen geeignet, die Live-Video-Capture mit Vorschau, Overlays, Erkennung und Mehrkamera-Management erfordern. Seine native .NET-API eliminiert die Komplexität der Prozessverwaltung und bietet ein professionelles, unterstütztes Entwicklungserlebnis. Die kommerzielle Lizenz gewährleistet sauberes geistiges Eigentum für die Unternehmensverteilung.
FFmpeg Wrappers
FFmpeg bleibt der Goldstandard für Codec-Abdeckung und Stapelverarbeitung. Wenn Ihre Anwendung headless, serverseitig oder Open Source ist, bieten FFmpeg-Wrapper eine effektive und kostenlose Lösung. Das Fehlen von Live-Vorschau, Erkennungsfunktionen und nativen .NET-Steuerelementen bedeutet jedoch, dass Desktop-Capture-Anwendungen deutlich mehr individuelle Entwicklung erfordern.
The Reality
Für die meisten .NET-Entwickler, die capture-zentrierte Desktop-Anwendungen erstellen, spart das Video Capture SDK Wochen an Entwicklungszeit und eliminiert Lizenzrisiken. Für serverseitige Transkodierungsfarmen ist FFmpeg oft die pragmatische Wahl. Viele Teams nutzen beides.
