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

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

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