Turn your Android phone into a wireless webcam — streamed over SRT directly to your PC as a virtual camera device.
Android Phone PC
┌──────────────────┐ ┌──────────────────────┐
│ MoblCam App │ │ receiver.py │
│ (SRT Caller) │ ──Wi-Fi/USB─► │ (SRT Listener) │
│ │ │ FFmpeg → pyvirtualcam│
└──────────────────┘ └──────────────────────┘
↕ mDNS auto-discovery (_moblcam._udp)
- The Android app captures video/audio and broadcasts itself via mDNS (Network Service Discovery).
- The PC receiver script discovers the phone automatically on the local network using Zeroconf.
- Video is streamed over SRT (Secure Reliable Transport) for low-latency, reliable delivery.
- The PC script pipes the stream through FFmpeg into a virtual camera device, making it available to any app (OBS, Zoom, Teams, etc.).
- Android 7.0 (API 24) or higher
- Camera and microphone permissions
- On the same Wi-Fi network as the PC (or connected via USB tethering)
- Python 3.x
- FFmpeg installed and available on your system
PATH- Download: https://ffmpeg.org/download.html
- A virtual camera driver:
- Windows: OBS Virtual Camera or Unity Capture
- Linux:
v4l2loopbackkernel module - macOS: OBS Virtual Camera
Install dependencies:
cd pc_utility
pip install -r requirements.txtRun the receiver:
python receiver.pyThe script will search the local network for MoblCam and connect automatically once the app starts streaming.
Build and install the app via Android Studio, or sideload the APK.
- Open MoblCam on your phone.
- Grant Camera and Microphone permissions when prompted.
- Press Start Streaming.
The app will:
- Begin broadcasting video over SRT on port
5000 - Register itself on the local network via mDNS so the PC can find it automatically
| Feature | Details |
|---|---|
| Protocol | SRT (Secure Reliable Transport) — low-latency, loss-resilient |
| Auto-discovery | mDNS / DNS-SD — no manual IP configuration needed |
| Adaptive Bitrate | Adjusts encoding bitrate based on Wi-Fi signal strength |
| Wired support | Detects USB/Ethernet connection and forces 20 Mbps |
| Flash toggle | Enable/disable the phone torch while streaming |
| Zoom control | In-app slider for 1×–5× zoom |
| Default resolution | 1080p @ 30 fps |
| Virtual camera output | Appears as a webcam in OBS, Zoom, Teams, etc. |
| Wi-Fi Signal (RSSI) | Target Bitrate |
|---|---|
| > -50 dBm (Excellent) | 15 Mbps |
| > -60 dBm (Good) | 10 Mbps |
| > -70 dBm (Fair) | 5 Mbps |
| ≤ -70 dBm (Poor) | 2 Mbps |
| Wired (USB/Ethernet) | 20 Mbps |
moblcam/
├── app/ # Android application
│ └── src/main/
│ ├── AndroidManifest.xml
│ └── java/com/example/moblcam/
│ ├── MainActivity.kt # App entry point
│ ├── CameraScreen.kt # Main UI (Jetpack Compose)
│ └── network/
│ ├── StreamManager.kt # SRT camera stream control
│ ├── NsdHelper.kt # mDNS service registration
│ └── AdaptiveBitrateController.kt # Wi-Fi-aware bitrate tuning
│
└── pc_utility/ # Python PC receiver
├── receiver.py # Auto-discovers phone & outputs virtual camera
└── requirements.txt # Python dependencies
| Library | Purpose |
|---|---|
| Jetpack Compose + Material 3 | UI framework |
| CameraX | Camera hardware access |
| RootEncoder | SRT streaming engine |
| Accompanist Permissions | Runtime permission handling |
| Package | Purpose |
|---|---|
zeroconf |
mDNS discovery to find the phone |
pyvirtualcam |
Feed frames into a virtual camera device |
opencv-python |
Frame processing utilities |
ffmpeg (system) |
Decode SRT stream to raw frames |
| Permission | Reason |
|---|---|
CAMERA |
Capture video |
RECORD_AUDIO |
Capture audio |
INTERNET |
Stream over the network |
ACCESS_NETWORK_STATE |
Detect network type for ABR |
ACCESS_WIFI_STATE |
Read Wi-Fi RSSI for ABR |