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.
| Riesgo | Impacto |
|---|---|
| DirectShow obsoleto por Microsoft | Sin nuevas funciones, códecs o soporte de plataforma |
| Biblioteca sin mantenimiento | .NET Framework 2.0, sin soporte para .NET 6+ |
| Complejidad COM | Cientos de líneas para tareas básicas, gestión manual de memoria |
| Búsqueda de códecs | Debe encontrar, instalar y registrar filtros DirectShow de terceros |
| Depuración de filter graph | Fallos de pipeline opacos, sin herramientas de diagnóstico |
| Solo Windows | COM/DirectShow no puede ejecutarse en macOS, Linux o móvil |
| Sin códecs modernos | Sin H.265, AV1, VP9 nativos sin filtros de terceros |
| Problemas de registro | Problemas de registro de filtros en Windows moderno |
¿Qué SDK de VisioForge reemplaza qué?
Uso de DirectShow.NET a reemplazo de VisioForge
| Uso de DirectShow.NET | Reemplazo de VisioForge |
|---|---|
| Captura de webcam C# mediante filter graph | Video 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 archivos | Video Edit SDK .Net — `VideoEditCoreX` |
| Filter graphs personalizados | Media 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.NET | Equivalente 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 pin | No 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 objectsVisioForge — 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
| Aspecto | DirectShow.NET | Después de la migración |
|---|---|---|
| Líneas de código | 100+ por función | 5-10 por función |
| Framework | .NET Framework 2.0 | .NET 6-10 |
| Plataformas | Solo Windows | Windows, macOS, Linux, iOS, Android |
| Estilo de API | COM sin procesar, conexiones de pin manuales | API C# async tipada |
| Códecs | Buscar e instalar filtros DirectShow | Integrados (H.264, H.265, AV1, VP9) |
| Gestión de memoria | `Marshal.ReleaseComObject` manual | `IAsyncDisposable` |
| Depuración | Errores COM opacos (HRESULT) | Excepciones tipadas, eventos |
| Efectos de video | Buscar filtros de efectos | 40+ integrados (GPU + CPU) |
| Efectos de audio | Ninguno | 40+ (EQ, reverb, chorus, 3D) |
| Streaming | No disponible | RTMP, HLS, SRT, NDI |
| Detección | No disponible | Movimiento (MOG2), rostro (Haar/DNN/DLib), peatón (HOG+SVM), código de barras |
| Codificación hardware | Buscar filtros de codificador | NVENC, QSV, AMF, VideoToolbox |
| Cámaras IP | Filter graph manual | RTSP, RTMP, HLS, ONVIF con reconexión automática |
| Mantenimiento | Abandonado (2010) | Desarrollo activo |
Frequently Asked Questions
¿DirectShow.NET todavía se mantiene?
¿Cuál es la mejor alternativa a DirectShow.NET para captura de video en C#?
¿Puede VisioForge reemplazar filter graphs personalizados de DirectShow?
¿VisioForge soporta .NET 6, .NET 8, .NET 9 y .NET 10?
¿Todavía necesito filtros DirectShow instalados en el sistema?
¿Puedo migrar de DirectShow.NET de forma incremental?
Comience su migración
Guía de instalación
Configuración para Visual Studio, Rider y VS para Mac
Video Capture SDK
Reemplaza filter graphs de captura DirectShow
Media Player SDK
Reemplaza graphs de reproducción y DVD DirectShow
Media Blocks SDK
Reemplaza filter graphs personalizados con 400+ bloques tipados
Documentación
Referencia de API, tutoriales y guías de despliegue
Explorar ejemplos de código
Ejemplos funcionales en C#
