VisioForge

Last updated: Enero 2026

Alternativa a DirectShow.NET: Guía de migración a VisioForge .Net SDK

Guía paso a paso para migrar de DirectShow.NET (abandonado) a VisioForge .NET SDK para captura, reproducción y procesamiento de video en .NET 6-10.

Desarrolladores C# que migran de DirectShow.NET (directshowlib) a un SDK moderno .NET 6-10 para captura, reproducción y procesamiento de video

¿Por qué reemplazar DirectShow.NET?

DirectShow.NET ha sido abandonado desde febrero de 2010 — más de 15 años sin actualizaciones. Proporciona definiciones de interfaz COM sin procesar para la API DirectShow de Microsoft, que Microsoft mismo ha dejado en desuso en favor de Media Foundation.

RiesgoImpacto
DirectShow obsoleto por MicrosoftSin nuevas funciones, códecs o soporte de plataforma
Biblioteca sin mantenimiento.NET Framework 2.0, sin soporte para .NET 6+
Complejidad COMCientos de líneas para tareas básicas, gestión manual de memoria
Búsqueda de códecsDebe encontrar, instalar y registrar filtros DirectShow de terceros
Depuración de filter graphFallos de pipeline opacos, sin herramientas de diagnóstico
Solo WindowsCOM/DirectShow no puede ejecutarse en macOS, Linux o móvil
Sin códecs modernosSin H.265, AV1, VP9 nativos sin filtros de terceros
Problemas de registroProblemas de registro de filtros en Windows moderno

Conceptos de DirectShow explicados

Comprender cómo la arquitectura de DirectShow se mapea a los SDKs de VisioForge le ayuda a planificar su migración. La tabla siguiente muestra cómo cada concepto principal de DirectShow se traduce al equivalente moderno de .NET.

Arquitectura de DirectShow a equivalentes de VisioForge

Concepto de DirectShowEquivalente de VisioForge
Filter Graph (IGraphBuilder)Pipeline — gestionada automáticamente por el SDK, o MediaBlocksPipeline explícita
Source Filter (dispositivo/archivo)Configuraciones de origen: VideoCaptureDeviceSourceSettings, RTSPSourceSettings, etc.
Transform Filter (efectos/codificador)Efectos de video/audio integrados + clases de codificador (H264EncoderSettings, etc.)
Renderer Filter (ventana de video)Control VideoView (WinForms, WPF, MAUI, Avalonia)
Mux Filter (AVI/MP4 mux)Clases de formato de salida: MP4Output, AVIOutput, MKVOutput, WebMOutput
Conexiones de pinesAutomático — o Block.Connect() explícito en Media Blocks SDK
Tipos de medios (AM_MEDIA_TYPE)Manejado automáticamente — sin negociación manual de formato
Categorías de filtros (enumeración de dispositivos)DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync()
Registro de filtros DirectShow (regsvr32)Paquetes NuGet — no se necesita registro del sistema
Herramienta de depuración GraphEditEventos de pipeline, logging, excepciones tipadas

¿Qué SDK de VisioForge reemplaza qué?

Uso de DirectShow.NET a reemplazo de VisioForge

Uso de DirectShow.NETReemplazo de VisioForge
Captura de webcam C# mediante filter graphVideo Capture SDK .Net — `VideoCaptureCoreX`
Captura de cámara IP C# (RTSP/MJPEG)Video Capture SDK .Net — `RTSPSourceSettings`
Captura y grabación de pantalla C#Video Capture SDK .Net — `ScreenCaptureSourceSettings`
Reproducción de archivos mediante `IGraphBuilder`Media Player SDK .Net — `MediaPlayerCoreX`
Reproducción de DVD mediante `IDvdControl2`Media Player SDK .Net — API de navegación DVD
Sintonizador de TV mediante `IAMTVTuner`Video Capture SDK .Net — `VideoCaptureCore`
Transcodificación de archivosVideo Edit SDK .Net — `VideoEditCoreX`
Filter graphs personalizadosMedia Blocks SDK .Net — pipeline modular (400+ bloques)
Acceso a frames `ISampleGrabber`Evento `OnVideoFrameBuffer` en cualquier SDK

Mapeo de interfaces C# DirectShow

Mapeo de interfaces C# DirectShow

Interfaz DirectShow.NETEquivalente VisioForge
`IGraphBuilder`Pipeline construido automáticamente por el SDK
`ICaptureGraphBuilder2`Constructor de `VideoCaptureCoreX`
`IMediaControl` (Run/Stop/Pause)`StartAsync()` / `StopAsync()` / `PauseAsync()`
`IMediaEvent`Eventos del SDK (`OnError`, `OnStop`, etc.)
`IVideoWindow`Control `VideoView` (WinForms/WPF/MAUI/Avalonia)
`ISampleGrabber`Evento `OnVideoFrameBuffer`
`IBaseFilter`No necesario — el SDK gestiona los filtros internamente
`IPin` / conexiones de pinNo necesario — el SDK conecta la pipeline automáticamente
`DsDevice.GetDevicesOfCat()``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.VideoInputDevice``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.AudioInputDevice``DeviceEnumerator.Shared.AudioSourcesAsync()`
`IAMTVTuner`Propiedad `VideoCaptureCore.TVTuner`
`IDvdControl2`Métodos `MediaPlayerCore.DVD_*`
`Marshal.ReleaseComObject()``await sdk.DisposeAsync()`

