VisioForge

Last updated: Gennaio 2026

Alternativa a DirectShow.NET: Guida alla migrazione verso VisioForge .Net SDK

Guida passo passo per migrare da DirectShow.NET (abbandonato) a VisioForge .NET SDK per acquisizione, riproduzione ed elaborazione video su .NET 6-10.

Sviluppatori C# che migrano da DirectShow.NET (directshowlib) a un moderno SDK .NET 6-10 per acquisizione, riproduzione ed elaborazione video

Perché sostituire DirectShow.NET?

DirectShow.NET è stato abbandonato da febbraio 2010 — oltre 15 anni senza aggiornamenti. Fornisce definizioni di interfaccia COM grezze per l'API DirectShow di Microsoft, che Microsoft stesso ha deprecato a favore di Media Foundation.

RischioImpatto
DirectShow deprecato da MicrosoftNessuna nuova funzionalità, codec o supporto piattaforma
Libreria non mantenuta.NET Framework 2.0, nessun supporto .NET 6+
Complessità COMCentinaia di righe per operazioni basilari, gestione manuale della memoria
Ricerca codecBisogna trovare, installare e registrare filtri DirectShow di terze parti
Debug del filter graphErrori pipeline opachi, nessuno strumento diagnostico
Solo WindowsCOM/DirectShow non può funzionare su macOS, Linux o mobile
Nessun codec modernoNessun H.265, AV1, VP9 nativo senza filtri di terze parti
Problemi di registroProblemi di registrazione dei filtri su Windows moderno

Concetti di DirectShow spiegati

Comprendere come l'architettura di DirectShow si mappa sugli SDK VisioForge aiuta a pianificare la migrazione. La tabella seguente mostra come ogni concetto principale di DirectShow si traduce nell'equivalente moderno .NET.

Architettura DirectShow verso equivalenti VisioForge

Concetto DirectShowEquivalente VisioForge
Filter Graph (IGraphBuilder)Pipeline — gestita automaticamente dall'SDK, o MediaBlocksPipeline esplicita
Source Filter (dispositivo/file)Impostazioni sorgente: VideoCaptureDeviceSourceSettings, RTSPSourceSettings, ecc.
Transform Filter (effetti/encoder)Effetti video/audio integrati + classi encoder (H264EncoderSettings, ecc.)
Renderer Filter (finestra video)Controllo VideoView (WinForms, WPF, MAUI, Avalonia)
Mux Filter (AVI/MP4 mux)Classi formato di output: MP4Output, AVIOutput, MKVOutput, WebMOutput
Connessioni pinAutomatico — o Block.Connect() esplicito in Media Blocks SDK
Tipi di media (AM_MEDIA_TYPE)Gestito automaticamente — nessuna negoziazione manuale del formato
Categorie filtri (enumerazione dispositivi)DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync()
Registrazione filtri DirectShow (regsvr32)Pacchetti NuGet — nessuna registrazione di sistema necessaria
Strumento di debug GraphEditEventi pipeline, logging, eccezioni tipizzate

Quale SDK VisioForge sostituisce cosa?

Utilizzo DirectShow.NET verso sostituzione VisioForge

Utilizzo DirectShow.NETSostituzione VisioForge
Acquisizione webcam C# tramite filter graphVideo Capture SDK .Net — `VideoCaptureCoreX`
Acquisizione telecamera IP C# (RTSP/MJPEG)Video Capture SDK .Net — `RTSPSourceSettings`
Acquisizione e registrazione schermo C#Video Capture SDK .Net — `ScreenCaptureSourceSettings`
Riproduzione file tramite `IGraphBuilder`Media Player SDK .Net — `MediaPlayerCoreX`
Riproduzione DVD tramite `IDvdControl2`Media Player SDK .Net — API di navigazione DVD
Sintonizzatore TV tramite `IAMTVTuner`Video Capture SDK .Net — `VideoCaptureCore`
Transcodifica fileVideo Edit SDK .Net — `VideoEditCoreX`
Filter graph personalizzatiMedia Blocks SDK .Net — pipeline modulare (400+ blocchi)
Accesso frame `ISampleGrabber`Evento `OnVideoFrameBuffer` su qualsiasi SDK

Mappatura interfacce C# DirectShow

Mappatura interfacce C# DirectShow

Interfaccia DirectShow.NETEquivalente VisioForge
`IGraphBuilder`Pipeline costruita automaticamente dall'SDK
`ICaptureGraphBuilder2`Costruttore di `VideoCaptureCoreX`
`IMediaControl` (Run/Stop/Pause)`StartAsync()` / `StopAsync()` / `PauseAsync()`
`IMediaEvent`Eventi SDK (`OnError`, `OnStop`, ecc.)
`IVideoWindow`Controllo `VideoView` (WinForms/WPF/MAUI/Avalonia)
`ISampleGrabber`Evento `OnVideoFrameBuffer`
`IBaseFilter`Non necessario — l'SDK gestisce i filtri internamente
`IPin` / connessioni pinNon necessario — l'SDK connette la pipeline automaticamente
`DsDevice.GetDevicesOfCat()``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.VideoInputDevice``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.AudioInputDevice``DeviceEnumerator.Shared.AudioSourcesAsync()`
`IAMTVTuner`Proprietà `VideoCaptureCore.TVTuner`
`IDvdControl2`Metodi `MediaPlayerCore.DVD_*`
`Marshal.ReleaseComObject()``await sdk.DisposeAsync()`

