Last updated: Styczeń 2026
Alternatywa dla DirectShow.NET: Przewodnik migracji do VisioForge .Net SDK
Przewodnik krok po kroku migracji z DirectShow.NET (porzucony) do VisioForge .NET SDK do przechwytywania, odtwarzania i przetwarzania wideo na .NET 6-10.
Programiści C# migrujący z DirectShow.NET (directshowlib) do nowoczesnego SDK .NET 6-10 do przechwytywania, odtwarzania i przetwarzania wideo
Dlaczego warto zastąpić DirectShow.NET?
DirectShow.NET został porzucony od lutego 2010 — ponad 15 lat bez aktualizacji. Dostarcza surowe definicje interfejsów COM dla API DirectShow firmy Microsoft, które sam Microsoft wycofał na rzecz Media Foundation.
| Ryzyko | Wpływ |
|---|---|
| DirectShow wycofany przez Microsoft | Brak nowych funkcji, kodeków lub wsparcia platformowego |
| Biblioteka nieutrzymywana | .NET Framework 2.0, brak wsparcia .NET 6+ |
| Złożoność COM | Setki linii na podstawowe zadania, ręczne zarządzanie pamięcią |
| Szukanie kodeków | Trzeba znaleźć, zainstalować i zarejestrować filtry DirectShow firm trzecich |
| Debugowanie grafu filtrów | Nieprzejrzyste awarie potoku, brak narzędzi diagnostycznych |
| Tylko Windows | COM/DirectShow nie może działać na macOS, Linux ani urządzeniach mobilnych |
| Brak nowoczesnych kodeków | Brak natywnego H.265, AV1, VP9 bez filtrów firm trzecich |
| Problemy z rejestrem | Problemy z rejestracją filtrów na nowoczesnym Windows |
Wyjaśnienie koncepcji DirectShow
Zrozumienie, jak architektura DirectShow mapuje się na SDK VisioForge, pomaga zaplanować migrację. Poniższa tabela pokazuje, jak każda kluczowa koncepcja DirectShow przekłada się na nowoczesny odpowiednik .NET.
Architektura DirectShow a odpowiedniki VisioForge
| Koncepcja DirectShow | Odpowiednik VisioForge |
|---|---|
| Filter Graph (IGraphBuilder) | Pipeline — zarządzany automatycznie przez SDK lub jawna MediaBlocksPipeline |
| Source Filter (urządzenie/plik) | Ustawienia źródła: VideoCaptureDeviceSourceSettings, RTSPSourceSettings, itp. |
| Transform Filter (efekty/koder) | Wbudowane efekty wideo/audio + klasy koderów (H264EncoderSettings, itp.) |
| Renderer Filter (okno wideo) | Kontrolka VideoView (WinForms, WPF, MAUI, Avalonia) |
| Mux Filter (AVI/MP4 mux) | Klasy formatu wyjściowego: MP4Output, AVIOutput, MKVOutput, WebMOutput |
| Połączenia pinów | Automatyczne — lub jawne Block.Connect() w Media Blocks SDK |
| Typy mediów (AM_MEDIA_TYPE) | Obsługiwane automatycznie — bez ręcznej negocjacji formatu |
| Kategorie filtrów (enumeracja urządzeń) | DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync() |
| Rejestracja filtrów DirectShow (regsvr32) | Pakiety NuGet — bez rejestracji systemowej |
| Narzędzie debugowania GraphEdit | Zdarzenia pipeline, logowanie, typowane wyjątki |
Który SDK VisioForge zastępuje co?
Użycie DirectShow.NET do zamiennika VisioForge
| Użycie DirectShow.NET | Zamiennik VisioForge |
|---|---|
| Przechwytywanie kamery C# przez graf filtrów | Video Capture SDK .Net — `VideoCaptureCoreX` |
| Przechwytywanie kamery IP C# (RTSP/MJPEG) | Video Capture SDK .Net — `RTSPSourceSettings` |
| Przechwytywanie i nagrywanie ekranu C# | Video Capture SDK .Net — `ScreenCaptureSourceSettings` |
| Odtwarzanie plików przez `IGraphBuilder` | Media Player SDK .Net — `MediaPlayerCoreX` |
| Odtwarzanie DVD przez `IDvdControl2` | Media Player SDK .Net — API nawigacji DVD |
| Tuner TV przez `IAMTVTuner` | Video Capture SDK .Net — `VideoCaptureCore` |
| Transkodowanie plików | Video Edit SDK .Net — `VideoEditCoreX` |
| Niestandardowe grafy filtrów | Media Blocks SDK .Net — modułowy potok (400+ bloków) |
| Dostęp do klatek `ISampleGrabber` | Zdarzenie `OnVideoFrameBuffer` w każdym SDK |
Mapowanie interfejsów C# DirectShow
Mapowanie interfejsów C# DirectShow
| Interfejs DirectShow.NET | Odpowiednik VisioForge |
|---|---|
| `IGraphBuilder` | Potok budowany automatycznie przez SDK |
| `ICaptureGraphBuilder2` | Konstruktor `VideoCaptureCoreX` |
| `IMediaControl` (Run/Stop/Pause) | `StartAsync()` / `StopAsync()` / `PauseAsync()` |
| `IMediaEvent` | Zdarzenia SDK (`OnError`, `OnStop` itp.) |
| `IVideoWindow` | Kontrolka `VideoView` (WinForms/WPF/MAUI/Avalonia) |
| `ISampleGrabber` | Zdarzenie `OnVideoFrameBuffer` |
| `IBaseFilter` | Niepotrzebne — SDK zarządza filtrami wewnętrznie |
| `IPin` / połączenia pinów | Niepotrzebne — SDK łączy potok automatycznie |
| `DsDevice.GetDevicesOfCat()` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.VideoInputDevice` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.AudioInputDevice` | `DeviceEnumerator.Shared.AudioSourcesAsync()` |
| `IAMTVTuner` | Właściwość `VideoCaptureCore.TVTuner` |
| `IDvdControl2` | Metody `MediaPlayerCore.DVD_*` |
| `Marshal.ReleaseComObject()` | `await sdk.DisposeAsync()` |
Przechwytywanie kamery C# z podglądem
DirectShow.NET — przechwytywanie kamery (przed)
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 — przechwytywanie kamery C# (po)
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();Nagrywanie z kamery C# do MP4
DirectShow.NET — kamera do MP4 (przed)
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 — nagrywanie z kamery C# do MP4 (po)
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();Odtwarzanie pliku wideo C#
DirectShow.NET — odtwarzanie wideo (przed)
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 — odtwarzacz wideo C# (po)
C#var player = new MediaPlayerCoreX(videoView);
await player.OpenAsync(new Uri("video.mp4"));
await player.PlayAsync();
// Seeking
await player.SeekAsync(TimeSpan.FromSeconds(5));Przechwytywanie klatek wideo C#
DirectShow.NET — przechwytywanie klatek ISampleGrabber (przed)
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 — przechwytywanie klatek wideo C# (po)
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# Przechwytywanie kamery IP (RTSP)
DirectShow.NET — przechwytywanie RTSP (przed)
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 — przechwytywanie RTSP (po)
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# Przechwytywanie i nagrywanie ekranu
DirectShow.NET — przechwytywanie ekranu (przed)
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 — przechwytywanie ekranu (po)
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# Nagrywanie dźwięku z mikrofonu
DirectShow.NET — przechwytywanie audio (przed)
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 — przechwytywanie audio (po)
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# Niestandardowy potok przetwarzania
DirectShow.NET — niestandardowy filtergraph (przed)
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 — niestandardowy potok (po)
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();Lista kontrolna migracji
- Audyt użycia DirectShow.NET — Znajdź wszystkie odwołania `using DirectShowLib`
- Zidentyfikuj cel grafu filtrów — Przechwytywanie, odtwarzanie, transkodowanie lub przetwarzanie niestandardowe
- Wybierz SDK VisioForge — Video Capture, Media Player, Video Edit lub Media Blocks
- Zainstaluj pakiety NuGet — Zamień NuGet DirectShowLib na pakiety VisioForge
- Zamień kod grafu filtrów
- Usuń kod czyszczenia COM — VisioForge używa `IAsyncDisposable`
- Usuń zależności filtrów DirectShow firm trzecich — VisioForge zawiera kodeki
- Celuj w nowoczesny .NET — .NET 6-10
- Testuj międzyplatformowo
- Usuń rejestrację filtrów DirectShow — Nie jest już potrzebna
Co zyskujesz po migracji
| Aspekt | DirectShow.NET | Po migracji |
|---|---|---|
| Linie kodu | 100+ na funkcję | 5-10 na funkcję |
| Framework | .NET Framework 2.0 | .NET 6-10 |
| Platformy | Tylko Windows | Windows, macOS, Linux, iOS, Android |
| Styl API | Surowy COM, ręczne połączenia pinów | Typowany async C# API |
| Kodeki | Szukaj i instaluj filtry DirectShow | Wbudowane (H.264, H.265, AV1, VP9) |
| Zarządzanie pamięcią | Ręczne `Marshal.ReleaseComObject` | `IAsyncDisposable` |
| Debugowanie | Nieprzejrzyste błędy COM (HRESULT) | Typowane wyjątki, zdarzenia |
| Efekty wideo | Szukaj filtrów efektów | 40+ wbudowanych (GPU + CPU) |
| Efekty audio | Brak | 40+ (EQ, reverb, chorus, 3D) |
| Streaming | Niedostępne | RTMP, HLS, SRT, NDI |
| Detekcja | Niedostępne | Ruch (MOG2), twarz (Haar/DNN/DLib), pieszy (HOG+SVM), kod kreskowy |
| Kodowanie sprzętowe | Szukaj filtrów kodera | NVENC, QSV, AMF, VideoToolbox |
| Kamery IP | Ręczny graf filtrów | RTSP, RTMP, HLS, ONVIF z automatycznym ponownym połączeniem |
| Utrzymanie | Porzucony (2010) | Aktywny rozwój |
Frequently Asked Questions
Czy DirectShow.NET jest nadal utrzymywany?
Jaka jest najlepsza alternatywa dla DirectShow.NET do przechwytywania wideo C#?
Czy VisioForge może zastąpić niestandardowe grafy filtrów DirectShow?
Czy VisioForge obsługuje .NET 6, .NET 8, .NET 9 i .NET 10?
Czy nadal potrzebuję filtrów DirectShow zainstalowanych w systemie?
Czy mogę migrować z DirectShow.NET stopniowo?
Rozpocznij migrację
Przewodnik instalacji
Konfiguracja dla Visual Studio, Rider i VS dla Mac
Video Capture SDK
Zastępuje grafy filtrów przechwytywania DirectShow
Media Player SDK
Zastępuje grafy odtwarzania i DVD DirectShow
Media Blocks SDK
Zastępuje niestandardowe grafy filtrów 400+ typowanymi blokami
Dokumentacja
Referencja API, samouczki i przewodniki wdrożeniowe
Przeglądaj przykłady kodu
Działające przykłady C#
