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.
| Rischio | Impatto |
|---|---|
| DirectShow deprecato da Microsoft | Nessuna nuova funzionalità, codec o supporto piattaforma |
| Libreria non mantenuta | .NET Framework 2.0, nessun supporto .NET 6+ |
| Complessità COM | Centinaia di righe per operazioni basilari, gestione manuale della memoria |
| Ricerca codec | Bisogna trovare, installare e registrare filtri DirectShow di terze parti |
| Debug del filter graph | Errori pipeline opachi, nessuno strumento diagnostico |
| Solo Windows | COM/DirectShow non può funzionare su macOS, Linux o mobile |
| Nessun codec moderno | Nessun H.265, AV1, VP9 nativo senza filtri di terze parti |
| Problemi di registro | Problemi di registrazione dei filtri su Windows moderno |
Quale SDK VisioForge sostituisce cosa?
Utilizzo DirectShow.NET verso sostituzione VisioForge
| Utilizzo DirectShow.NET | Sostituzione VisioForge |
|---|---|
| Acquisizione webcam C# tramite filter graph | Video 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 file | Video Edit SDK .Net — `VideoEditCoreX` |
| Filter graph personalizzati | Media 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.NET | Equivalente 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 pin | Non 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 objectsVisioForge — 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
| Aspetto | DirectShow.NET | Dopo la migrazione |
|---|---|---|
| Righe di codice | 100+ per funzionalità | 5-10 per funzionalità |
| Framework | .NET Framework 2.0 | .NET 6-10 |
| Piattaforme | Solo Windows | Windows, macOS, Linux, iOS, Android |
| Stile API | COM grezzo, connessioni pin manuali | API C# async tipizzata |
| Codec | Cercare e installare filtri DirectShow | Integrati (H.264, H.265, AV1, VP9) |
| Gestione memoria | `Marshal.ReleaseComObject` manuale | `IAsyncDisposable` |
| Debug | Errori COM opachi (HRESULT) | Eccezioni tipizzate, eventi |
| Effetti video | Cercare filtri effetti | 40+ integrati (GPU + CPU) |
| Effetti audio | Nessuno | 40+ (EQ, reverb, chorus, 3D) |
| Streaming | Non disponibile | RTMP, HLS, SRT, NDI |
| Rilevamento | Non disponibile | Movimento (MOG2), volto (Haar/DNN/DLib), pedone (HOG+SVM), codice a barre |
| Codifica hardware | Cercare filtri encoder | NVENC, QSV, AMF, VideoToolbox |
| Telecamere IP | Filter graph manuale | RTSP, RTMP, HLS, ONVIF con riconnessione automatica |
| Manutenzione | Abbandonato (2010) | Sviluppo attivo |
Frequently Asked Questions
DirectShow.NET è ancora mantenuto?
Qual è la migliore alternativa a DirectShow.NET per l'acquisizione video C#?
VisioForge può sostituire i filter graph DirectShow personalizzati?
VisioForge supporta .NET 6, .NET 8, .NET 9 e .NET 10?
Ho ancora bisogno di filtri DirectShow installati sul sistema?
Posso migrare da DirectShow.NET in modo incrementale?
Inizia la tua migrazione
Guida all'installazione
Configurazione per Visual Studio, Rider e VS per Mac
Video Capture SDK
Sostituisce i filter graph di acquisizione DirectShow
Media Player SDK
Sostituisce i graph di riproduzione e DVD DirectShow
Media Blocks SDK
Sostituisce i filter graph personalizzati con 400+ blocchi tipizzati
Documentazione
Riferimento API, tutorial e guide al deployment
Esplora esempi di codice
Esempi C# funzionanti
