Last updated: 2026๋ 1์
Video Capture SDK .NET vs LibVLCSharp
ํฌ๊ด์ ์ธ .NET ๋น๋์ค ์บก์ฒ ๋น๊ต
.NET ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ๋น๋์ค ์บก์ฒ ํ๋ ์์ํฌ๋ฅผ ์ ํํ๋ ๊ฒ์ ์ค์ํ ์ํคํ ์ฒ ๊ฒฐ์ ์ ๋๋ค. ์ด ๊ฐ์ด๋๋ VisioForge Video Capture SDK .NET(์ ์ฉ ์บก์ฒ ์์ง)๊ณผ LibVLCSharp(VLC ๋ฏธ๋์ด ์์ง์ .NET ๋ฐ์ธ๋ฉ) ๊ฐ์ ์์ธํ๊ณ ๊ณต์ ํ ๋น๊ต๋ฅผ ์ ๊ณตํฉ๋๋ค. LibVLCSharp๋ ๋ฏธ๋์ด ์ฌ์์ ๋ฐ์ด๋๋ฉฐ ์บก์ฒ ์ฅ์น๋ฅผ ์ด ์ ์์ง๋ง, Video Capture SDK๋ ์ ๋ฌธ์ ์ธ ๋น๋์ค ์บก์ฒ ์ํฌํ๋ก์ฐ๋ฅผ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ์ ๋ณด์ ๊ธฐ๋ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ์ํคํ ์ฒ, ๊ธฐ๋ฅ, ์ฑ๋ฅ, ๋ผ์ด์ ์ค ๋ฐ ์ค์ ์ฝ๋๋ฅผ ๊ฒํ ํฉ๋๋ค.
์์ฝ
| ์ธก๋ฉด | Video Capture SDK .NET | LibVLCSharp |
|---|---|---|
| ์ํคํ ์ฒ | ๋์ผ ์์ง: ๋ค์ดํฐ๋ธ DirectShow/Media Foundation + ๋ด์ฅ GStreamer ํ์ดํ๋ผ์ธ | libvlc C interop์ ํตํ ๋ชจ๋๋ฆฌ์ VLC ๋ฏธ๋์ด ์์ง |
| ์ฃผ์ ๋ชฉ์ | ์ ๋ฌธ์ ์ธ ๋น๋์ค ์บก์ฒ, ๋ นํ, ์คํธ๋ฆฌ๋ฐ ๋ฐ ์ฒ๋ฆฌ | ๊ธฐ๋ณธ ์บก์ฒ ์ฅ์น ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋ฏธ๋์ด ์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| ์บก์ฒ ์์ค | ์น์บ , ํ๋ฉด, IP ์นด๋ฉ๋ผ, ์บก์ฒ ์นด๋, TV ํ๋, NDI, ์ฐ์ ์ฉ ์นด๋ฉ๋ผ | dshow:// ๊ฒฝ์ ์น์บ , screen:// ๊ฒฝ์ ํ๋ฉด, URL ๊ฒฝ์ IP ์นด๋ฉ๋ผ |
| ๋ผ์ด๋ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ | ์ค๋ฒ๋ ์ด์ ํจ๊ณผ๊ฐ ํฌํจ๋ ๋ด์ฅ GPU ๊ฐ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ | ๋ด์ฅ ๋น๋์ค ์ํผ์ค ๋ ๋๋ง(์ฌ์ ์งํฅ) |
| ๋ นํ ํ์ | MP4, MKV, WebM, AVI, WMV, MOV, TS, GIF + ํ์ ํ๋ ์ถ๋ ฅ ํด๋์ค๋ก 30๊ฐ ์ด์ | sout ํธ๋์ค์ฝ๋ ์ฒด์ธ ๊ฒฝ์ โ ๋ฌธ์์ด ๊ธฐ๋ฐ ๊ตฌ์ฑ |
| ๋ค์ค ์ถ๋ ฅ | ๋์ ๋ นํ + ์คํธ๋ฆผ + ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ํ ๋ค์ดํฐ๋ธ Outputs_Add API | sout duplicate ์ง์์ด ๊ฒฝ์ โ ์ทจ์ฝํ ๋ฌธ์์ด ๊ตฌ๋ฌธ |
| ๋น๋์ค ํจ๊ณผ | ์บก์ฒ ์ค 40๊ฐ ์ด์์ CPU ๋ฐ GPU ๊ฐ์ ํจ๊ณผ | ์บก์ฒ ์ค ์ค์๊ฐ ํจ๊ณผ ์์ |
| ๊ฐ์ง | ๋ชจ์ , ์ผ๊ตด, ๋ฐ์ฝ๋/QR ๊ฐ์ง ๋ด์ฅ | ๊ฐ์ง ๊ธฐ๋ฅ ์์ |
| ๋ผ์ด์ ์ค | ๊ฐ๋ฐ์๋น ์์ ์ฉ ๋ผ์ด์ ์ค(๊ตฌ๋ ๋๋ ์๊ตฌ) | LGPL 2.1 โ ๋์ ๋งํฌ ์ ๋ฌด๋ฃ |
| ๊ฐ๊ฒฉ | EUR 250(๊ตฌ๋ )๋ถํฐ EUR 1,500(ํ ์๊ตฌ)๊น์ง | ๋ฌด๋ฃ(LGPL 2.1) |
์ํคํ ์ฒ ์์ธ ๋ถ์
Video Capture SDK .NET ์ํคํ ์ฒ
Video Capture SDK๋ ๋์ผ ์์ง ์ค๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ ์์ง์ Windows์์ DirectShow์ Media Foundation์ ๋ํํ์ฌ OS๊ฐ ๋ ธ์ถํ๋ ๋ชจ๋ ์บก์ฒ ์ฅ์น์ ๋ํ ๋ค์ดํฐ๋ธ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค. ๋ณด์กฐ ๋ด์ฅ GStreamer ํ์ดํ๋ผ์ธ์ ํฌ๋ก์ค ํ๋ซํผ ์บก์ฒ, ๊ณ ๊ธ ์ฝ๋ฑ ์์ ๋ฐ IP ์นด๋ฉ๋ผ ์์ง์ ์ฒ๋ฆฌํฉ๋๋ค. ๋ ์์ง์ ํตํฉ๋ .NET API ํ๋ฉด์ ๊ณต์ ํ๋ฏ๋ก ์ ํ ์ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์์ต๋๋ค.
- โถDirectShow ๋ฐ Media Foundation ํํฐ ๊ทธ๋ํ๋ฅผ ํตํ ๋ค์ดํฐ๋ธ Windows ์บก์ฒ
- โถmacOS, Linux, iOS ๋ฐ Android์ฉ ํฌ๋ก์ค ํ๋ซํผ GStreamer ์์ง
- โถDirect3D / OpenGL ๋ ๋๋ฌ๋ฅผ ํตํ GPU ๊ฐ์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- โถ.NET async/await ์ง์์ด ํฌํจ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ
- โถ๋จ์ผ ํ๋ก์ธ์ค ๋ชจ๋ธ โ ์์ ํ๋ก์ธ์ค ๊ด๋ฆฌ ๋ถํ์
- โถ๋ นํ ๋ฐ ์คํธ๋ฆฌ๋ฐ ๊ตฌ์ฑ์ ์ํ ํ์ ํ๋ ์ถ๋ ฅ ํด๋์ค
LibVLCSharp ์ํคํ ์ฒ
LibVLCSharp๋ VLC ๋ฏธ๋์ด ํ๋ ์ด์ด์ ํต์ฌ ์์ง์ธ libvlc์ ๊ณต์ .NET ๋ฐ์ธ๋ฉ์ ๋๋ค. VLC์ C API์ ๋ํ ๊ด๋ฆฌํ ๋ํผ๋ฅผ ์ ๊ณตํ์ฌ VLC์ ๊ด๋ฒ์ํ ๋ฏธ๋์ด ์ฌ์ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค. ์ฃผ๋ก ์ฌ์์ฉ์ผ๋ก ์ค๊ณ๋์์ง๋ง VLC์ ๋ฏธ๋์ด ๋ฆฌ์์ค ๋ก์ผ์ดํฐ ๊ตฌ๋ฌธ(dshow://, screen://, v4l2://)์ ์ฌ์ฉํ์ฌ ์บก์ฒ ์ฅ์น๋ฅผ ์ด ์ ์์ต๋๋ค.
- โถP/Invoke๋ฅผ ํตํ libvlc C API์ ๊ด๋ฆฌํ .NET ๋ํผ
- โถ๋ชจ๋ ๋ฏธ๋์ด ์์ ์ ์ฒ๋ฆฌํ๋ ๋ชจ๋๋ฆฌ์ VLC ์์ง
- โถURL ์คํ์ผ ๋ฏธ๋์ด ๋ฆฌ์์ค ๋ก์ผ์ดํฐ๋ฅผ ํตํด ์ ๊ทผํ๋ ์บก์ฒ ์ฅ์น
- โถsout(์คํธ๋ฆผ ์ถ๋ ฅ) ๋ฌธ์์ด ์ฒด์ธ์ ํตํด ๊ตฌ์ฑ๋๋ ๋ นํ
- โถ์ฌ์ ์ฐ์ ์ค๊ณ โ ์บก์ฒ๋ ๋ณด์กฐ ์ฌ์ฉ ์ฌ๋ก
- โถํ๋ซํผ๋ณ VLC ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํ ํฌ๋ก์ค ํ๋ซํผ
์ฃผ์ ์ํคํ ์ฒ ์ฐจ์ด์
| ์ธก๋ฉด | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ์ค๊ณ ์ด์ | ๋น๋์ค ์บก์ฒ ์ํฌํ๋ก์ฐ ์ ์ฉ์ผ๋ก ๊ตฌ์ถ | ์บก์ฒ๋ฅผ ๋ณด์กฐ ๊ธฐ๋ฅ์ผ๋ก ํ๋ ๋ฏธ๋์ด ์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| ์ฅ์น ๊ฒ์ | ์ ์ฒด ์ฅ์น ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๋ค์ดํฐ๋ธ OS ์ด๊ฑฐ API | ์๋ dshow:// ๋๋ v4l2:// URL ๊ตฌ์ฑ |
| ๋ นํ ๊ตฌ์ฑ | ํ์ ํ๋ .NET ์ถ๋ ฅ ํด๋์ค(MP4Output, H264EncoderSettings) | ๋ฌธ์์ด ๊ธฐ๋ฐ sout ํธ๋์ค์ฝ๋ ์ฒด์ธ |
| ์ค๋ฅ ์ฒ๋ฆฌ | .NET ์์ธ ๋ฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ค๋ฅ | VLC ๋ก๊ทธ ์ฝ๋ฐฑ ๋ฐ ์ด๋ฒคํธ ๊ตฌ๋ |
| ๋ค์ค ์ถ๋ ฅ | ๋ค์ดํฐ๋ธ Outputs_Add API โ ๊ด๋ฆฌํ์ด๊ณ ํ์ ์์ | sout duplicate ์ง์์ด โ ์ทจ์ฝํ ๋ฌธ์์ด ํ์ฑ |
| ํจ๊ณผ ํ์ดํ๋ผ์ธ | ์บก์ฒ ์ค ๋ด์ฅ CPU + GPU ํจ๊ณผ ์ฒด์ธ | ์บก์ฒ์ฉ ์ค์๊ฐ ํจ๊ณผ ํ์ดํ๋ผ์ธ ์์ |
๊ธฐ๋ฅ๋ณ ๋น๊ต
์บก์ฒ ์์ค
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| USB ์น์บ | โ | โ ๏ธ(์ ํ๋ ์ ์ด๋ก dshow:// ๊ฒฝ์ ) |
| ๋ด์ฅ ๋ ธํธ๋ถ ์นด๋ฉ๋ผ | โ | โ ๏ธ(dshow:// URL ๊ฒฝ์ ) |
| ํ๋ฉด/๋ฐ์คํฌํฑ ์บก์ฒ | โ | โ ๏ธ(screen:// ๊ฒฝ์ ๊ธฐ๋ณธ โ ์์ญ ์ ํ ์์) |
| ์ ํ๋ฆฌ์ผ์ด์ ์ฐฝ ์บก์ฒ | โ | โ |
| IP ์นด๋ฉ๋ผ(RTSP/ONVIF) | โ | โ ๏ธ(URL ๊ธฐ๋ฐ, ์๋ ์ฌ์ฐ๊ฒฐ ์์) |
| ์บก์ฒ ์นด๋(Blackmagic DeckLink) | โ | โ |
| TV ํ๋(BDA/DVB) | โ | โ |
| NDI ์์ค | โ | โ |
| ์ฐ์ ์ฉ ์นด๋ฉ๋ผ(GigE Vision, USB3 Vision) | โ | โ |
| ๊ฐ์ ์นด๋ฉ๋ผ(OBS Virtual Cam) | โ | โ ๏ธ(Windows์์๋ง dshow:// ๊ฒฝ์ ) |
๋ผ์ด๋ธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ๋ด์ฅ ๋น๋์ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ | โ | โ (์ฌ์ ์งํฅ ์ํผ์ค) |
| GPU ๊ฐ์ ๋ ๋๋ง | โ | โ |
| ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ํ ์คํธ/์ด๋ฏธ์ง ์ค๋ฒ๋ ์ด | โ | โ(์บก์ฒ ์ค ์ค๋ฒ๋ ์ด API ์์) |
| ๋ นํ ์๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ | โ | โ |
| ์ฌ๋ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฐฝ | โ | โ ๏ธ(์ฌ๋ฌ MediaPlayer ์ธ์คํด์ค ํ์) |
| WinForms / WPF / MAUI ์ปจํธ๋กค | โ | โ (VideoView ์ปจํธ๋กค ์ฌ์ฉ ๊ฐ๋ฅ) |
๋ นํ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| MP4(H.264 / H.265) | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| MKV ์ปจํ ์ด๋ | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| WebM(VP8 / VP9) | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| AVI | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| WMV / ASF | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| ํ์ ํ๋ ์ถ๋ ฅ ๊ตฌ์ฑ | โ | โ(๋ชจ๋ ๊ตฌ์ฑ์ ๋ฌธ์์ด ๊ธฐ๋ฐ) |
| ์ค๋์ค ์ ์ฉ ๋ นํ | โ | โ ๏ธ(sout ํธ๋์ค์ฝ๋ ๋ฌธ์์ด ๊ฒฝ์ ) |
| ์ธ๊ทธ๋จผํธ ๋ นํ(์๊ฐ/ํฌ๊ธฐ๋ณ ๋ถํ ) | โ | โ |
| ์ฌ์ ์ด๋ฒคํธ ๋ นํ (์ํ ๋ฒํผ) | โ | โ |
๋ค์ค ์ถ๋ ฅ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ๋์ ๋ นํ + ์คํธ๋ฆฌ๋ฐ | โ | โ ๏ธ(sout duplicate ๊ฒฝ์ โ ์ทจ์ฝ) |
| ์ฌ๋ฌ ๋ นํ ์ถ๋ ฅ | โ | โ ๏ธ(sout duplicate ๊ฒฝ์ โ ์ทจ์ฝ) |
| ๋ค์ดํฐ๋ธ Outputs_Add API | โ | โ |
| ๋ ๋ฆฝ์ ์ถ๋ ฅ ์ ์ด | โ | โ |
| ๋ นํ ์ค ์ค๋ ์ท | โ | โ ๏ธ(TakeSnapshot ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ์ ํ์ ) |
์คํธ๋ฆฌ๋ฐ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| RTMP Push | โ | โ ๏ธ(sout ๊ฒฝ์ โ ์ ํ๋ ์ ์ด) |
| RTSP ์๋ฒ ๋ชจ๋ | โ | โ |
| SRT(Caller / Listener) | โ | โ |
| HLS ์ธ๊ทธ๋จผํธ ์์ฑ | โ | โ ๏ธ(sout ๊ฒฝ์ โ ์ ํ์ ) |
| UDP / TCP ์ ๋์บ์คํธ / ๋ฉํฐ์บ์คํธ | โ | โ ๏ธ(sout rtp/udp ๊ฒฝ์ ) |
| ํ์ ํ๋ ์คํธ๋ฆฌ๋ฐ ๊ตฌ์ฑ | โ | โ(๋ชจ๋ ๊ตฌ์ฑ์ ๋ฌธ์์ด ๊ธฐ๋ฐ sout ์ฒด์ธ) |
๋น๋์ค ์ฒ๋ฆฌ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ์ค์๊ฐ ํฌ๊ธฐ ์กฐ์ /์๋ฅด๊ธฐ | โ | โ(์บก์ฒ ์ค ์ฒ๋ฆฌ ์์) |
| ๋์ธํฐ๋ ์ด์ค | โ | โ (VLC์ ๋ด์ฅ ๋์ธํฐ๋ ์ด์ค ์์) |
| ์์ ์กฐ์ (๋ฐ๊ธฐ, ๋๋น) | โ | โ(์บก์ฒ ์ค ํจ๊ณผ ์์) |
| ํ ์คํธ ์ค๋ฒ๋ ์ด/์ํฐ๋งํฌ | โ | โ(์บก์ฒ ์ค ์ค๋ฒ๋ ์ด ์์) |
| ์ด๋ฏธ์ง ์ค๋ฒ๋ ์ด/๋ก๊ณ | โ | โ(์บก์ฒ ์ค ์ค๋ฒ๋ ์ด ์์) |
| ํฝ์ฒ ์ธ ํฝ์ฒ | โ | โ |
| ํฌ๋ก๋ง ํค(๊ทธ๋ฆฐ ์คํฌ๋ฆฐ) | โ | โ |
| GPU ๊ฐ์ ํํฐ | โ | โ |
์ค๋์ค
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ์ค๋์ค ์ฅ์น ์บก์ฒ | โ | โ ๏ธ(dshow:// ์ค๋์ค ๊ฒฝ์ ) |
| ์์คํ ์ค๋์ค(๋ฃจํ๋ฐฑ) ์บก์ฒ | โ | โ |
| ์ค๋์ค ๋ฏน์ฑ(๋ค์ค ์ ๋ ฅ) | โ | โ |
| ์ค์๊ฐ ๋ณผ๋ฅจ/๊ฒ์ธ ์ ์ด | โ | โ ๏ธ(๊ธฐ๋ณธ ๋ณผ๋ฅจ ์ ์ด) |
| ์ค๋์ค ํจ๊ณผ(40๊ฐ ์ด์ ๋ด์ฅ) | โ | โ |
| VU ๋ฏธํฐ/๋ ๋ฒจ ๋ชจ๋ํฐ๋ง | โ | โ |
๊ฐ์ง ๋ฐ ๋ถ์
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| ๋ชจ์ ๊ฐ์ง | โ | โ |
| ์ผ๊ตด ๊ฐ์ง | โ | โ |
| ๋ฐ์ฝ๋/QR ์ฝ๋ ์ฝ๊ธฐ | โ | โ |
| ๊ฐ์ฒด ์ถ์ | โ | โ |
| ์ค๋์ค ๋ ๋ฒจ ๊ฐ์ง | โ | โ |
ํ๋ ์ ์ ๊ทผ ๋ฐ ํตํฉ
| ๊ธฐ๋ฅ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| Raw ํ๋ ์ ์ฝ๋ฐฑ(RGB / YUV) | โ | โ ๏ธ(SetVideoCallbacks ๊ฒฝ์ โ ๋ณต์กํ ์ค์ ) |
| Bitmap / SKBitmap / WriteableBitmap | โ | โ(์๋ ๋ณํ ํ์) |
| ML.NET / ONNX์ ํตํฉ | โ | โ ๏ธ(์๋ ํ๋ ์ ์ถ์ถ ํ์) |
| OpenCV Interop | โ | โ ๏ธ(๋น๋์ค ์ฝ๋ฐฑ ๊ฒฝ์ ) |
| ์ง์ GPU ํ ์ค์ฒ ์ ๊ทผ | โ | โ |
| ๊ฐ์ ์นด๋ฉ๋ผ ์ถ๋ ฅ | โ | โ |
ํ๋ซํผ ์ง์
์ด์ ์ฒด์ ํธํ์ฑ
| ํ๋ซํผ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| Windows x64 | โ | โ |
| Windows ARM64 | โ | โ |
| macOS(Apple Silicon + Intel) | โ | โ |
| Linux x64(Ubuntu, Debian, Fedora) | โ | โ |
| Linux ARM64(Raspberry Pi) | โ | โ |
| Android(.NET MAUI ๊ฒฝ์ ) | โ | โ |
| iOS(.NET MAUI ๊ฒฝ์ ) | โ | โ |
UI ํ๋ ์์ํฌ ํธํ์ฑ
| ํ๋ ์์ํฌ | Video Capture SDK | LibVLCSharp |
|---|---|---|
| WinForms | โ | โ (VideoView ์ปจํธ๋กค) |
| WPF | โ | โ (VideoView ์ปจํธ๋กค) |
| .NET MAUI | โ | โ (VideoView ์ปจํธ๋กค) |
| Avalonia UI | โ | โ (VideoView ์ปจํธ๋กค) |
| ์ฝ์/์๋น์ค | โ | โ |
| ASP.NET Core(๋ฐฑ๊ทธ๋ผ์ด๋ ์๋น์ค) | โ | โ ๏ธ(์ฌ์ ์งํฅ ์ค๊ณ) |
| Blazor(์๋ฒ ์ธก ์ฒ๋ฆฌ) | โ | โ ๏ธ(์ ํ๋ ์๋ฒ ์ธก ์บก์ฒ) |
๊ฐ๊ฒฉ ๋น๊ต
Video Capture SDK .NET ๊ฐ๊ฒฉ
๊ฐ๋ฐ์ 1๋ช , ์์ ์ ์ฌ์ฉ, 1๋ ์ ๋ฐ์ดํธ
์ต๋ 8๋ช ๊ฐ๋ฐ์, ์๊ตฌ ๋ผ์ด์ ์ค, ํ์ ์ ๋ฐ์ดํธ ํฌํจ
All licenses include:
- โ ๋ก์ดํฐ ๋ฌด๋ฃ ๋ฐฐํฌ
- โ ๋ชจ๋ ์์ค ์ฝ๋ ์์
- โ ์ฐ์ ํฐ์ผ ์ง์
- โ ๋ชจ๋ ํ๋ซํผ ํ๊ฒ ํฌํจ
LibVLCSharp ๋น์ฉ
LGPL 2.1 ๋ผ์ด์ ์ค โ ๋์ ๋งํฌ ํ์
๋ ์ ์ ์ ์ ๋งํฌ ๋๋ LGPL ๋นํธํ ์ฌ์ฉ
LGPL ์ค์ ๊ณ ๋ ค ์ฌํญ
LibVLCSharp์ libvlc๋ LGPL 2.1์ ๋ฐ๋ผ ๋ผ์ด์ ์ค๋ฉ๋๋ค. ์ด๋ LGPL ์กฐ๊ฑด์ ์ค์ํ๋ ํ ์์ ์ ๋ ์ ์ํํธ์จ์ด์์ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ฃผ์ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- โ libvlc์ ๋์ ์ผ๋ก ๋งํฌํด์ผ ํฉ๋๋ค(์ ์ ๋งํฌ ๋ถ๊ฐ)
- โ ์ฌ์ฉ์๊ฐ LGPL ๋ผ์ด์ ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ๋ ๋ฒ์ ์ผ๋ก ๊ต์ฒดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ผ ํฉ๋๋ค
- โ LGPL ๋ผ์ด์ ์ค ์ฌ๋ณธ์ ํฌํจํ๊ณ libvlc ์ฌ์ฉ์ ๋์ ๋๊ฒ ์ธ๊ธํด์ผ ํฉ๋๋ค
- โ libvlc ์์ฒด๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ํด๋น ์์ ์ฌํญ์ LGPL์ ๋ฐ๋ผ ๊ณต๊ฐํด์ผ ํฉ๋๋ค
- โ ์ ์ ๋งํฌ ๋๋ ํน์ ์๋ฒ ๋๋ ์๋๋ฆฌ์ค์๋ VideoLAN์ ์์ฉ ๋ผ์ด์ ์ค๊ฐ ํ์ํ ์ ์์ต๋๋ค
LGPL์ด GPL๋ณด๋ค ๋ ํ์ฉ์ ์ด์ง๋ง, ์ค์๋ฅผ ์ํด์๋ ๋งํฌ ๋ฐ ๋ฐฐํฌ ์๊ตฌ ์ฌํญ์ ๋ํ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ผ๋ถ ๊ธฐ์ ๋ฒ๋ฌดํ์ ์คํ ์์ค ์ค์ ์ํ์ ํผํ๊ธฐ ์ํด ์์ฉ ๋ผ์ด์ ์ค๋ฅผ ์๊ตฌํฉ๋๋ค.
์ฝ๋ ์์
์์ 1: ์น์บ ์ MP4๋ก ๋ นํ
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
// Create the capture engine (pass a VideoView UI control)
var capture = new VideoCaptureCore(videoView as IVideoView);
// Enumerate and set video source (first available webcam)
var devices = capture.Video_CaptureDevices();
capture.Video_CaptureDevice = new VideoCaptureSource(devices[0]);
// Set audio source
var audioDevices = capture.Audio_CaptureDevices();
capture.Audio_CaptureDevice = new AudioCaptureSource(audioDevices[0]);
// Configure MP4 output with default H.264/AAC settings
capture.Output_Format = new MP4Output();
capture.Output_Filename = "recording.mp4";
// Set mode: VideoCapture enables both recording and preview
capture.Mode = VideoCaptureMode.VideoCapture;
// Start recording
await capture.StartAsync();LibVLCSharp
C#using LibVLCSharp.Shared;
// Initialize VLC engine
Core.Initialize();
using var libVLC = new LibVLC();
using var mediaPlayer = new MediaPlayer(libVLC);
// Open webcam via dshow:// URL
// Note: device name must be known in advance
using var media = new Media(libVLC,
"dshow://",
FromType.FromLocation);
// Add recording via sout transcode chain
media.AddOption(
":sout=#transcode{" +
"vcodec=h264,vb=4000," +
"acodec=aac,ab=192" +
"}:duplicate{" +
"dst=std{access=file," +
"mux=mp4," +
"dst=recording.mp4}," +
"dst=display" +
"}");
// Set dshow device (string-based)
media.AddOption(
":dshow-vdev=Integrated Camera");
media.AddOption(
":dshow-adev=Microphone (Realtek Audio)");
// Start โ no typed API, errors in VLC log
mediaPlayer.Play(media);
// To stop: mediaPlayer.Stop();
// No progress events, no state machine์์ 2: ์ค๋ฒ๋ ์ด + ์คํธ๋ฆฌ๋ฐ์ด ํฌํจ๋ ํ๋ฉด ๋ นํ
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
using VisioForge.Core.Types.VideoEffects;
var capture = new VideoCaptureCore(videoView as IVideoView);
// Screen capture source (full screen, 30 fps, with cursor)
capture.Screen_Capture_Source = new ScreenCaptureSourceSettings
{
FullScreen = true,
FrameRate = new VideoFrameRate(30),
GrabMouseCursor = true
};
// Enable video effects pipeline
capture.Video_Effects_Enabled = true;
capture.Video_Effects_Clear();
// Add timestamp text overlay
capture.Video_Effects_Add(new VideoEffectTextLogo(true)
{
Text = "{timestamp}",
Left = 10,
Top = 10
});
// Add watermark image overlay
capture.Video_Effects_Add(new VideoEffectImageLogo(true)
{
Filename = "logo.png",
Left = 10,
Top = 50
});
// Record to file
capture.Output_Format = new MP4Output();
capture.Output_Filename = "screen.mp4";
capture.Mode = VideoCaptureMode.ScreenCapture;
// Also stream via RTMP (secondary output)
capture.Network_Streaming_Enabled = true;
capture.Network_Streaming_Format = NetworkStreamingFormat.RTMP_FFMPEG_EXE;
capture.Network_Streaming_URL = "rtmp://streaming-server/live/key";
await capture.StartAsync();LibVLCSharp
C#using LibVLCSharp.Shared;
Core.Initialize();
using var libVLC = new LibVLC();
using var mediaPlayer = new MediaPlayer(libVLC);
// Screen capture via screen:// URL
using var media = new Media(libVLC,
"screen://",
FromType.FromLocation);
// Configure screen capture
media.AddOption(":screen-fps=30");
media.AddOption(":screen-follow-mouse");
// Record to file via sout
// Note: No overlay support during capture
// Note: No text/image overlay API
media.AddOption(
":sout=#transcode{" +
"vcodec=h264,vb=8000" +
"}:std{" +
"access=file," +
"mux=mp4," +
"dst=screen.mp4" +
"}");
// Cannot simultaneously stream via RTMP
// sout duplicate is fragile and often fails
// for screen capture + streaming combos
// No overlay API โ cannot add timestamps
// No watermark support during capture
// No region selection for capture area
mediaPlayer.Play(media);์์ 3: ๋ค์ค ์ถ๋ ฅ: ๋ นํ + ์คํธ๋ฆผ + ๋ฏธ๋ฆฌ๋ณด๊ธฐ
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
var capture = new VideoCaptureCore(videoView as IVideoView);
// Set webcam source
var devices = capture.Video_CaptureDevices();
capture.Video_CaptureDevice = new VideoCaptureSource(devices[0]);
var audioDevices = capture.Audio_CaptureDevices();
capture.Audio_CaptureDevice = new AudioCaptureSource(audioDevices[0]);
// Primary output: MP4 recording
capture.Output_Format = new MP4Output();
capture.Output_Filename = "recording.mp4";
// Second output: RTMP stream
capture.Network_Streaming_Enabled = true;
capture.Network_Streaming_Format = NetworkStreamingFormat.RTMP_FFMPEG_EXE;
capture.Network_Streaming_URL = "rtmp://live.server/app/stream_key";
// Set mode and start โ preview + recording + stream run simultaneously
capture.Mode = VideoCaptureMode.VideoCapture;
await capture.StartAsync();LibVLCSharp
C#using LibVLCSharp.Shared;
Core.Initialize();
using var libVLC = new LibVLC();
using var mediaPlayer = new MediaPlayer(libVLC);
// Open webcam
using var media = new Media(libVLC,
"dshow://",
FromType.FromLocation);
media.AddOption(
":dshow-vdev=Integrated Camera");
// Attempt multi-output via sout duplicate
// WARNING: This is fragile and often fails
media.AddOption(
":sout=#transcode{" +
"vcodec=h264,vb=4000," +
"acodec=aac,ab=192" +
"}:duplicate{" +
"dst=std{access=file," +
"mux=mp4," +
"dst=recording.mp4}," +
"dst=std{access=rtmp," +
"mux=flv," +
"dst=rtmp://live.server/app/key}," +
"dst=display" +
"}");
// No independent bitrate per output
// No low-res backup option
// Single transcode shared across all outputs
// If one output fails, all may fail
// No typed API โ string errors at runtime
mediaPlayer.Play(media);์์ 4: ๊ฐ์ง๊ฐ ํฌํจ๋ RTSP IP ์นด๋ฉ๋ผ ๊ฐ์
Video Capture SDK .NET
C#using VisioForge.Core.VideoCapture;
using VisioForge.Core.Types;
using VisioForge.Core.Types.Output;
using VisioForge.Core.Types.VideoCapture;
using VisioForge.Core.Types.VideoProcessing;
var cameras = new List<VideoCaptureCore>();
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
foreach (var url in cameraUrls)
{
var cam = new VideoCaptureCore();
cam.IP_Camera_Source = new IPCameraSourceSettings
{
URL = new Uri(url),
Type = IPSourceEngine.Auto_LAV
};
// Motion detection
cam.Motion_Detection = new MotionDetectionSettings { Enabled = true };
cam.OnMotion += (s, e) =>
{
Console.WriteLine($"Motion on {url}");
};
// Barcode detection
cam.Barcode_Reader_Enabled = true;
cam.OnBarcodeDetected += (s, e) =>
{
Console.WriteLine($"Barcode: {e.Value}");
};
// Segmented recording (split file every hour)
cam.Output_Format = new MP4Output();
cam.Output_Filename = $"cam_{cameras.Count}.mp4";
cam.SeparateCapture_Enabled = true;
cam.SeparateCapture_TimeThreshold = TimeSpan.FromHours(1);
cam.Mode = VideoCaptureMode.IPCapture;
cameras.Add(cam);
}
foreach (var cam in cameras)
await cam.StartAsync();LibVLCSharp
C#using LibVLCSharp.Shared;
Core.Initialize();
using var libVLC = new LibVLC();
var cameraUrls = new[]
{
"rtsp://192.168.1.101/stream",
"rtsp://192.168.1.102/stream",
"rtsp://192.168.1.103/stream",
"rtsp://192.168.1.104/stream"
};
var players = new List<MediaPlayer>();
foreach (var url in cameraUrls)
{
var player = new MediaPlayer(libVLC);
var media = new Media(libVLC, url,
FromType.FromLocation);
// Record via sout
media.AddOption(
":sout=#transcode{vcodec=h264,vb=2000}" +
":std{access=file,mux=mp4," +
$"dst=cam_{players.Count}.mp4}}");
// No motion detection โ not available
// No barcode detection โ not available
// No face detection โ not available
// No auto-reconnection on stream failure
// No segmented recording support
// Must implement reconnection manually:
player.EndReached += (s, e) =>
{
// Manual reconnect attempt
// ThreadPool.QueueUserWorkItem(_ =>
// player.Play(media));
};
player.Play(media);
players.Add(player);
}
// No event-driven detection
// No managed surveillance features
// Manual process monitoring required๊ฐ ์๋ฃจ์ ์ ์ ํํด์ผ ํ ๋
๋ค์์ด ํ์ํ ๋ Video Capture SDK ์ ํ
- โ์ค์๊ฐ ๋น๋์ค ํจ๊ณผ์ ์ค๋ฒ๋ ์ด๊ฐ ํฌํจ๋ ์ ๋ฌธ์ ์บก์ฒ
- โ๋จ์ผ ํ์ดํ๋ผ์ธ์์์ ๋ค์ค ์ถ๋ ฅ ๋ นํ + ์คํธ๋ฆฌ๋ฐ
- โ๋ชจ์ , ์ผ๊ตด ๋ฐ ๋ฐ์ฝ๋ ๊ฐ์ง๊ฐ ํฌํจ๋ ๊ฐ์ ์์คํ
- โ์บก์ฒ ์ค ์ค์๊ฐ ์ค๋์ค ํจ๊ณผ(40๊ฐ ์ด์)
- โ๋ฐฉ์ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ฐ์ ์นด๋ฉ๋ผ ์ถ๋ ฅ
- โ์ฐ์ ์ฉ ๋ฐ ์ ๋ฌธ ํ๋์จ์ด ์ง์(DeckLink, GigE Vision)
- โ์บก์ฒ ์ค PiP ๋ฐ ํฌ๋ก๋ง ํค ํฉ์ฑ
- โ์์ญ ์ ํ๊ณผ ์ค๋ฒ๋ ์ด๊ฐ ํฌํจ๋ ํ๋ฉด ๋ นํ
- โ๋ฌธ์์ด ๊ธฐ๋ฐ ๊ตฌ์ฑ ์๋ ์์ ํ ํ์ ํ๋ .NET API
๋ค์์ด ํ์ํ ๋ LibVLCSharp ์ ํ
- โ๊ธฐ๋ณธ ์บก์ฒ ์ฅ์น ์ ๊ทผ์ด ํฌํจ๋ ๋ฏธ๋์ด ์ฌ์
- โLGPL ์ค์๊ฐ ํ์ฉ๋๋ ๋ฌด์์ฐ ํ๋ก์ ํธ
- โํจ๊ณผ๋ ๊ฐ์ง ์๋ ๊ฐ๋จํ ์น์บ ๋ นํ
- โ.NET MAUI ์ ํ๋ฆฌ์ผ์ด์ ์์์ ํฌ๋ก์ค ํ๋ซํผ ๋ฏธ๋์ด ์ฌ์
- โ์ด๋ฏธ VLC ์ธํ๋ผ์ ์ํฌํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ
- โLGPL ๋ผ์ด์ ์ค์ ํธํ๋๋ ์คํ ์์ค ํ๋ก์ ํธ
- โ๊ธฐ๋ณธ ๋น๋์ค ์บก์ฒ ๊ธฐ๋ฅ์ ์ํ ๋น ๋ฅธ ํ๋กํ ํ์
- โ์ฌ์์ด ์ฃผ์ด๊ณ ์บก์ฒ๊ฐ ๋ถ์ฐจ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ ๋ฐ ๋ฐฐํฌ
Video Capture SDK ๋ฐฐํฌ
- โNuGet ํจํค์ง์ ๋ชจ๋ ๋ค์ดํฐ๋ธ ์ข ์์ฑ ํฌํจ
- โ๋จ์ผ NuGet ์ฐธ์กฐ โ ์ธ๋ถ ๋๊ตฌ ์ค์น ๋ถํ์
- โ์์ ๋ผ์ด์ ์ค๋ก ๋ก์ดํฐ ๋ฌด๋ฃ ์ฌ๋ฐฐํฌ
- โxcopy / MSIX / ClickOnce ๋ฐฐํฌ ์ง์
- โDocker ์ปจํ ์ด๋ ์ง์(Linux ๋ฐ Windows)
- โLGPL ์๋ฌด ์์ โ ๋ ์ ์ํํธ์จ์ด์ ์์
LibVLCSharp ๋ฐฐํฌ
- โ NuGet ํจํค์ง ์ฌ์ฉ ๊ฐ๋ฅ(LibVLCSharp + VideoLAN.LibVLC ํ๋ซํผ ํจํค์ง)
- โ ํ๋ซํผ๋ณ VLC ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๋ค ํ์(์ฝ 80-150 MB)
- โ LGPL ์ค์์๋ ๋์ ๋งํฌ ๋ฐ ๋ผ์ด์ ์ค ๊ณ ์ง ํ์
- โ ์ฌ์ฉ์๊ฐ libvlc ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ต์ฒดํ ์ ์๋ ๋ฉ์ปค๋์ฆ ์ ๊ณต ํ์
- โ ํ๋ซํผ ํจํค์ง๊ฐ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ ์ฒ๋ฆฌ
- โ ์ ์ ๋งํฌ์๋ VideoLAN ์์ฉ ๋ผ์ด์ ์ค ํ์
๊ฒฐ์ ๋งคํธ๋ฆญ์ค
| ์๊ตฌ ์ฌํญ | Video Capture SDK | LibVLCSharp | ์น์ |
|---|---|---|---|
| ์ ๋ฌธ์ ์บก์ฒ ์ ํ๋ฆฌ์ผ์ด์ | Video Capture SDK | ||
| ๋ค์ค ์ถ๋ ฅ(๋ นํ + ์คํธ๋ฆผ) | Video Capture SDK | ||
| ๊ฐ์ง๊ฐ ํฌํจ๋ ๊ฐ์ | Video Capture SDK | ||
| ์บก์ฒ ์ค ์ค์๊ฐ ํจ๊ณผ | Video Capture SDK | ||
| ๊ฐ์ ์นด๋ฉ๋ผ ์ถ๋ ฅ | Video Capture SDK | ||
| ์ฐ์ ์ฉ/์ ๋ฌธ ํ๋์จ์ด | Video Capture SDK | ||
| PiP/ํฌ๋ก๋ง ํค ํฉ์ฑ | Video Capture SDK | ||
| ์บก์ฒ ์ค 40๊ฐ ์ด์์ ์ค๋์ค ํจ๊ณผ | Video Capture SDK | ||
| ์ค๋ฒ๋ ์ด๊ฐ ํฌํจ๋ ํ๋ฉด ๋ นํ | Video Capture SDK | ||
| ์์ฐ $0(์คํ ์์ค) | LibVLCSharp | ||
| ๊ฐ๋จํ ์น์บ ๋ นํ | LibVLCSharp | ||
| LGPL ํธํ ํ๋ก์ ํธ | LibVLCSharp |
๊ฒฐ๋ก
Video Capture SDK .NET
Video Capture SDK๋ ์ ๋ฌธ์ ์ธ ๋น๋์ค ์บก์ฒ ์ํฌํ๋ก์ฐ์ ๋ฐ์ด๋ ์ ์ฉ ์บก์ฒ ์์ง์ ๋๋ค. ํ์ ํ๋ .NET API, ๋ด์ฅ ํจ๊ณผ ํ์ดํ๋ผ์ธ, ๋ค์ค ์ถ๋ ฅ ์ํคํ ์ฒ, ๊ฐ์ง ๊ธฐ๋ฅ, ์ ๋ฌธ ํ๋์จ์ด ์ง์์ผ๋ก ์บก์ฒ ํ์ง๊ณผ ๊ธฐ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์คํ ์ ํ์ ๋๋ค. ์์ฉ ๋ผ์ด์ ์ค๋ ๊ธฐ์ ๋ฐฐํฌ๋ฅผ ์ํ ๊นจ๋ํ ์ง์ ์ฌ์ฐ๊ถ์ ๋ณด์ฅํฉ๋๋ค.
LibVLCSharp
LibVLCSharp๋ ์บก์ฒ ์ฅ์น๋ ์ด ์ ์๋ ํ๋ฅญํ ๋ฏธ๋์ด ์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฃผ๋ก ์ฌ์์ ์ด์ ์ ๋ง์ถ๊ณ ๊ฐ๋ ๊ฐ๋จํ ๋ นํ๋ฅผ ํ๋ ๊ฒฝ์ฐ, LibVLCSharp๋ ์ ๋ฅํ๊ณ ๋ฌด๋ฃ์ธ ์ต์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์์ด ๊ธฐ๋ฐ sout ๊ตฌ์ฑ, ์ค์๊ฐ ํจ๊ณผ ๋ถ์ฌ, ๊ฐ์ง ๊ธฐ๋ฅ ๋ถ์ฌ๋ ์ ๋ฌธ์ ์ธ ์บก์ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํจ์ฌ ๋ ๋ง์ ๋ง์ถค ๊ฐ๋ฐ์ ํ์๋ก ํ๊ฑฐ๋ LibVLCSharp๋ง์ผ๋ก๋ ๊ตฌ์ถํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
The Reality
์บก์ฒ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋๋ถ๋ถ์ .NET ๊ฐ๋ฐ์์๊ฒ Video Capture SDK๋ LibVLCSharp๊ฐ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์ง ์์ ์ ๋ฌธ๊ฐ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. LibVLCSharp๋ ์ฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์ ๋น๋๋ฉฐ ์์ฐ์ด ์ฃผ์ ์ ์ฝ์ธ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ์บก์ฒ์ ํฉ๋ฆฌ์ ์ธ ์ ํ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ๊ณผ, ๊ฐ์ง, ๋ค์ค ์ถ๋ ฅ ๋๋ ์ ๋ฌธ ํ๋์จ์ด ์ง์์ด ํ์ํ๋ค๋ฉด Video Capture SDK๊ฐ ์ค์ฉ์ ์ธ ์ ํ์ ๋๋ค.
