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 |
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 DirectShow | Equivalente 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 pin | Automatico — 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 GraphEdit | Eventi pipeline, logging, eccezioni tipizzate |
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);
};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 supportVisioForge — 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 supportVisioForge — 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 objectsVisioForge — 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-dependentVisioForge 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
| 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
