A native macOS application that creates virtual cameras from GigE Vision industrial cameras, making them available to any macOS application (Zoom, Teams, OBS, QuickTime, Photo Booth, etc.).
- System Extension Architecture: Implements a proper CMIO System Extension for virtual camera functionality
- Native macOS Integration: Appears as a standard camera in all macOS apps
- Universal GigE Support: Works with any GigE Vision compliant camera via Aravis library
- Real-time Preview: Built-in preview with camera status and controls
- Professional Features: Designed for industrial and professional camera integration
- Notarized & Signed: Properly signed with Developer ID for secure distribution
- macOS 12.3 (Monterey) or later
- ARM64 (Apple Silicon) Mac
- GigE Vision compliant camera on the same network
- System Extension approval (first launch only)
-
Download the DMG
- Go to the Releases page
- Download the latest
GigEVirtualCamera-vX.X.X.dmgfile - The app is fully signed and notarized by Apple
-
Install the Application
- Double-click the downloaded DMG file to open it
- Drag
GigEVirtualCamera.appinto yourApplicationsfolder - Eject the DMG
-
First Launch
- Open the
Applicationsfolder - Double-click
GigEVirtualCamera.appto launch - If you see a warning about an unidentified developer (shouldn't happen with notarization), right-click the app and select "Open"
- Open the
-
Grant System Extension Permission
⚠️ ImportantWhen you first launch the app, macOS will display a notification:
"System Extension Blocked" A program tried to load new system extension(s) signed by "Luke Chang"
To approve the extension:
- Click on the notification, or go to System Settings (System Preferences on older macOS)
- Navigate to Privacy & Security
- Scroll down to the Security section
- You'll see a message: "System software from developer 'Luke Chang' was blocked from loading"
- Click the "Allow" button next to this message
- Enter your administrator password if prompted
- Restart the app after approving
-
Grant Camera Permissions
The app needs permission to access your GigE cameras:
- Go to System Settings → Privacy & Security → Camera
- Find GigEVirtualCamera in the list
- Toggle it ON to grant camera access
-
Verify Installation
After granting permissions, the virtual camera extension should be active:
systemextensionsctl list
You should see an entry for
com.lukechang.GigEVirtualCamera.Extension
System Extension not appearing:
- Make sure you clicked "Allow" in System Settings → Privacy & Security
- Try restarting your Mac after allowing the extension
- Check the logs:
log stream --predicate 'subsystem == "com.lukechang.GigEVirtualCamera"'
"App is damaged" error:
- The app should be notarized, so this shouldn't happen
- If it does, verify the download wasn't corrupted
- Try downloading again from the official releases page
Permission dialogs not appearing:
- Launch the app from Applications folder (not from the DMG)
- Check System Settings → Privacy & Security manually
- Restart the app after granting permissions
Prerequisites:
- macOS 12.3+ (Apple Silicon recommended)
- Xcode 15.0+
- Homebrew
Quick Start:
# Clone the repository
git clone https://github.com/ljchang/hyperstudy-gige.git
cd hyperstudy-gige
# Install dependencies
brew install aravis
# Open in Xcode
open GigEVirtualCamera.xcodeproj
# Build and run (Cmd+R)The project will build with default settings. For development, code signing is handled automatically by Xcode.
Detailed Build Instructions:
See BUILDING.md for comprehensive information on:
- Environment configuration
- Code signing for distribution
- Building release versions
- Troubleshooting build issues
- Project architecture
Project Structure:
GigEVirtualCamera.xcodeproj # Main Xcode project
├── GigECameraApp/ # Main application (SwiftUI)
├── GigEVirtualCameraExtension/# System extension (CMIO provider)
├── Shared/ # Shared code and Aravis bridge
├── Scripts/ # Build and distribution scripts
└── Resources/ # Assets and licenses
Key Files:
Shared/AravisBridge/- Objective-C++ wrapper for Aravis GigE libraryShared/CameraManager.swift- Camera discovery and managementGigECameraApp/ContentView.swift- Main UIGigEVirtualCameraExtension/ExtensionProvider.swift- Virtual camera implementation
Development Tips:
-
Testing Without a GigE Camera:
- Use the built-in "Test Camera (Aravis Simulator)"
- No physical hardware required for basic testing
-
Debugging the Extension:
# View extension logs log stream --predicate 'subsystem == "com.lukechang.GigEVirtualCamera"' # Check extension status systemextensionsctl list
-
Testing Virtual Camera:
- Use QuickTime Player for quick verification
- Check
system_profiler SPCameraDataTypeto see if camera is registered
# Build debug version
xcodebuild -project GigEVirtualCamera.xcodeproj \
-scheme GigEVirtualCamera \
-configuration Debug \
build
# Test in QuickTime
open -a "QuickTime Player"
# File → New Movie Recording → Select "GigE Virtual Camera"The project uses GitHub Actions for automated builds and releases:
Automated Release Process:
- Push a version tag:
git tag v1.0.0 && git push origin v1.0.0 - GitHub Actions automatically:
- Builds Release configuration
- Signs with Developer ID
- Notarizes with Apple
- Creates DMG installer
- Publishes GitHub Release
Workflow Configuration:
- File:
.github/workflows/build-and-release.yml - Runner: macOS 14 (Apple Silicon)
- Secrets: See SECRETS_SETUP.md
For Maintainers:
To set up CI/CD secrets for your own fork:
- Follow instructions in SECRETS_SETUP.md
- Configure GitHub repository secrets
- Test with a version tag
We welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes (follow Swift style guidelines)
- Test thoroughly (including with real GigE cameras if possible)
- Submit a Pull Request
Read CONTRIBUTING.md for:
- Coding standards
- Testing requirements
- Pull request guidelines
- Development best practices
Good First Issues:
- Look for issues tagged
good first issue - Documentation improvements
- Adding support for new pixel formats
- UI enhancements
System Extension Architecture:
┌─────────────────────────────────────────────────────┐
│ GigE Camera (Network) │
└────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Aravis Library (C++) │
│ ├─ Camera Discovery │
│ ├─ Frame Acquisition │
│ └─ Protocol Handling │
└────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ AravisBridge (Objective-C++) │
│ └─ C++ to Swift Bridge │
└────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ Main App (GigECameraApp) │
│ ├─ SwiftUI Interface │
│ ├─ Camera Management │
│ ├─ Preview Display │
│ └─ Frame Sender │
└────────────┬────────────────────────────────────────┘
│ (XPC / CMIO Sink)
▼
┌─────────────────────────────────────────────────────┐
│ System Extension (GigEVirtualCameraExtension) │
│ ├─ CMIO Extension Provider │
│ ├─ Virtual Camera Device │
│ └─ Frame Stream Management │
└────────────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────┐
│ macOS Camera System │
│ └─ Available to all apps (Zoom, QuickTime, etc.) │
└─────────────────────────────────────────────────────┘
Key Technologies:
- CMIO (Core Media I/O): macOS camera extension framework
- System Extensions: Privileged extension architecture
- Aravis: GigE Vision camera library
- SwiftUI: Modern declarative UI framework
- XPC: Inter-process communication
Documentation:
- BUILDING.md - Detailed build instructions
- CONTRIBUTING.md - Contribution guidelines
- SECRETS_SETUP.md - CI/CD setup for maintainers
- CLAUDE.md - Developer commands and tips
Apple Documentation:
External Libraries:
- Aravis Project - GigE Vision implementation
- GigE Vision Standard - Protocol specification
-
Launch GigEVirtualCamera
- Open from your Applications folder
- The app window shows camera controls and preview
-
Connect to a GigE Camera
Option A: Automatic Discovery
- Your GigE Vision cameras on the network will appear in the dropdown menu
- Select your camera from the list
- Click "Connect" button
- The app will establish connection and start streaming
Option B: Using Test Camera
- Select "Test Camera (Aravis Simulator)" from dropdown
- This is useful for testing without a physical camera
- Click "Connect" to start the simulated feed
-
Start Streaming
- Once connected, the preview window shows the camera feed
- The virtual camera is now active and available system-wide
- You should see frame rate and status information
The virtual camera appears as "GigE Virtual Camera" in all macOS applications:
QuickTime Player:
- Open QuickTime Player
- File → New Movie Recording
- Click the dropdown arrow next to the record button
- Select "GigE Virtual Camera"
- Your GigE camera feed appears in QuickTime
Zoom / Teams / Google Meet:
- Open your video conferencing app
- Go to video settings
- Select "GigE Virtual Camera" as your camera source
- Your GigE camera feed is now your video source
OBS Studio:
- Add a new Video Capture Device source
- Select "GigE Virtual Camera" from device list
- Your GigE camera feed appears in OBS
Photo Booth / FaceTime:
- Simply open the app
- Go to camera selection
- Choose "GigE Virtual Camera"
The app provides basic camera controls:
- Connect/Disconnect: Establish or close connection to camera
- Start/Stop Streaming: Begin or pause frame streaming
- Frame Rate Display: Shows current FPS
- Status Indicator: Shows connection and streaming status
For physical GigE Vision cameras:
-
Network Setup
- Camera must be on the same network as your Mac
- Use wired Ethernet connection for best performance
- Configure camera IP (DHCP or static)
-
Firewall Settings
- GigE Vision uses UDP port 3956
- Ensure macOS firewall allows GigEVirtualCamera
- System Settings → Network → Firewall → Options
-
Test Camera Detection
# Install Aravis tools brew install aravis # List detected cameras arv-camera-test-0.8
- Use Gigabit Ethernet: GigE cameras require high bandwidth
- Direct Connection: Connect camera directly to Mac when possible
- Adjust Frame Rate: Lower frame rates reduce network load
- Check Network Load: Use Activity Monitor to check network usage
# Check if extension is installed
systemextensionsctl list
# Reset system extensions (requires SIP disabled)
systemextensionsctl reset
# View logs
log stream --predicate 'subsystem == "com.apple.cmio"'- Verify camera is powered and connected to network
- Check if camera appears in:
arv-camera-test-0.8 - Ensure firewall allows UDP port 3956 (GigE Vision)
- Try using camera's IP address directly
- Check System Settings → Privacy & Security → Camera
- Ensure GigEVirtualCamera has permission
- Restart the app or your Mac
- For developers: Verify SIP is disabled for testing
- Clean build:
xcodebuild clean - Reset derived data:
rm -rf ~/Library/Developer/Xcode/DerivedData - Regenerate project:
xcodegen generate
MIT License - see LICENSE file for details
- Aravis - GigE Vision library
- Apple's Camera Extension sample code