VisioForge

Last updated: Janvier 2026

Alternative à DirectShow.NET : Guide de migration vers VisioForge .Net SDK

Guide étape par étape pour migrer de DirectShow.NET (abandonné) vers VisioForge .NET SDK pour la capture, la lecture et le traitement vidéo sur .NET 6-10.

Développeurs C# migrant de DirectShow.NET (directshowlib) vers un SDK moderne .NET 6-10 pour la capture, la lecture et le traitement vidéo

Pourquoi remplacer DirectShow.NET ?

DirectShow.NET a été abandonné depuis février 2010 — plus de 15 ans sans mises à jour. Il fournit des définitions d'interface COM brutes pour l'API DirectShow de Microsoft, que Microsoft lui-même a abandonné au profit de Media Foundation.

RisqueImpact
DirectShow abandonné par MicrosoftPas de nouvelles fonctionnalités, codecs ou support de plateforme
Bibliothèque non maintenue.NET Framework 2.0, pas de support .NET 6+
Complexité COMDes centaines de lignes pour des tâches basiques, gestion manuelle de la mémoire
Recherche de codecsDoit trouver, installer et enregistrer des filtres DirectShow tiers
Débogage du filter graphÉchecs de pipeline opaques, pas d'outils de diagnostic
Windows uniquementCOM/DirectShow ne peut pas fonctionner sur macOS, Linux ou mobile
Pas de codecs modernesPas de H.265, AV1, VP9 natifs sans filtres tiers
Problèmes de registreProblèmes d'enregistrement des filtres sur Windows moderne

Quel SDK VisioForge remplace quoi ?

Utilisation de DirectShow.NET vers remplacement VisioForge

Utilisation de DirectShow.NETRemplacement VisioForge
Capture webcam C# via filter graphVideo Capture SDK .Net — `VideoCaptureCoreX`
Capture caméra IP C# (RTSP/MJPEG)Video Capture SDK .Net — `RTSPSourceSettings`
Capture et enregistrement d'écran C#Video Capture SDK .Net — `ScreenCaptureSourceSettings`
Lecture de fichiers via `IGraphBuilder`Media Player SDK .Net — `MediaPlayerCoreX`
Lecture DVD via `IDvdControl2`Media Player SDK .Net — API de navigation DVD
Tuner TV via `IAMTVTuner`Video Capture SDK .Net — `VideoCaptureCore`
Transcodage de fichiersVideo Edit SDK .Net — `VideoEditCoreX`
Filter graphs personnalisésMedia Blocks SDK .Net — pipeline modulaire (400+ blocs)
Accès aux frames `ISampleGrabber`Événement `OnVideoFrameBuffer` sur tout SDK

Correspondance des interfaces C# DirectShow

Correspondance des interfaces C# DirectShow

Interface DirectShow.NETÉquivalent VisioForge
`IGraphBuilder`Pipeline construit automatiquement par le SDK
`ICaptureGraphBuilder2`Constructeur de `VideoCaptureCoreX`
`IMediaControl` (Run/Stop/Pause)`StartAsync()` / `StopAsync()` / `PauseAsync()`
`IMediaEvent`Événements SDK (`OnError`, `OnStop`, etc.)
`IVideoWindow`Contrôle `VideoView` (WinForms/WPF/MAUI/Avalonia)
`ISampleGrabber`Événement `OnVideoFrameBuffer`
`IBaseFilter`Non nécessaire — le SDK gère les filtres en interne
`IPin` / connexions de pinNon nécessaire — le SDK connecte le pipeline automatiquement
`DsDevice.GetDevicesOfCat()``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.VideoInputDevice``DeviceEnumerator.Shared.VideoSourcesAsync()`
`FilterCategory.AudioInputDevice``DeviceEnumerator.Shared.AudioSourcesAsync()`
`IAMTVTuner`Propriété `VideoCaptureCore.TVTuner`
`IDvdControl2`Méthodes `MediaPlayerCore.DVD_*`
`Marshal.ReleaseComObject()``await sdk.DisposeAsync()`

Capture webcam C# avec aperçu

DirectShow.NET — capture webcam (avant)

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 — capture webcam C# (aprè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();