Captura de webcam C# con vista previa

DirectShow.NET — captura de webcam (antes)

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 — captura de webcam C# (después)

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

Grabación de webcam C# a MP4

DirectShow.NET — webcam a MP4 (antes)

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 — grabación de webcam C# a MP4 (después)

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

Reproducción de archivo de video C#

DirectShow.NET — reproducción de video (antes)

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 — reproductor de video C# (después)

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

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

Captura de frames de video C#

DirectShow.NET — captura de frames ISampleGrabber (antes)

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 — captura de frames de video C# (después)

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# Captura de cámara IP (RTSP)

DirectShow.NET — captura RTSP (antes)

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 — captura RTSP (después)

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# Captura y grabación de pantalla

DirectShow.NET — captura de pantalla (antes)

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 — captura de pantalla (después)

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# Grabación de audio desde micrófono

DirectShow.NET — captura de audio (antes)

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 — captura de audio (después)

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 de procesamiento personalizada

DirectShow.NET — filtergraph personalizado (antes)

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 personalizada (después)

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

Lista de verificación de migración

  • Auditar el uso de DirectShow.NET — Encontrar todas las referencias `using DirectShowLib`
  • Identificar el propósito del filter graph — Captura, reproducción, transcodificación o procesamiento personalizado
  • Elegir el SDK de VisioForge — Video Capture, Media Player, Video Edit o Media Blocks
  • Instalar paquetes NuGet — Reemplazar el NuGet de DirectShowLib con paquetes de VisioForge
  • Reemplazar el código del filter graph
  • Eliminar el código de limpieza COM — VisioForge usa `IAsyncDisposable`
  • Eliminar dependencias de filtros DirectShow de terceros — VisioForge incluye códecs
  • Apuntar a .NET moderno — .NET 6-10
  • Probar multiplataforma
  • Eliminar el registro de filtros DirectShow — Ya no es necesario

Lo que gana después de la migración

AspectoDirectShow.NETDespués de la migración
Líneas de código100+ por función5-10 por función
Framework.NET Framework 2.0.NET 6-10
PlataformasSolo WindowsWindows, macOS, Linux, iOS, Android
Estilo de APICOM sin procesar, conexiones de pin manualesAPI C# async tipada
CódecsBuscar e instalar filtros DirectShowIntegrados (H.264, H.265, AV1, VP9)
Gestión de memoria`Marshal.ReleaseComObject` manual`IAsyncDisposable`
DepuraciónErrores COM opacos (HRESULT)Excepciones tipadas, eventos
Efectos de videoBuscar filtros de efectos40+ integrados (GPU + CPU)
Efectos de audioNinguno40+ (EQ, reverb, chorus, 3D)
StreamingNo disponibleRTMP, HLS, SRT, NDI
DetecciónNo disponibleMovimiento (MOG2), rostro (Haar/DNN/DLib), peatón (HOG+SVM), código de barras
Codificación hardwareBuscar filtros de codificadorNVENC, QSV, AMF, VideoToolbox
Cámaras IPFilter graph manualRTSP, RTMP, HLS, ONVIF con reconexión automática
MantenimientoAbandonado (2010)Desarrollo activo

Frequently Asked Questions

¿DirectShow.NET todavía se mantiene?
No. DirectShow.NET ha sido abandonado desde febrero de 2010. Microsoft también ha dejado en desuso la API DirectShow subyacente en favor de Media Foundation.
¿Cuál es la mejor alternativa a DirectShow.NET para captura de video en C#?
VisioForge Video Capture SDK .Net reemplaza los filter graphs de DirectShow con una API async tipada. La captura de webcam que requería más de 80 líneas de interoperabilidad COM se convierte en 5 líneas de código C#, con grabación integrada, codificación hardware y soporte multiplataforma.
¿Puede VisioForge reemplazar filter graphs personalizados de DirectShow?
Sí. El VisioForge Media Blocks SDK proporciona una pipeline modular con más de 400 bloques que reemplaza la construcción de filter graphs personalizados.
¿VisioForge soporta .NET 6, .NET 8, .NET 9 y .NET 10?
Sí. Todos los paquetes de VisioForge .Net SDK soportan .NET 6 hasta .NET 10, incluyendo despliegue multiplataforma.
¿Todavía necesito filtros DirectShow instalados en el sistema?
No. VisioForge incluye sus propios códecs y decodificadores. H.264, H.265, AV1, VP9, AAC y otros códecs funcionan de forma inmediata.
¿Puedo migrar de DirectShow.NET de forma incremental?
Sí. Los SDKs de VisioForge pueden coexistir con DirectShow.NET en el mismo proyecto. Reemplace un filter graph a la vez.

Comience su migración

Guías de migración relacionadas