Turn any RTSP or MJPEG IP camera into a virtual webcam β no drivers, no admin rights required.
vCamService ingests live streams from network cameras and re-exposes them as a standard Windows webcam device. Once running, open Zoom, Teams, OBS, Slack, Google Meet, or any other app and simply select "vCamService Camera" from the camera picker β exactly as you would a physical webcam.
Who is this for? Security camera owners, home-lab enthusiasts, streamers, and anyone who wants to route an IP camera feed into video call software without buying dedicated hardware or dealing with kernel drivers.
- π₯ RTSP & MJPEG support β H.264, H.265, and MJPEG streams from any IP camera
- πͺ Zero-driver virtual camera β uses the Windows 11
MFCreateVirtualCameraAPI; registers per-user under HKCU, no elevation needed - π Automatic reconnection β exponential backoff with jitter; streams recover silently after network interruption
- πΌοΈ Live preview β 10 fps in-app preview of the active stream
- ποΈ Multiple stream profiles β configure as many cameras as you like, switch the active feed in one click
- π‘ RTSP transport selection β TCP or UDP per stream (TCP default for firewall-friendly operation)
- π System tray β minimize to tray; full control from the tray icon
- π Status bar β real-time CPU and memory readout
- πΎ Persistent config β streams and preferences saved to
%AppData%\vCamService\config.json - π Structured logging β rolling daily logs via Serilog
- π¦ MSI installer β single self-contained executable, no .NET install required on the target machine
Screenshots coming soon. The UI features a stream list, live preview panel, and status bar β all in a clean WPF window with system-tray support.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β vCamService _ β‘ β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Streams β Preview β
β βββββββββββββββββββββββ β βββββββββββββββββββ β
β β β Front Door [βΆ] β β β β β
β β Back Yard [βΆ] β β β Live preview β β
β β + Add streamβ¦ β β β β β
β βββββββββββββββββββββββ β βββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π’ Camera: vCamService Camera β CPU 2% RAM 38 MB β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Requirement | Minimum |
|---|---|
| OS | Windows 11 version 22H2 (build 22621) or later |
| .NET runtime | .NET 8 β bundled in the MSI (self-contained) |
| FFmpeg | Must be on PATH β install with winget install ffmpeg |
β οΈ Windows 11 22H2+ is a hard requirement. TheMFCreateVirtualCameraAPI used to create user-mode virtual cameras was introduced in that release and is not available on Windows 10 or earlier Windows 11 builds.
- Download
vCamService-Setup.msifrom the Releases page. - Run the installer β no elevation needed, installs per-user.
- Install FFmpeg if you haven't already:
winget install ffmpeg
- Launch vCamService from the Start Menu.
See Building from Source below.
Click "+ Add streamβ¦" and fill in:
| Field | Description |
|---|---|
| Name | Friendly label, e.g. Front Door |
| URL | Full stream URL, e.g. rtsp://192.168.1.100:554/stream1 or http://192.168.1.101/video |
| Protocol | rtsp or mjpeg |
| Resolution / FPS | Target decode resolution (default 1280 Γ 720 @ 30 fps) |
| RTSP transport | tcp (recommended) or udp |
Click the βΆ button next to any stream to make it the active source feeding the virtual camera. The status bar turns green and shows "vCamService Camera".
Open Zoom, Teams, OBS, or any webcam-aware application. In the camera selector, choose:
vCamService Camera
That's it β the live feed from your IP camera will appear.
Close the window to minimize to the system tray. The virtual camera keeps running. Right-click the tray icon to restore, switch streams, or exit.
vCamService is structured as three projects with a clear layering boundary:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β vCamService.App β
β βββββββββββββββ ββββββββββββββββββ βββββββββββββββ β
β β WPF UI β β AppOrchestratorβ β TrayIcon β β
β β (MVVM) β β + DI Host β β Service β β
β ββββββββ¬βββββββ βββββββββ¬βββββββββ βββββββββββββββ β
βββββββββββΌββββββββββββββββββΌββββββββββββββββββββββββββββ
β β
βββββββββββΌββββββββββββββββββΌββββββββββββββββββββββββββββ
β vCamService.Core β
β βββββββββββββ βββββββββββββ ββββββββββββββββββββββ β
β βStreamReaderβ βFrameBufferβ β ReconnectManager β β
β β(FFmpeg sub)β β(overwrite)β β (exp. backoff) β β
β βββββββββββββ βββββββββββββ ββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββΌββββββββββββββββββββββββββββββββββββββββββββ
β vCamService.VCam β
β ββββββββββββββββββββ ββββββββββββββββββββββββββ β
β βVirtualCameraSourceβ β VirtualCameraManager β β
β β(IMFMediaSource) β β (MFCreateVirtualCamera)β β
β ββββββββββββββββββββ ββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Project | Role |
|---|---|
vCamService.Core |
Protocol-agnostic stream decoding (FFmpeg subprocess β raw BGRA frames), config persistence, and reconnection logic. No UI, no Windows-specific APIs. |
vCamService.VCam |
Wraps the Windows Media Foundation MFCreateVirtualCamera COM API. Exposes VirtualCameraManager (start/stop/send-frame) and VirtualCameraSource (the IMFMediaSource implementation). Contains 18 hand-written COM interface definitions and P/Invoke declarations. |
vCamService.App |
WPF + MVVM shell. Hosts the DI container (Microsoft.Extensions.Hosting), AppOrchestrator, tray icon, and resource monitor. |
| Thread | Role |
|---|---|
| Main thread | WPF dispatcher β all UI mutations |
| Thread R1β¦RN | One StreamReader per configured stream; reads FFmpeg stdout and writes BGRA frames to its FrameBuffer |
| Thread F | Frame feeder β reads the active FrameBuffer and pushes frames to VirtualCameraManager at the configured FPS |
| Timer T | Preview refresh β DispatcherTimer at 10 fps on the UI thread |
| Timer S | Status bar β CPU/RAM refresh every 2 seconds |
IP Camera
β (RTSP / MJPEG / TCP / UDP)
βΌ
FFmpeg subprocess
β stdout: raw BGRA bytes (width Γ height Γ 4)
βΌ
FrameBuffer (lock-free overwrite β always newest frame)
βΌ
Frame feeder thread (@ VCamFps)
βΌ
VirtualCameraManager.SendFrame()
βΌ
IMFVirtualCamera (Windows Media Foundation session camera)
βΌ
Zoom / Teams / OBS / any webcam consumer
BGRA is used throughout: FFmpeg outputs it directly (-pix_fmt bgra), Media Foundation consumes it natively, and WPF renders it without conversion.
- .NET 8 SDK
- Windows 11 22H2+ for running/testing (compilation works on macOS/Linux)
- WiX Toolset v4 for building the MSI (Windows only)
# Clone
git clone https://github.com/your-username/vCamService.git
cd vCamService
# Build all projects
dotnet build
# Run tests (25 tests: 18 Core + 7 VCam)
dotnet testRun on Windows. The script publishes a self-contained win-x64 single-file executable, then invokes WiX to produce the MSI.
.\build-installer.ps1 -Version "1.2.0"Output: src/vCamService.Installer/bin/Release/vCamService-Setup.msi
| Parameter | Default | Description |
|---|---|---|
-Version |
1.0.0 |
Product version embedded in the MSI |
-Configuration |
Release |
Build configuration |
The published app is
--self-contained true -r win-x64 -p:PublishSingleFile=true, so no separate .NET runtime installation is required on the target machine.
Config is stored at %AppData%\vCamService\config.json and written on every change.
The file is created automatically on first run.
| Setting | Default | Notes |
|---|---|---|
vCamWidth / vCamHeight |
1280 / 720 |
Output resolution of the virtual camera device |
vCamFps |
30 |
Frame rate fed to Media Foundation |
minimizeToTray |
true |
Window close sends to tray instead of exiting |
rtspTransport |
"tcp" |
Use "udp" only if TCP causes issues; UDP is faster but drops frames behind NAT |
enabled |
true |
Disabled streams are skipped at startup |
Logs are written to:
%AppData%\vCamService\logs\vcamservice-YYYYMMDD.log
- Rolling daily files β one file per calendar day
- Old log files are retained according to Serilog's default retention policy
- Log level:
Informationin Release builds; increase toDebugorVerboseby modifying the Serilog configuration inApp.xaml.cs
Typical log entries:
[12:01:05 INF] AppOrchestrator started. Active stream: Front Door
[12:01:05 INF] StreamReader started: rtsp://192.168.1.100:554/stream1
[12:01:05 INF] VirtualCameraManager started (1280x720 @ 30fps)
[12:03:42 WRN] StreamReader lost connection; reconnecting in 2.1s (attempt 1)
[12:03:44 INF] StreamReader reconnected successfully
| Limitation | Detail |
|---|---|
| Windows 11 22H2+ only | MFCreateVirtualCamera is not available on Windows 10 or earlier Windows 11 builds (pre-22621). There is no planned workaround. |
| FFmpeg required | FFmpeg must be installed separately and available on PATH. The app checks for it at startup via ffmpeg -version and shows instructions if not found. |
| No audio | The virtual camera is video-only. Audio from IP cameras is not captured or forwarded. |
| Single virtual camera | Only one virtual device is created (vCamService Camera). Multiple simultaneous outputs are not supported. |
| Session lifetime | The virtual camera device exists only while the app is running. It is registered fresh on each launch under HKCU (no permanent driver installation). |
| x64 only | Published as win-x64. ARM64 Windows is untested. |
Contributions are welcome! A few guidelines:
- Bug reports β open an issue with the log file attached (
%AppData%\vCamService\logs\) - Pull requests β keep changes focused; one concern per PR
- New stream protocols β implement
IStreamReaderinvCamService.Coreand wire up inAppOrchestrator - Tests β add tests under
tests/for any new Core or VCam logic
vCamService.sln
βββ src/
β βββ vCamService.Core/ β stream logic, models, config (testable, no UI)
β βββ vCamService.VCam/ β Media Foundation COM layer
β βββ vCamService.App/ β WPF UI shell
β βββ vCamService.Installer/ β WiX v4 MSI
βββ tests/
βββ vCamService.Core.Tests/ β 18 unit tests
βββ vCamService.VCam.Tests/ β 7 unit tests
This project is licensed under the MIT License β see the LICENSE file for details.
Built with β€οΈ using .NET 8, Windows Media Foundation, and FFmpeg.
{ "configVersion": 1, // ID of the stream currently feeding the virtual camera (null = none active) "activeStreamId": "a1b2c3d4-...", // Virtual camera output resolution and frame rate "vCamWidth": 1280, "vCamHeight": 720, "vCamFps": 30, // Minimize to system tray on window close "minimizeToTray": true, "streams": [ { // Auto-generated UUID β do not edit "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "name": "Front Door", "url": "rtsp://192.168.1.100:554/stream1", // "rtsp" or "mjpeg" "protocol": "rtsp", // Requested decode resolution (FFmpeg will scale if needed) "width": 1280, "height": 720, "fps": 30, // RTSP only: "tcp" (recommended) or "udp" "rtspTransport": "tcp", // Set false to keep the stream configured but prevent it from starting "enabled": true } ] }