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 |
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);
};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
