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