VisioForge

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.

RyzykoWpływ
DirectShow wycofany przez MicrosoftBrak nowych funkcji, kodeków lub wsparcia platformowego
Biblioteka nieutrzymywana.NET Framework 2.0, brak wsparcia .NET 6+
Złożoność COMSetki linii na podstawowe zadania, ręczne zarządzanie pamięcią
Szukanie kodekówTrzeba znaleźć, zainstalować i zarejestrować filtry DirectShow firm trzecich
Debugowanie grafu filtrówNieprzejrzyste awarie potoku, brak narzędzi diagnostycznych
Tylko WindowsCOM/DirectShow nie może działać na macOS, Linux ani urządzeniach mobilnych
Brak nowoczesnych kodekówBrak natywnego H.265, AV1, VP9 bez filtrów firm trzecich
Problemy z rejestremProblemy z rejestracją filtrów na nowoczesnym Windows

Który SDK VisioForge zastępuje co?

Użycie DirectShow.NET do zamiennika VisioForge

Użycie DirectShow.NETZamiennik VisioForge
Przechwytywanie kamery C# przez graf filtrówVideo 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ówVideo Edit SDK .Net — `VideoEditCoreX`
Niestandardowe grafy filtrówMedia 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.NETOdpowiednik 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ówNiepotrzebne — 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 objects

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

AspektDirectShow.NETPo migracji
Linie kodu100+ na funkcję5-10 na funkcję
Framework.NET Framework 2.0.NET 6-10
PlatformyTylko WindowsWindows, macOS, Linux, iOS, Android
Styl APISurowy COM, ręczne połączenia pinówTypowany async C# API
KodekiSzukaj i instaluj filtry DirectShowWbudowane (H.264, H.265, AV1, VP9)
Zarządzanie pamięciąRęczne `Marshal.ReleaseComObject``IAsyncDisposable`
DebugowanieNieprzejrzyste błędy COM (HRESULT)Typowane wyjątki, zdarzenia
Efekty wideoSzukaj filtrów efektów40+ wbudowanych (GPU + CPU)
Efekty audioBrak40+ (EQ, reverb, chorus, 3D)
StreamingNiedostępneRTMP, HLS, SRT, NDI
DetekcjaNiedostępneRuch (MOG2), twarz (Haar/DNN/DLib), pieszy (HOG+SVM), kod kreskowy
Kodowanie sprzętoweSzukaj filtrów koderaNVENC, QSV, AMF, VideoToolbox
Kamery IPRęczny graf filtrówRTSP, RTMP, HLS, ONVIF z automatycznym ponownym połączeniem
UtrzymaniePorzucony (2010)Aktywny rozwój

Frequently Asked Questions

Czy DirectShow.NET jest nadal utrzymywany?
Nie. DirectShow.NET został porzucony od lutego 2010. Microsoft również wycofał bazowe API DirectShow na rzecz Media Foundation.
Jaka jest najlepsza alternatywa dla DirectShow.NET do przechwytywania wideo C#?
VisioForge Video Capture SDK .Net zastępuje grafy filtrów DirectShow typowanym async API. Przechwytywanie z kamery wymagające ponad 80 linii interop COM staje się 5 liniami kodu C#, z wbudowanym nagrywaniem, kodowaniem sprzętowym i wsparciem wieloplatformowym.
Czy VisioForge może zastąpić niestandardowe grafy filtrów DirectShow?
Tak. VisioForge Media Blocks SDK zapewnia modułowy potok z ponad 400 blokami, który zastępuje niestandardową konstrukcję grafów filtrów.
Czy VisioForge obsługuje .NET 6, .NET 8, .NET 9 i .NET 10?
Tak. Wszystkie pakiety VisioForge .Net SDK obsługują .NET 6 do .NET 10, w tym wdrożenie wieloplatformowe.
Czy nadal potrzebuję filtrów DirectShow zainstalowanych w systemie?
Nie. VisioForge zawiera własne kodeki i dekodery. H.264, H.265, AV1, VP9, AAC i inne kodeki działają od razu.
Czy mogę migrować z DirectShow.NET stopniowo?
Tak. SDK VisioForge mogą współistnieć z DirectShow.NET w tym samym projekcie. Zastępuj jeden graf filtrów na raz.

Rozpocznij migrację

Powiązane przewodniki migracji