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

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

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