VisioForge

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์—์„œ ํ•„ํ„ฐ ๋“ฑ๋ก ๋ฌธ์ œ

DirectShow ๊ฐœ๋… ์„ค๋ช…

DirectShow ์•„ํ‚คํ…์ฒ˜๊ฐ€ VisioForge SDK์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€ ์ดํ•ดํ•˜๋ฉด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ„ํš์„ ์„ธ์šฐ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋Š” DirectShow์˜ ๊ฐ ํ•ต์‹ฌ ๊ฐœ๋…์ด ์ตœ์‹  .NET ๋Œ€์‘ ๊ธฐ๋Šฅ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

DirectShow ์•„ํ‚คํ…์ฒ˜์—์„œ VisioForge ๋Œ€์‘์œผ๋กœ

DirectShow ๊ฐœ๋…VisioForge ๋Œ€์‘
Filter Graph (IGraphBuilder)ํŒŒ์ดํ”„๋ผ์ธ โ€” SDK๊ฐ€ ์ž๋™ ๊ด€๋ฆฌ ๋˜๋Š” ๋ช…์‹œ์  MediaBlocksPipeline
Source Filter (์žฅ์น˜/ํŒŒ์ผ)์†Œ์Šค ์„ค์ •: VideoCaptureDeviceSourceSettings, RTSPSourceSettings ๋“ฑ
Transform Filter (ํšจ๊ณผ/์ธ์ฝ”๋”)๋‚ด์žฅ ๋น„๋””์˜ค/์˜ค๋””์˜ค ํšจ๊ณผ + ์ธ์ฝ”๋” ํด๋ž˜์Šค (H264EncoderSettings ๋“ฑ)
Renderer Filter (๋น„๋””์˜ค ์ฐฝ)VideoView ์ปจํŠธ๋กค (WinForms, WPF, MAUI, Avalonia)
Mux Filter (AVI/MP4 mux)์ถœ๋ ฅ ํฌ๋งท ํด๋ž˜์Šค: MP4Output, AVIOutput, MKVOutput, WebMOutput
ํ•€ ์—ฐ๊ฒฐ์ž๋™ โ€” ๋˜๋Š” Media Blocks SDK์—์„œ ๋ช…์‹œ์  Block.Connect()
๋ฏธ๋””์–ด ํƒ€์ž… (AM_MEDIA_TYPE)์ž๋™ ์ฒ˜๋ฆฌ โ€” ์ˆ˜๋™ ํฌ๋งท ํ˜‘์ƒ ๋ถˆํ•„์š”
ํ•„ํ„ฐ ์นดํ…Œ๊ณ ๋ฆฌ (์žฅ์น˜ ์—ด๊ฑฐ)DeviceEnumerator.Shared.VideoSourcesAsync() / AudioSourcesAsync()
DirectShow ํ•„ํ„ฐ ๋“ฑ๋ก (regsvr32)NuGet ํŒจํ‚ค์ง€ โ€” ์‹œ์Šคํ…œ ๋“ฑ๋ก ๋ถˆํ•„์š”
GraphEdit ๋””๋ฒ„๊น… ๋„๊ตฌํŒŒ์ดํ”„๋ผ์ธ ์ด๋ฒคํŠธ, ๋กœ๊น…, ํƒ€์ž… ์ง€์ • ์˜ˆ์™ธ

์–ด๋–ค 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 โ€” `ScreenCaptureDX9SourceSettings`
`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#
await VisioForgeX.InitSDKAsync();
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 objects

VisioForge โ€” C# ์›น์บ  MP4 ๋…นํ™” (์ดํ›„)

C#
await VisioForgeX.InitSDKAsync();
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#
await VisioForgeX.InitSDKAsync();
var player = new MediaPlayerCoreX(videoView);
await player.OpenAsync(await UniversalSourceSettings.CreateAsync("video.mp4"));
await player.PlayAsync();

// Seeking
await player.Position_SetAsync(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);
};

C# IP ์นด๋ฉ”๋ผ (RTSP) ์บก์ฒ˜

DirectShow.NET โ€” RTSP ์บก์ฒ˜ (์ด์ „)

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 support

VisioForge โ€” RTSP ์บก์ฒ˜ (์ดํ›„)

C#
var capture = new VideoCaptureCoreX(videoView);
// RTSPSourceSettings requires async factory (private constructor)
capture.Video_Source = await RTSPSourceSettings.CreateAsync(
    new Uri("rtsp://camera-ip:554/stream"), "admin", "password");
capture.Outputs_Add(new MP4Output("recording.mp4"), true);
await capture.StartAsync();

C# ํ™”๋ฉด ์บก์ฒ˜ ๋ฐ ๋…นํ™”

DirectShow.NET โ€” ํ™”๋ฉด ์บก์ฒ˜ (์ด์ „)

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 support

VisioForge โ€” ํ™”๋ฉด ์บก์ฒ˜ (์ดํ›„)

C#
await VisioForgeX.InitSDKAsync();
var capture = new VideoCaptureCoreX(videoView);
capture.Video_Source = new ScreenCaptureDX9SourceSettings
{
    Monitor = 0,
    FrameRate = new VideoFrameRate(25),
    CaptureCursor = true
};
capture.Outputs_Add(new MP4Output("recording.mp4"), true);
await capture.StartAsync();

C# ๋งˆ์ดํฌ ์˜ค๋””์˜ค ๋…น์Œ

DirectShow.NET โ€” ์˜ค๋””์˜ค ์บก์ฒ˜ (์ด์ „)

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 objects

VisioForge โ€” ์˜ค๋””์˜ค ์บก์ฒ˜ (์ดํ›„)

C#
var capture = new VideoCaptureCoreX();
var audioDevices = await DeviceEnumerator.Shared
    .AudioSourcesAsync();
capture.Audio_Source = audioDevices[0].CreateSourceSettingsVC();
capture.Audio_Record = true;
capture.Outputs_Add(new WAVOutput("audio.wav"), true);
await capture.StartAsync();

C# ์ปค์Šคํ…€ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

DirectShow.NET โ€” ์ปค์Šคํ…€ ํ•„ํ„ฐ ๊ทธ๋ž˜ํ”„ (์ด์ „)

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-dependent

VisioForge Media Blocks โ€” ์ปค์Šคํ…€ ํŒŒ์ดํ”„๋ผ์ธ (์ดํ›„)

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();

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • 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๊ณผ ๊ณต์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ํ•˜๋‚˜์”ฉ ๊ต์ฒดํ•˜์„ธ์š”.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์ž‘

๊ด€๋ จ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