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.
| Risque | Impact |
|---|---|
| DirectShow abandonné par Microsoft | Pas de nouvelles fonctionnalités, codecs ou support de plateforme |
| Bibliothèque non maintenue | .NET Framework 2.0, pas de support .NET 6+ |
| Complexité COM | Des centaines de lignes pour des tâches basiques, gestion manuelle de la mémoire |
| Recherche de codecs | Doit trouver, installer et enregistrer des filtres DirectShow tiers |
| Débogage du filter graph | Échecs de pipeline opaques, pas d'outils de diagnostic |
| Windows uniquement | COM/DirectShow ne peut pas fonctionner sur macOS, Linux ou mobile |
| Pas de codecs modernes | Pas de H.265, AV1, VP9 natifs sans filtres tiers |
| Problèmes de registre | Problèmes d'enregistrement des filtres sur Windows moderne |
Quel SDK VisioForge remplace quoi ?
Utilisation de DirectShow.NET vers remplacement VisioForge
| Utilisation de DirectShow.NET | Remplacement VisioForge |
|---|---|
| Capture webcam C# via filter graph | Video 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 fichiers | Video Edit SDK .Net — `VideoEditCoreX` |
| Filter graphs personnalisés | Media 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 pin | Non 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 objectsVisioForge — 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
| Aspect | DirectShow.NET | Après la migration |
|---|---|---|
| Lignes de code | 100+ par fonctionnalité | 5-10 par fonctionnalité |
| Framework | .NET Framework 2.0 | .NET 6-10 |
| Plateformes | Windows uniquement | Windows, macOS, Linux, iOS, Android |
| Style d'API | COM brut, connexions de pin manuelles | API C# async typée |
| Codecs | Chercher et installer des filtres DirectShow | Intégrés (H.264, H.265, AV1, VP9) |
| Gestion mémoire | `Marshal.ReleaseComObject` manuel | `IAsyncDisposable` |
| Débogage | Erreurs COM opaques (HRESULT) | Exceptions typées, événements |
| Effets vidéo | Chercher des filtres d'effets | 40+ intégrés (GPU + CPU) |
| Effets audio | Aucun | 40+ (EQ, reverb, chorus, 3D) |
| Streaming | Non disponible | RTMP, HLS, SRT, NDI |
| Détection | Non disponible | Mouvement (MOG2), visage (Haar/DNN/DLib), piéton (HOG+SVM), code-barres |
| Encodage matériel | Chercher des filtres d'encodeur | NVENC, QSV, AMF, VideoToolbox |
| Caméras IP | Filter graph manuel | RTSP, RTMP, HLS, ONVIF avec reconnexion automatique |
| Maintenance | Abandonné (2010) | Développement actif |
Frequently Asked Questions
DirectShow.NET est-il encore maintenu ?
Quelle est la meilleure alternative à DirectShow.NET pour la capture vidéo C# ?
VisioForge peut-il remplacer les filter graphs DirectShow personnalisés ?
VisioForge supporte-t-il .NET 6, .NET 8, .NET 9 et .NET 10 ?
Ai-je encore besoin de filtres DirectShow installés sur le système ?
Puis-je migrer de DirectShow.NET de manière incrémentale ?
Commencez votre migration
Guide d'installation
Configuration pour Visual Studio, Rider et VS pour Mac
Video Capture SDK
Remplace les filter graphs de capture DirectShow
Media Player SDK
Remplace les graphs de lecture et DVD DirectShow
Media Blocks SDK
Remplace les filter graphs personnalisés avec 400+ blocs typés
Documentation
Référence API, tutoriels et guides de déploiement
Parcourir les exemples de code
Exemples C# fonctionnels