Enregistrement webcam C# en MP4

DirectShow.NET — webcam vers MP4 (avant)

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 — enregistrement webcam C# en MP4 (aprè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();

Lecture de fichier vidéo C#

DirectShow.NET — lecture vidéo (avant)

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 — lecteur vidéo C# (après)

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

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

Capture de frames vidéo C#

DirectShow.NET — capture de frames ISampleGrabber (avant)

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 — capture de frames vidéo C# (aprè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);
};

Liste de vérification de migration

  • Auditer l'utilisation de DirectShow.NET — Trouver toutes les références `using DirectShowLib`
  • Identifier l'objectif du filter graph — Capture, lecture, transcodage ou traitement personnalisé
  • Choisir le SDK VisioForge — Video Capture, Media Player, Video Edit ou Media Blocks
  • Installer les packages NuGet — Remplacer le NuGet DirectShowLib par les packages VisioForge
  • Remplacer le code du filter graph
  • Supprimer le code de nettoyage COM — VisioForge utilise `IAsyncDisposable`
  • Supprimer les dépendances de filtres DirectShow tiers — VisioForge inclut les codecs
  • Cibler .NET moderne — .NET 6-10
  • Tester multiplateforme
  • Supprimer l'enregistrement des filtres DirectShow — Plus nécessaire

Ce que vous gagnez après la migration

AspectDirectShow.NETAprès la migration
Lignes de code100+ par fonctionnalité5-10 par fonctionnalité
Framework.NET Framework 2.0.NET 6-10
PlateformesWindows uniquementWindows, macOS, Linux, iOS, Android
Style d'APICOM brut, connexions de pin manuellesAPI C# async typée
CodecsChercher et installer des filtres DirectShowIntégrés (H.264, H.265, AV1, VP9)
Gestion mémoire`Marshal.ReleaseComObject` manuel`IAsyncDisposable`
DébogageErreurs COM opaques (HRESULT)Exceptions typées, événements
Effets vidéoChercher des filtres d'effets40+ intégrés (GPU + CPU)
Effets audioAucun40+ (EQ, reverb, chorus, 3D)
StreamingNon disponibleRTMP, HLS, SRT, NDI
DétectionNon disponibleMouvement (MOG2), visage (Haar/DNN/DLib), piéton (HOG+SVM), code-barres
Encodage matérielChercher des filtres d'encodeurNVENC, QSV, AMF, VideoToolbox
Caméras IPFilter graph manuelRTSP, RTMP, HLS, ONVIF avec reconnexion automatique
MaintenanceAbandonné (2010)Développement actif

Frequently Asked Questions

DirectShow.NET est-il encore maintenu ?
Non. DirectShow.NET a été abandonné depuis février 2010. Microsoft a également abandonné l'API DirectShow sous-jacente au profit de Media Foundation.
Quelle est la meilleure alternative à DirectShow.NET pour la capture vidéo C# ?
VisioForge Video Capture SDK .Net remplace les filter graphs DirectShow par une API async typée. La capture webcam qui nécessitait plus de 80 lignes d'interop COM devient 5 lignes de code C#, avec enregistrement intégré, encodage matériel et support multiplateforme.
VisioForge peut-il remplacer les filter graphs DirectShow personnalisés ?
Oui. Le VisioForge Media Blocks SDK fournit un pipeline modulaire avec plus de 400 blocs qui remplace la construction de filter graphs personnalisés.
VisioForge supporte-t-il .NET 6, .NET 8, .NET 9 et .NET 10 ?
Oui. Tous les packages VisioForge .Net SDK supportent .NET 6 à .NET 10, y compris le déploiement multiplateforme.
Ai-je encore besoin de filtres DirectShow installés sur le système ?
Non. VisioForge inclut ses propres codecs et décodeurs. H.264, H.265, AV1, VP9, AAC et d'autres codecs fonctionnent directement.
Puis-je migrer de DirectShow.NET de manière incrémentale ?
Oui. Les SDKs VisioForge peuvent coexister avec DirectShow.NET dans le même projet. Remplacez un filter graph à la fois.

Commencez votre migration

Guides de migration associés