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 |
Concepts DirectShow expliqués
Comprendre comment l'architecture DirectShow correspond aux SDKs VisioForge vous aide à planifier votre migration. Le tableau ci-dessous montre comment chaque concept principal de DirectShow se traduit en équivalent .NET moderne.
Architecture DirectShow vers équivalents VisioForge
| Concept DirectShow | Équivalent VisioForge |
|---|---|
| Filter Graph (IGraphBuilder) | Pipeline — géré automatiquement par le SDK, ou MediaBlocksPipeline explicite |
| Source Filter (périphérique/fichier) | Paramètres source : VideoCaptureDeviceSourceSettings, RTSPSourceSettings, etc. |
| Transform Filter (effets/encodeur) | Effets vidéo/audio intégrés + classes d'encodeur (H264EncoderSettings, etc.) |
| Renderer Filter (fenêtre vidéo) | Contrôle VideoView (WinForms, WPF, MAUI, Avalonia) |
| Mux Filter (AVI/MP4 mux) | Classes de format de sortie : MP4Output, AVIOutput, MKVOutput, WebMOutput |
| Connexions de pins | Automatique — ou Block.Connect() explicite dans Media Blocks SDK |
| Types de médias (AM_MEDIA_TYPE) | Géré automatiquement — pas de négociation manuelle de format |
| Catégories de filtres (énumération des périphériques) | DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync() |
| Enregistrement des filtres DirectShow (regsvr32) | Packages NuGet — aucun enregistrement système nécessaire |
| Outil de débogage GraphEdit | Événements de pipeline, journalisation, exceptions typées |
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);
};C# Capture de caméra IP (RTSP)
DirectShow.NET — capture RTSP (avant)
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 supportVisioForge — capture RTSP (aprè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# Capture et enregistrement d'écran
DirectShow.NET — capture d'écran (avant)
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 supportVisioForge — capture d'écran (aprè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# Enregistrement audio depuis le microphone
DirectShow.NET — capture audio (avant)
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 objectsVisioForge — capture audio (aprè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 traitement personnalisée
DirectShow.NET — filtergraph personnalisé (avant)
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-dependentVisioForge Media Blocks — pipeline personnalisée (aprè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();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
