VisioForge

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.

RisikoAuswirkung
DirectShow von Microsoft eingestelltKeine neuen Funktionen, Codecs oder Plattformunterstützung
Bibliothek nicht mehr gepflegt.NET Framework 2.0, keine .NET 6+ Unterstützung
COM-KomplexitätHunderte Zeilen für einfache Aufgaben, manuelle Speicherverwaltung
Codec-SucheDirectShow-Filter von Drittanbietern müssen gefunden, installiert und registriert werden
Filtergraph-DebuggingUndurchsichtige Pipeline-Fehler, keine Diagnosetools
Nur WindowsCOM/DirectShow kann nicht auf macOS, Linux oder Mobilgeräten ausgeführt werden
Keine modernen CodecsKein natives H.265, AV1, VP9 ohne Drittanbieter-Filter
Registry-ProblemeProbleme 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-KonzeptVisioForge-Ä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-VerbindungenAutomatisch — 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-ToolPipeline-Events, Logging, typisierte Exceptions

Welches VisioForge SDK ersetzt was?

DirectShow.NET Nutzung zu VisioForge Ersatz

DirectShow.NET NutzungVisioForge Ersatz
C# Webcam-Aufnahme über FiltergraphVideo Capture SDK .Net — `VideoCaptureCoreX`
C# IP-Kamera-Aufnahme (RTSP/MJPEG)Video Capture SDK .Net — `RTSPSourceSettings`
C# Bildschirmaufnahme und AufzeichnungVideo 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`
DateitranskodierungVideo Edit SDK .Net — `VideoEditCoreX`
Benutzerdefinierte FiltergraphenMedia 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 InterfaceVisioForge Ä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-VerbindungenNicht 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 objects

VisioForge — 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 support

VisioForge — 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 support

VisioForge — 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 objects

VisioForge — 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-dependent

VisioForge 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

AspektDirectShow.NETNach der Migration
Codezeilen100+ pro Funktion5-10 pro Funktion
Framework.NET Framework 2.0.NET 6-10
PlattformenNur WindowsWindows, macOS, Linux, iOS, Android
API-StilRohes COM, manuelle Pin-VerbindungenTypisierte async C# API
CodecsDirectShow-Filter suchen und installierenIntegriert (H.264, H.265, AV1, VP9)
SpeicherverwaltungManuelles `Marshal.ReleaseComObject``IAsyncDisposable`
DebuggingUndurchsichtige COM-Fehler (HRESULT)Typisierte Exceptions, Events
VideoeffekteEffektfilter suchen40+ integriert (GPU + CPU)
AudioeffekteKeine40+ (EQ, Reverb, Chorus, 3D)
StreamingNicht verfügbarRTMP, HLS, SRT, NDI
ErkennungNicht verfügbarBewegung (MOG2), Gesicht (Haar/DNN/DLib), Fußgänger (HOG+SVM), Barcode
Hardware-EncodingEncoder-Filter suchenNVENC, QSV, AMF, VideoToolbox
IP-KamerasManueller FiltergraphRTSP, RTMP, HLS, ONVIF mit automatischer Wiederverbindung
WartungAufgegeben (2010)Aktive Entwicklung

Frequently Asked Questions

Wird DirectShow.NET noch gepflegt?
Nein. DirectShow.NET wurde seit Februar 2010 aufgegeben. Microsoft hat auch die zugrunde liegende DirectShow API zugunsten von Media Foundation eingestellt.
Was ist die beste DirectShow.NET-Alternative für C# Videoaufnahme?
VisioForge Video Capture SDK .Net ersetzt DirectShow-Filtergraphen durch eine typisierte async API. Webcam-Aufnahme, die 80+ Zeilen COM-Interop erforderte, wird zu 5 Zeilen C#-Code, mit integrierter Aufzeichnung, Hardware-Encoding und plattformübergreifender Unterstützung.
Kann VisioForge benutzerdefinierte DirectShow-Filtergraphen ersetzen?
Ja. Das VisioForge Media Blocks SDK bietet eine modulare Pipeline mit 400+ Blöcken, die benutzerdefinierte Filtergraph-Konstruktion ersetzt.
Unterstützt VisioForge .NET 6, .NET 8, .NET 9 und .NET 10?
Ja. Alle VisioForge .Net SDK-Pakete unterstützen .NET 6 bis .NET 10, einschließlich plattformübergreifender Bereitstellung.
Brauche ich noch DirectShow-Filter auf dem System?
Nein. VisioForge bündelt eigene Codecs und Decoder. H.264, H.265, AV1, VP9, AAC und andere Codecs funktionieren sofort.
Kann ich schrittweise von DirectShow.NET migrieren?
Ja. VisioForge SDKs können im selben Projekt neben DirectShow.NET koexistieren. Ersetzen Sie einen Filtergraphen nach dem anderen.

Starten Sie Ihre Migration

Verwandte Migrationsleitfäden