Acquisizione webcam C# con anteprima

DirectShow.NET — acquisizione webcam (prima)

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 — acquisizione webcam C# (dopo)

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

Registrazione webcam C# in MP4

DirectShow.NET — webcam in MP4 (prima)

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 — registrazione webcam C# in MP4 (dopo)

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

Riproduzione file video C#

DirectShow.NET — riproduzione video (prima)

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 — lettore video C# (dopo)

C#
var player = new MediaPlayerCoreX(videoView);
await player.OpenAsync(new Uri("video.mp4"));
await player.PlayAsync();

// Seeking
await player.SeekAsync(TimeSpan.FromSeconds(5));

Cattura frame video C#

DirectShow.NET — cattura frame ISampleGrabber (prima)

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 — cattura frame video C# (dopo)

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# Acquisizione telecamera IP (RTSP)

DirectShow.NET — acquisizione RTSP (prima)

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 — acquisizione RTSP (dopo)

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# Cattura e registrazione dello schermo

DirectShow.NET — cattura schermo (prima)

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 — cattura schermo (dopo)

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# Registrazione audio dal microfono

DirectShow.NET — cattura audio (prima)

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 — cattura audio (dopo)

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# Pipeline di elaborazione personalizzata

DirectShow.NET — filtergraph personalizzato (prima)

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 — pipeline personalizzata (dopo)

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

Checklist di migrazione

  • Verificare l'utilizzo di DirectShow.NET — Trovare tutti i riferimenti `using DirectShowLib`
  • Identificare lo scopo del filter graph — Acquisizione, riproduzione, transcodifica o elaborazione personalizzata
  • Scegliere l'SDK VisioForge — Video Capture, Media Player, Video Edit o Media Blocks
  • Installare i pacchetti NuGet — Sostituire il NuGet DirectShowLib con i pacchetti VisioForge
  • Sostituire il codice del filter graph
  • Rimuovere il codice di pulizia COM — VisioForge utilizza `IAsyncDisposable`
  • Rimuovere le dipendenze dei filtri DirectShow di terze parti — VisioForge include i codec
  • Puntare a .NET moderno — .NET 6-10
  • Testare multipiattaforma
  • Rimuovere la registrazione dei filtri DirectShow — Non più necessaria

Cosa si guadagna dopo la migrazione

AspettoDirectShow.NETDopo la migrazione
Righe di codice100+ per funzionalità5-10 per funzionalità
Framework.NET Framework 2.0.NET 6-10
PiattaformeSolo WindowsWindows, macOS, Linux, iOS, Android
Stile APICOM grezzo, connessioni pin manualiAPI C# async tipizzata
CodecCercare e installare filtri DirectShowIntegrati (H.264, H.265, AV1, VP9)
Gestione memoria`Marshal.ReleaseComObject` manuale`IAsyncDisposable`
DebugErrori COM opachi (HRESULT)Eccezioni tipizzate, eventi
Effetti videoCercare filtri effetti40+ integrati (GPU + CPU)
Effetti audioNessuno40+ (EQ, reverb, chorus, 3D)
StreamingNon disponibileRTMP, HLS, SRT, NDI
RilevamentoNon disponibileMovimento (MOG2), volto (Haar/DNN/DLib), pedone (HOG+SVM), codice a barre
Codifica hardwareCercare filtri encoderNVENC, QSV, AMF, VideoToolbox
Telecamere IPFilter graph manualeRTSP, RTMP, HLS, ONVIF con riconnessione automatica
ManutenzioneAbbandonato (2010)Sviluppo attivo

Frequently Asked Questions

DirectShow.NET è ancora mantenuto?
No. DirectShow.NET è stato abbandonato da febbraio 2010. Microsoft ha anche deprecato l'API DirectShow sottostante a favore di Media Foundation.
Qual è la migliore alternativa a DirectShow.NET per l'acquisizione video C#?
VisioForge Video Capture SDK .Net sostituisce i filter graph DirectShow con un'API async tipizzata. L'acquisizione webcam che richiedeva oltre 80 righe di interop COM diventa 5 righe di codice C#, con registrazione integrata, codifica hardware e supporto multipiattaforma.
VisioForge può sostituire i filter graph DirectShow personalizzati?
Sì. Il VisioForge Media Blocks SDK fornisce una pipeline modulare con oltre 400 blocchi che sostituisce la costruzione di filter graph personalizzati.
VisioForge supporta .NET 6, .NET 8, .NET 9 e .NET 10?
Sì. Tutti i pacchetti VisioForge .Net SDK supportano da .NET 6 a .NET 10, incluso il deployment multipiattaforma.
Ho ancora bisogno di filtri DirectShow installati sul sistema?
No. VisioForge include i propri codec e decoder. H.264, H.265, AV1, VP9, AAC e altri codec funzionano immediatamente.
Posso migrare da DirectShow.NET in modo incrementale?
Sì. Gli SDK VisioForge possono coesistere con DirectShow.NET nello stesso progetto. Sostituisci un filter graph alla volta.

Inizia la tua migrazione

Guide di migrazione correlate