Last updated: 2026년 1월
DirectShow.NET 대안: VisioForge .Net SDK 마이그레이션 가이드
DirectShow.NET(개발 중단)에서 VisioForge .NET SDK로 마이그레이션하는 단계별 가이드. .NET 6-10에서 비디오 캡처, 재생 및 처리.
DirectShow.NET(directshowlib)에서 최신 .NET 6-10 비디오 캡처, 재생 및 처리 SDK로 마이그레이션하는 C# 개발자
왜 DirectShow.NET을 교체해야 하는가?
DirectShow.NET은 2010년 2월 이후 개발이 중단되었습니다 — 15년 이상 업데이트 없음. Microsoft의 DirectShow API에 대한 원시 COM 인터페이스 정의를 제공하며, Microsoft 자체가 Media Foundation을 선호하여 DirectShow를 더 이상 사용하지 않습니다.
| 위험 | 영향 |
|---|---|
| Microsoft가 DirectShow를 더 이상 사용하지 않음 | 새로운 기능, 코덱 또는 플랫폼 지원 없음 |
| 라이브러리 유지보수 중단 | .NET Framework 2.0, .NET 6+ 지원 없음 |
| COM 복잡성 | 기본 작업에 수백 줄, 수동 메모리 관리 |
| 코덱 찾기 | 서드파티 DirectShow 필터를 찾고, 설치하고, 등록해야 함 |
| 필터 그래프 디버깅 | 불투명한 파이프라인 오류, 진단 도구 없음 |
| Windows 전용 | COM/DirectShow는 macOS, Linux 또는 모바일에서 실행 불가 |
| 최신 코덱 없음 | 서드파티 필터 없이는 네이티브 H.265, AV1, VP9 없음 |
| 레지스트리 문제 | 최신 Windows에서 필터 등록 문제 |
어떤 VisioForge SDK가 무엇을 대체하는가?
DirectShow.NET 사용법에서 VisioForge 대체로
| DirectShow.NET 사용법 | VisioForge 대체 |
|---|---|
| 필터 그래프를 통한 C# 웹캠 캡처 | Video Capture SDK .Net — `VideoCaptureCoreX` |
| C# IP 카메라 캡처 (RTSP/MJPEG) | Video Capture SDK .Net — `RTSPSourceSettings` |
| C# 화면 캡처 및 녹화 | Video Capture SDK .Net — `ScreenCaptureSourceSettings` |
| `IGraphBuilder`를 통한 파일 재생 | Media Player SDK .Net — `MediaPlayerCoreX` |
| `IDvdControl2`를 통한 DVD 재생 | Media Player SDK .Net — DVD 내비게이션 API |
| `IAMTVTuner`를 통한 TV 튜너 | Video Capture SDK .Net — `VideoCaptureCore` |
| 파일 트랜스코딩 | Video Edit SDK .Net — `VideoEditCoreX` |
| 커스텀 필터 그래프 | Media Blocks SDK .Net — 모듈형 파이프라인 (400+ 블록) |
| `ISampleGrabber` 프레임 액세스 | 모든 SDK의 `OnVideoFrameBuffer` 이벤트 |
C# DirectShow 인터페이스 매핑
C# DirectShow 인터페이스 매핑
| DirectShow.NET 인터페이스 | VisioForge 동등 기능 |
|---|---|
| `IGraphBuilder` | SDK가 파이프라인을 자동으로 구축 |
| `ICaptureGraphBuilder2` | `VideoCaptureCoreX` 생성자 |
| `IMediaControl` (Run/Stop/Pause) | `StartAsync()` / `StopAsync()` / `PauseAsync()` |
| `IMediaEvent` | SDK 이벤트 (`OnError`, `OnStop` 등) |
| `IVideoWindow` | `VideoView` 컨트롤 (WinForms/WPF/MAUI/Avalonia) |
| `ISampleGrabber` | `OnVideoFrameBuffer` 이벤트 |
| `IBaseFilter` | 불필요 — SDK가 내부적으로 필터 관리 |
| `IPin` / 핀 연결 | 불필요 — SDK가 자동으로 파이프라인 연결 |
| `DsDevice.GetDevicesOfCat()` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.VideoInputDevice` | `DeviceEnumerator.Shared.VideoSourcesAsync()` |
| `FilterCategory.AudioInputDevice` | `DeviceEnumerator.Shared.AudioSourcesAsync()` |
| `IAMTVTuner` | `VideoCaptureCore.TVTuner` 속성 |
| `IDvdControl2` | `MediaPlayerCore.DVD_*` 메서드 |
| `Marshal.ReleaseComObject()` | `await sdk.DisposeAsync()` |
C# 웹캠 캡처 및 미리보기
DirectShow.NET — 웹캠 캡처 (이전)
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 — C# 웹캠 캡처 (이후)
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();C# 웹캠 MP4 녹화
DirectShow.NET — 웹캠에서 MP4 (이전)
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 — C# 웹캠 MP4 녹화 (이후)
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();C# 비디오 파일 재생
DirectShow.NET — 비디오 재생 (이전)
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 — C# 비디오 플레이어 (이후)
C#var player = new MediaPlayerCoreX(videoView);
await player.OpenAsync(new Uri("video.mp4"));
await player.PlayAsync();
// Seeking
await player.SeekAsync(TimeSpan.FromSeconds(5));C# 비디오 프레임 캡처
DirectShow.NET — ISampleGrabber 프레임 캡처 (이전)
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 — C# 비디오 프레임 캡처 (이후)
C#capture.OnVideoFrameBuffer += (s, e) =>
{
// Frame data available as managed buffer
// Or convert to SKBitmap/Bitmap directly
var bitmap = e.Frame.ToBitmap();
ProcessFrame(bitmap);
};마이그레이션 체크리스트
- DirectShow.NET 사용 현황 감사 — 모든 `using DirectShowLib` 참조 찾기
- 필터 그래프 목적 식별 — 캡처, 재생, 트랜스코딩 또는 커스텀 처리
- VisioForge SDK 선택 — Video Capture, Media Player, Video Edit 또는 Media Blocks
- NuGet 패키지 설치 — DirectShowLib NuGet을 VisioForge 패키지로 교체
- 필터 그래프 코드 교체
- COM 정리 코드 제거 — VisioForge는 `IAsyncDisposable` 사용
- 서드파티 DirectShow 필터 종속성 제거 — VisioForge에 코덱 포함
- 최신 .NET 대상 — .NET 6-10
- 크로스 플랫폼 테스트
- DirectShow 필터 등록 제거 — 더 이상 필요 없음
마이그레이션 후 얻는 것
| 항목 | DirectShow.NET | 마이그레이션 후 |
|---|---|---|
| 코드 줄 수 | 기능당 100줄 이상 | 기능당 5-10줄 |
| 프레임워크 | .NET Framework 2.0 | .NET 6-10 |
| 플랫폼 | Windows 전용 | Windows, macOS, Linux, iOS, Android |
| API 스타일 | 원시 COM, 수동 핀 연결 | 타입 지정 async C# API |
| 코덱 | DirectShow 필터 찾아서 설치 | 내장 (H.264, H.265, AV1, VP9) |
| 메모리 관리 | 수동 `Marshal.ReleaseComObject` | `IAsyncDisposable` |
| 디버깅 | 불투명한 COM 오류 (HRESULT) | 타입 지정 예외, 이벤트 |
| 비디오 효과 | 효과 필터 찾아야 함 | 40+ 내장 (GPU + CPU) |
| 오디오 효과 | 없음 | 40+ (EQ, 리버브, 코러스, 3D) |
| 스트리밍 | 사용 불가 | RTMP, HLS, SRT, NDI |
| 감지 | 사용 불가 | 모션 (MOG2), 얼굴 (Haar/DNN/DLib), 보행자 (HOG+SVM), 바코드 |
| 하드웨어 인코딩 | 인코더 필터 찾아야 함 | NVENC, QSV, AMF, VideoToolbox |
| IP 카메라 | 수동 필터 그래프 | RTSP, RTMP, HLS, ONVIF (자동 재연결) |
| 유지보수 | 개발 중단 (2010) | 활발한 개발 |
Frequently Asked Questions
DirectShow.NET은 아직 유지보수되고 있나요?
아니요. DirectShow.NET은 2010년 2월 이후 개발이 중단되었습니다. Microsoft도 기반 DirectShow API를 Media Foundation으로 대체하여 더 이상 사용하지 않습니다.
C# 비디오 캡처를 위한 최고의 DirectShow.NET 대안은 무엇인가요?
VisioForge Video Capture SDK .Net은 DirectShow 필터 그래프를 타입 지정 async API로 대체합니다. 80줄 이상의 COM 인터롭이 필요했던 웹캠 캡처가 5줄의 C# 코드가 되며, 내장 녹화, 하드웨어 인코딩 및 크로스 플랫폼 지원을 제공합니다.
VisioForge가 커스텀 DirectShow 필터 그래프를 대체할 수 있나요?
네. VisioForge Media Blocks SDK는 커스텀 필터 그래프 구성을 대체하는 400개 이상의 블록이 있는 모듈형 파이프라인을 제공합니다.
VisioForge는 .NET 6, .NET 8, .NET 9, .NET 10을 지원하나요?
네. 모든 VisioForge .Net SDK 패키지는 .NET 6부터 .NET 10까지 지원하며, 크로스 플랫폼 배포를 포함합니다.
시스템에 DirectShow 필터가 여전히 설치되어 있어야 하나요?
아니요. VisioForge는 자체 코덱과 디코더를 번들로 제공합니다. H.264, H.265, AV1, VP9, AAC 및 기타 코덱이 즉시 작동합니다.
DirectShow.NET에서 점진적으로 마이그레이션할 수 있나요?
네. VisioForge SDK는 동일한 프로젝트에서 DirectShow.NET과 공존할 수 있습니다. 필터 그래프를 하나씩 교체하세요.
