Last updated: Januar 2026
DirectShow.NET Alternative: Migrationsleitfaden zu VisioForge .Net SDK
Schritt-für-Schritt-Anleitung zur Migration von DirectShow.NET (aufgegeben) zu VisioForge .NET SDK für Videoaufnahme, Wiedergabe und Verarbeitung auf .NET 6-10.
C#-Entwickler, die von DirectShow.NET (directshowlib) zu einem modernen .NET 6-10 SDK für Videoaufnahme, Wiedergabe und Verarbeitung migrieren
Warum DirectShow.NET ersetzen?
DirectShow.NET wurde seit Februar 2010 aufgegeben — über 15 Jahre ohne Updates. Es bietet rohe COM-Schnittstellendefinitionen für Microsofts DirectShow API, die Microsoft selbst zugunsten von Media Foundation eingestellt hat.
| Risiko | Auswirkung |
|---|---|
| DirectShow von Microsoft eingestellt | Keine neuen Funktionen, Codecs oder Plattformunterstützung |
| Bibliothek nicht mehr gepflegt | .NET Framework 2.0, keine .NET 6+ Unterstützung |
| COM-Komplexität | Hunderte Zeilen für einfache Aufgaben, manuelle Speicherverwaltung |
| Codec-Suche | DirectShow-Filter von Drittanbietern müssen gefunden, installiert und registriert werden |
| Filtergraph-Debugging | Undurchsichtige Pipeline-Fehler, keine Diagnosetools |
| Nur Windows | COM/DirectShow kann nicht auf macOS, Linux oder Mobilgeräten ausgeführt werden |
| Keine modernen Codecs | Kein natives H.265, AV1, VP9 ohne Drittanbieter-Filter |
| Registry-Probleme | Probleme bei der Filterregistrierung unter modernem Windows |
DirectShow-Konzepte erklärt
Das Verständnis, wie die DirectShow-Architektur auf VisioForge SDKs abgebildet wird, hilft Ihnen bei der Planung Ihrer Migration. Die folgende Tabelle zeigt, wie jedes Kernkonzept von DirectShow in das moderne .NET-Äquivalent übersetzt wird.
DirectShow-Architektur zu VisioForge-Äquivalenten
| DirectShow-Konzept | VisioForge-Äquivalent |
|---|---|
| Filter Graph (IGraphBuilder) | Pipeline — automatisch vom SDK verwaltet oder explizite MediaBlocksPipeline |
| Source Filter (Gerät/Datei) | Quelleinstellungen: VideoCaptureDeviceSourceSettings, RTSPSourceSettings, etc. |
| Transform Filter (Effekte/Encoder) | Integrierte Video-/Audioeffekte + Encoder-Klassen (H264EncoderSettings, etc.) |
| Renderer Filter (Videofenster) | VideoView-Steuerelement (WinForms, WPF, MAUI, Avalonia) |
| Mux Filter (AVI/MP4 Mux) | Ausgabeformat-Klassen: MP4Output, AVIOutput, MKVOutput, WebMOutput |
| Pin-Verbindungen | Automatisch — oder explizites Block.Connect() im Media Blocks SDK |
| Medientypen (AM_MEDIA_TYPE) | Automatisch behandelt — keine manuelle Format-Aushandlung |
| Filterkategorien (Geräteenumeration) | DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync() |
| DirectShow-Filterregistrierung (regsvr32) | NuGet-Pakete — keine Systemregistrierung erforderlich |
| GraphEdit-Debugging-Tool | Pipeline-Events, Logging, typisierte Exceptions |
Welches VisioForge SDK ersetzt was?
DirectShow.NET Nutzung zu VisioForge Ersatz
| DirectShow.NET Nutzung | VisioForge Ersatz |
|---|---|
| C# Webcam-Aufnahme über Filtergraph | Video Capture SDK .Net — `VideoCaptureCoreX` |
| C# IP-Kamera-Aufnahme (RTSP/MJPEG) | Video Capture SDK .Net — `RTSPSourceSettings` |
| C# Bildschirmaufnahme und Aufzeichnung | Video Capture SDK .Net — `ScreenCaptureSourceSettings` |
| Dateiwiedergabe über `IGraphBuilder` | Media Player SDK .Net — `MediaPlayerCoreX` |
| DVD-Wiedergabe über `IDvdControl2` | Media Player SDK .Net — DVD-Navigations-API |
| TV-Tuner über `IAMTVTuner` | Video Capture SDK .Net — `VideoCaptureCore` |
| Dateitranskodierung | Video Edit SDK .Net — `VideoEditCoreX` |
| Benutzerdefinierte Filtergraphen | Media Blocks SDK .Net — modulare Pipeline (400+ Blöcke) |
| `ISampleGrabber` Frame-Zugriff | `OnVideoFrameBuffer` Event in jedem SDK |
C# DirectShow Interface-Zuordnung
C# DirectShow Interface-Zuordnung
| DirectShow.NET Interface | VisioForge Äquivalent |
|---|---|
| `IGraphBuilder` | Pipeline wird automatisch vom SDK erstellt |
| `ICaptureGraphBuilder2` | `VideoCaptureCoreX` Konstruktor |
| `IMediaControl` (Run/Stop/Pause) | `StartAsync()` / `StopAsync()` / `PauseAsync()` |
| `IMediaEvent` | SDK-Events (`OnError`, `OnStop`, etc.) |
| `IVideoWindow` | `VideoView` Steuerelement (WinForms/WPF/MAUI/Avalonia) |
| `ISampleGrabber` | `OnVideoFrameBuffer` Event |
| `IBaseFilter` | Nicht erforderlich — SDK verwaltet Filter intern |
| `IPin` / Pin-Verbindungen | Nicht erforderlich — SDK verbindet Pipeline automatisch |
| `DsDevice.GetDevicesOfCat()` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.VideoInputDevice` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.AudioInputDevice` | `DeviceEnumerator.Shared.AudioSourcesAsync()` |
| `IAMTVTuner` | `VideoCaptureCore.TVTuner` Eigenschaft |
| `IDvdControl2` | `MediaPlayerCore.DVD_*` Methoden |
| `Marshal.ReleaseComObject()` | `await sdk.DisposeAsync()` |
C# Webcam-Aufnahme mit Vorschau
DirectShow.NET — Webcam-Aufnahme (vorher)
C#// 80+ lines of COM interop
var graphBuilder = (IGraphBuilder)new FilterGraph();
var captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
int hr = captureGraph.SetFiltergraph(graphBuilder);
DsError.ThrowExceptionForHR(hr);
// Find video device
var devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
IBaseFilter sourceFilter;
hr = graphBuilder.AddSourceFilterForMoniker(
devices[0].Mon, null, devices[0].Name, out sourceFilter);
DsError.ThrowExceptionForHR(hr);
// Render preview
hr = captureGraph.RenderStream(
PinCategory.Preview, MediaType.Video, sourceFilter, null, null);
DsError.ThrowExceptionForHR(hr);
// Set video window
var videoWindow = (IVideoWindow)graphBuilder;
videoWindow.put_Owner(panelHandle);
videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings);
videoWindow.SetWindowPosition(0, 0, panel.Width, panel.Height);
// Start
var mediaControl = (IMediaControl)graphBuilder;
hr = mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
// Cleanup (must release EVERY COM object)
Marshal.ReleaseComObject(sourceFilter);
Marshal.ReleaseComObject(captureGraph);
Marshal.ReleaseComObject(graphBuilder);VisioForge — C# Webcam-Aufnahme (nachher)
C#var capture = new VideoCaptureCoreX(videoView);
var devices = await DeviceEnumerator.Shared.VideoSourcesAsync();
capture.Video_Source = new VideoCaptureDeviceSourceSettings(devices[0]);
await capture.StartAsync();
// Cleanup
await capture.StopAsync();
await capture.DisposeAsync();C# Webcam-Aufnahme als MP4
DirectShow.NET — Webcam zu MP4 (vorher)
C#// Must find H.264 encoder filter, MP4 mux filter, file writer
// Each requires separate COM object management
var graphBuilder = (IGraphBuilder)new FilterGraph();
var captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
captureGraph.SetFiltergraph(graphBuilder);
// Add source
var devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
IBaseFilter sourceFilter;
graphBuilder.AddSourceFilterForMoniker(
devices[0].Mon, null, devices[0].Name, out sourceFilter);
// Find and add H.264 encoder (must be installed on system!)
// This varies by system — no guarantee the filter exists
Guid h264Clsid = new Guid("some-encoder-guid");
IBaseFilter encoder = (IBaseFilter)Activator.CreateInstance(
Type.GetTypeFromCLSID(h264Clsid));
graphBuilder.AddFilter(encoder, "H.264 Encoder");
// Find and add MP4 mux
// Find and add file writer
// Connect source → encoder → mux → writer pins manually
// Each pin connection can fail silently or throw cryptic COM errors
// Configure encoder properties via ICodecAPI or IPropertyBag
// Different for every encoder filter...
var mediaControl = (IMediaControl)graphBuilder;
mediaControl.Run();
// Cleanup: release 5+ COM objectsVisioForge — C# Webcam-Aufnahme als MP4 (nachher)
C#var capture = new VideoCaptureCoreX(videoView);
var devices = await DeviceEnumerator.Shared.VideoSourcesAsync();
capture.Video_Source = new VideoCaptureDeviceSourceSettings(devices[0]);
capture.Outputs_Add(new MP4Output("recording.mp4"), true);
await capture.StartAsync();C# Videodatei-Wiedergabe
DirectShow.NET — Videowiedergabe (vorher)
C#var graphBuilder = (IGraphBuilder)new FilterGraph();
int hr = graphBuilder.RenderFile("video.mp4", null);
DsError.ThrowExceptionForHR(hr);
var videoWindow = (IVideoWindow)graphBuilder;
videoWindow.put_Owner(panelHandle);
videoWindow.put_WindowStyle(WindowStyle.Child);
videoWindow.SetWindowPosition(0, 0, panel.Width, panel.Height);
var mediaControl = (IMediaControl)graphBuilder;
mediaControl.Run();
// Seeking
var mediaSeeking = (IMediaSeeking)graphBuilder;
long position = 50000000; // 5 seconds in 100ns units
mediaSeeking.SetPositions(
ref position, AMSeekingSeekingFlags.AbsolutePositioning,
null, AMSeekingSeekingFlags.NoPositioning);VisioForge — C# Videoplayer (nachher)
C#var player = new MediaPlayerCoreX(videoView);
await player.OpenAsync(new Uri("video.mp4"));
await player.PlayAsync();
// Seeking
await player.SeekAsync(TimeSpan.FromSeconds(5));C# Video-Frame-Erfassung
DirectShow.NET — ISampleGrabber Frame-Erfassung (vorher)
C#// Must insert ISampleGrabber into filter graph
var sampleGrabber = (ISampleGrabber)new SampleGrabber();
var mediaType = new AMMediaType();
mediaType.majorType = MediaType.Video;
mediaType.subType = MediaSubType.RGB24;
sampleGrabber.SetMediaType(mediaType);
graphBuilder.AddFilter((IBaseFilter)sampleGrabber, "Grabber");
// Connect pins...
sampleGrabber.SetBufferSamples(true);
// In callback: manually read buffer, create Bitmap from raw bytes
sampleGrabber.GetCurrentBuffer(ref bufferSize, buffer);
// Manual pixel format conversion, stride calculation, etc.VisioForge — C# Video-Frame-Erfassung (nachher)
C#capture.OnVideoFrameBuffer += (s, e) =>
{
// Frame data available as managed buffer
// Or convert to SKBitmap/Bitmap directly
var bitmap = e.Frame.ToBitmap();
ProcessFrame(bitmap);
};C# IP-Kamera (RTSP) Aufnahme
DirectShow.NET — RTSP-Aufnahme (vorher)
C#// Must find and install RTSP source filter (e.g., LAV, ffdshow)
// No standard DirectShow RTSP filter ships with Windows
var graphBuilder = (IGraphBuilder)new FilterGraph();
// Add RTSP source filter (if installed)
Guid rtspFilterClsid = new Guid("some-rtsp-filter-guid");
IBaseFilter rtspSource = (IBaseFilter)Activator.CreateInstance(
Type.GetTypeFromCLSID(rtspFilterClsid));
graphBuilder.AddFilter(rtspSource, "RTSP Source");
// Configure URL via IFileSourceFilter or custom interface
var fileSource = (IFileSourceFilter)rtspSource;
fileSource.Load("rtsp://camera-ip:554/stream", null);
// Must manually connect pins to decoder, renderer
// No reconnection logic — if stream drops, graph stops
// No authentication helpers
// No ONVIF supportVisioForge — RTSP-Aufnahme (nachher)
C#var capture = new VideoCaptureCoreX(videoView);
capture.Video_Source = new RTSPSourceSettings(
new Uri("rtsp://camera-ip:554/stream"))
{
Login = "admin",
Password = "password",
ReconnectOnDrop = true
};
capture.Outputs_Add(new MP4Output("recording.mp4"), true);
await capture.StartAsync();C# Bildschirmaufnahme und Aufzeichnung
DirectShow.NET — Bildschirmaufnahme (vorher)
C#// DirectShow has no built-in screen capture filter
// Must use third-party filter or custom push source
// Common approach: manually capture GDI/BitBlt in a thread,
// feed frames through a custom IBaseFilter implementation
// 200+ lines of custom filter code:
// - Implement IBaseFilter, IPin, IMediaSample
// - Manual frame rate timing with Thread.Sleep
// - Manual pixel format conversion
// - No GPU acceleration
// - No mouse cursor rendering
// - No multi-monitor supportVisioForge — Bildschirmaufnahme (nachher)
C#var capture = new VideoCaptureCoreX(videoView);
capture.Video_Source = new ScreenCaptureSourceSettings()
{
FrameRate = new VideoFrameRate(30),
Rectangle = new Rect(0, 0, 1920, 1080),
CaptureCursor = true
};
capture.Outputs_Add(new MP4Output("screen.mp4"), true);
await capture.StartAsync();C# Audioaufnahme vom Mikrofon
DirectShow.NET — Audioaufnahme (vorher)
C#var graphBuilder = (IGraphBuilder)new FilterGraph();
var captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
captureGraph.SetFiltergraph(graphBuilder);
// Find audio device
var audioDevices = DsDevice.GetDevicesOfCat(
FilterCategory.AudioInputDevice);
IBaseFilter audioSource;
graphBuilder.AddSourceFilterForMoniker(
audioDevices[0].Mon, null, audioDevices[0].Name,
out audioSource);
// Must find WAV/MP3 encoder filter
// Must find file writer filter
// Must connect pins manually
// Configure sample rate/channels via IAMStreamConfig
var mediaControl = (IMediaControl)graphBuilder;
mediaControl.Run();
// Manual COM cleanup for all objectsVisioForge — Audioaufnahme (nachher)
C#var capture = new VideoCaptureCoreX();
var audioDevices = await DeviceEnumerator.Shared
.AudioSourcesAsync();
capture.Audio_Source = new AudioCaptureDeviceSourceSettings(
audioDevices[0]);
capture.Audio_Record = true;
capture.Video_Record = false;
capture.Outputs_Add(new MP4Output("audio.mp4"), true);
await capture.StartAsync();C# Benutzerdefinierte Verarbeitungspipeline
DirectShow.NET — Benutzerdefinierter Filtergraph (vorher)
C#// Building a custom graph: source > resize > overlay > encode > mux > write
// Each step requires finding/creating a filter, adding to graph,
// connecting pins with compatible media types
var graphBuilder = (IGraphBuilder)new FilterGraph();
// Add source filter...
// Add resize filter (must find one that's installed)...
// Add overlay filter (must write custom or find one)...
// Add H.264 encoder (system-dependent)...
// Add MP4 mux (system-dependent)...
// Add file writer...
// Connect each pair of pins manually...
// Handle format negotiation failures...
// Total: 150-300 lines, fragile, system-dependentVisioForge Media Blocks — Benutzerdefinierte Pipeline (nachher)
C#var pipeline = new MediaBlocksPipeline();
var source = new SystemVideoSourceBlock(
new VideoCaptureDeviceSourceSettings(device));
var resize = new ResizeBlock(1920, 1080);
var overlay = new TextOverlayBlock("Recording...");
var encoder = new H264EncoderBlock();
var sink = new MP4SinkBlock("output.mp4");
pipeline.Connect(source.Output, resize.Input);
pipeline.Connect(resize.Output, overlay.Input);
pipeline.Connect(overlay.Output, encoder.Input);
pipeline.Connect(encoder.Output, sink.Input);
await pipeline.StartAsync();Migrations-Checkliste
- DirectShow.NET-Nutzung prüfen — Alle `using DirectShowLib`-Referenzen finden
- Filtergraph-Zweck identifizieren — Aufnahme, Wiedergabe, Transkodierung oder benutzerdefinierte Verarbeitung
- VisioForge SDK wählen — Video Capture, Media Player, Video Edit oder Media Blocks
- NuGet-Pakete installieren — DirectShowLib NuGet durch VisioForge-Pakete ersetzen
- Filtergraph-Code ersetzen
- COM-Bereinigungscode entfernen — VisioForge verwendet `IAsyncDisposable`
- Drittanbieter-DirectShow-Filterabhängigkeiten entfernen — VisioForge enthält Codecs
- Modernes .NET anvisieren — .NET 6-10
- Plattformübergreifend testen
- DirectShow-Filterregistrierung entfernen — Nicht mehr erforderlich
Was Sie nach der Migration gewinnen
| Aspekt | DirectShow.NET | Nach der Migration |
|---|---|---|
| Codezeilen | 100+ pro Funktion | 5-10 pro Funktion |
| Framework | .NET Framework 2.0 | .NET 6-10 |
| Plattformen | Nur Windows | Windows, macOS, Linux, iOS, Android |
| API-Stil | Rohes COM, manuelle Pin-Verbindungen | Typisierte async C# API |
| Codecs | DirectShow-Filter suchen und installieren | Integriert (H.264, H.265, AV1, VP9) |
| Speicherverwaltung | Manuelles `Marshal.ReleaseComObject` | `IAsyncDisposable` |
| Debugging | Undurchsichtige COM-Fehler (HRESULT) | Typisierte Exceptions, Events |
| Videoeffekte | Effektfilter suchen | 40+ integriert (GPU + CPU) |
| Audioeffekte | Keine | 40+ (EQ, Reverb, Chorus, 3D) |
| Streaming | Nicht verfügbar | RTMP, HLS, SRT, NDI |
| Erkennung | Nicht verfügbar | Bewegung (MOG2), Gesicht (Haar/DNN/DLib), Fußgänger (HOG+SVM), Barcode |
| Hardware-Encoding | Encoder-Filter suchen | NVENC, QSV, AMF, VideoToolbox |
| IP-Kameras | Manueller Filtergraph | RTSP, RTMP, HLS, ONVIF mit automatischer Wiederverbindung |
| Wartung | Aufgegeben (2010) | Aktive Entwicklung |
Frequently Asked Questions
Wird DirectShow.NET noch gepflegt?
Was ist die beste DirectShow.NET-Alternative für C# Videoaufnahme?
Kann VisioForge benutzerdefinierte DirectShow-Filtergraphen ersetzen?
Unterstützt VisioForge .NET 6, .NET 8, .NET 9 und .NET 10?
Brauche ich noch DirectShow-Filter auf dem System?
Kann ich schrittweise von DirectShow.NET migrieren?
Starten Sie Ihre Migration
Installationsanleitung
Einrichtung für Visual Studio, Rider und VS für Mac
Video Capture SDK
Ersetzt DirectShow-Aufnahme-Filtergraphen
Media Player SDK
Ersetzt DirectShow-Wiedergabe- und DVD-Graphen
Media Blocks SDK
Ersetzt benutzerdefinierte Filtergraphen mit 400+ typisierten Blöcken
Dokumentation
API-Referenz, Tutorials und Bereitstellungsleitfäden
Code-Beispiele durchsuchen
Funktionierende C#-Beispiele
