{"id":51489781,"url":"https://github.com/roukmoute/gopro-cam-tray","last_synced_at":"2026-07-07T10:31:15.132Z","repository":{"id":368641681,"uuid":"1286016942","full_name":"roukmoute/gopro-cam-tray","owner":"roukmoute","description":"A tiny, native tray app that turns a GoPro into a webcam. A lightweight replacement for GoPro's official webcam utility.","archived":false,"fork":false,"pushed_at":"2026-07-01T14:51:17.000Z","size":63,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T15:23:38.214Z","etag":null,"topics":["gopro","obs","rust","virtual-camera","webcam"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/roukmoute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-01T11:10:56.000Z","updated_at":"2026-07-01T14:51:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/roukmoute/gopro-cam-tray","commit_stats":null,"previous_names":["roukmoute/gopro-cam-tray"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/roukmoute/gopro-cam-tray","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roukmoute%2Fgopro-cam-tray","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roukmoute%2Fgopro-cam-tray/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roukmoute%2Fgopro-cam-tray/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roukmoute%2Fgopro-cam-tray/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/roukmoute","download_url":"https://codeload.github.com/roukmoute/gopro-cam-tray/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/roukmoute%2Fgopro-cam-tray/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35225022,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gopro","obs","rust","virtual-camera","webcam"],"created_at":"2026-07-07T10:31:14.703Z","updated_at":"2026-07-07T10:31:15.127Z","avatar_url":"https://github.com/roukmoute.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GoPro Cam\n\nA tiny, native app that turns a **GoPro** into a **webcam** — a lightweight\nreplacement for GoPro's official (and rarely updated) webcam utility. Runs as a\n**system-tray app** on both **Windows** (OBS Virtual Camera) and **Linux**\n(v4l2loopback).\n\n- Small and light: ~800 KB executable, ~10 MB RAM at idle.\n- No background bloat: no console window, single instance, lives in the system tray.\n- Just works: turn the GoPro on, connect it over USB, and it starts streaming\n  automatically; unplug and it goes back to waiting.\n- Low latency, smooth 30 fps, no on-screen artefacts.\n- Replaces GoPro's official Webcam app: you don't need it installed or running\n  (in fact, don't run both at once — see the note below).\n\n## Download\n\nLatest builds (single executable, no installer):\n\n- **Windows:** [⬇ gopro-cam-tray.exe](https://github.com/roukmoute/gopro-cam-tray/releases/latest/download/gopro-cam-tray.exe)\n  (on first run see [Windows SmartScreen](#windows-smartscreen) below)\n- **Linux (x86-64, static):** [⬇ gopro-cam-tray](https://github.com/roukmoute/gopro-cam-tray/releases/latest/download/gopro-cam-tray)\n  (`chmod +x gopro-cam-tray` before running)\n\nOr browse every version on the\n[Releases](https://github.com/roukmoute/gopro-cam-tray/releases) page.\n\n## How it works\n\nWhen it is powered on and connected over USB, the GoPro exposes a USB network\ninterface and streams MPEG-TS/H.264 over UDP. This app drives it over the\ndocumented HTTP API, then processes the stream in a few steps:\n\n1. HTTP: start / stop the camera's USB stream.\n2. Receive the UDP MPEG-TS stream.\n3. Demux it into an H.264 elementary stream.\n4. Decode H.264 into raw NV12 frames using the system's built-in decoder.\n5. Publish the frames to a virtual camera.\n6. Any app (Zoom, Teams, Meet, the Camera app, ...) sees it as a regular webcam.\n\n## Requirements\n\nCommon: a **GoPro** that streams over USB (recent models start automatically\nwhen powered on and connected over USB-C, nothing to enable on the camera).\n\n**Windows:**\n- **[OBS Studio](https://github.com/obsproject/obs-studio/releases) installed**\n  (for its virtual-camera component). OBS does not need to be running; its\n  virtual-camera module just needs to be registered, which happens once you\n  install OBS and start its virtual camera a single time.\n\n**Linux:**\n- **`ffmpeg`** installed (`sudo apt install ffmpeg`).\n- The **`v4l2loopback`** kernel module, loaded to create the virtual camera:\n  ```\n  sudo apt install v4l2loopback-dkms\n  sudo modprobe v4l2loopback exclusive_caps=1 card_label=\"GoPro\"\n  ```\n  Two common gotchas:\n  - **Recent kernels (6.x):** the distro's `v4l2loopback` package may be too old\n    to build. Install the latest from source instead:\n    ```\n    git clone https://github.com/umlaeute/v4l2loopback\n    cd v4l2loopback \u0026\u0026 make \u0026\u0026 sudo make install \u0026\u0026 sudo depmod -a\n    ```\n  - **Secure Boot:** `modprobe` fails with *\"Key was rejected by service\"* unless\n    the module is signed. Enroll the DKMS key\n    (`sudo mokutil --import /var/lib/dkms/mok.pub`, then reboot and complete the\n    MOK enrolment), or disable Secure Boot.\n\nTo build from source: a **Rust toolchain**.\n\n## Build\n\n```\ncargo build --release\n```\n\n## Usage\n\n### Windows\n\n1. Run the app. A camera icon appears in the system tray.\n2. Turn the GoPro on and connect it over USB.\n3. In your video app (Zoom, Teams, Google Meet, Discord, the Windows Camera app,\n   ...), open its camera / video settings and select **\"OBS Virtual Camera\"** as\n   the video device. That's the camera this app feeds; nothing works until you\n   pick it.\n\nRight-click the tray icon:\n\n| Menu entry | Effect |\n|---|---|\n| *Status* | GoPro: streaming / suspended / waiting |\n| **Suspendre (reprend au rebranchement)** | Stop streaming but keep watching; auto-resumes when the camera is re-plugged |\n| **Reprendre** | Resume immediately (when suspended) |\n| **Lancer au démarrage** | Toggle auto-start at login (a hidden launcher in the Startup folder) |\n| **Quitter** | Quit for good |\n\n### Windows SmartScreen\n\nThe released `.exe` is not code-signed, so on first run Windows may warn\n\"Windows protected your PC\" with an unknown publisher. Click **More info**, then\n**Run anyway**. Removing this warning would require a paid code-signing\ncertificate.\n\n### Linux\n\n1. Make sure `ffmpeg` is installed and `v4l2loopback` is loaded (see\n   [Requirements](#requirements)).\n2. Turn the GoPro on and connect it over USB.\n3. Run the app (it auto-detects the v4l2loopback device):\n   ```\n   ./gopro-cam-tray\n   # or force a device:  ./gopro-cam-tray /dev/videoN\n   ```\n   A GoPro icon appears in the system tray. It streams while the camera is\n   connected and waits when it's unplugged.\n4. Select the **\"GoPro\"** camera (the v4l2loopback device) in your video app.\n\nClick the tray icon:\n\n| Menu entry | Effect |\n|---|---|\n| *Status* | GoPro: streaming / suspended / waiting |\n| **Aperçu** | Open a small always-on-top preview window (works while streaming) |\n| **Suspendre (reprend au rebranchement)** | Stop streaming but keep watching; auto-resumes when the camera is re-plugged |\n| **Reprendre** | Resume immediately (when suspended) |\n| **Lancer au démarrage** | Toggle auto-start at login (an XDG autostart entry) |\n| **Quitter** | Quit for good |\n\nThe tray uses the StatusNotifierItem protocol, which GNOME (with the\nAppIndicator extension), KDE, and most panels support out of the box.\n\n#### i3 (and other bare WMs)\n\n- **Tray icon:** i3bar only speaks the legacy XEmbed protocol, not\n  StatusNotifierItem, so run an SNI→XEmbed bridge such as\n  [`snixembed`](https://git.sr.ht/~steef/snixembed) (start it before the app,\n  e.g. `snixembed \u0026` in your i3 config).\n- **Preview window:** i3 tiles new windows by default, so the preview would be\n  resized to fill its container. To keep it as a small floating thumbnail, add a\n  rule to `~/.config/i3/config` (the preview's title is exactly `GoPro — Aperçu`):\n  ```\n  for_window [title=\"GoPro — Aperçu\"] floating enable, sticky enable\n  ```\n\n## Platform support\n\nWindows and Linux (x86-64) are supported; macOS is on the roadmap. The core\n(GoPro discovery, HTTP control, UDP capture) is shared. Only the H.264 decode\nand the virtual-camera sink differ per platform: Media Foundation + the OBS\nVirtual Camera on Windows, `ffmpeg` + `v4l2loopback` on Linux.\n\n## Notes and limitations\n\n- **Use only one webcam app at a time.** Don't run this alongside GoPro's\n  official Webcam software: both drive the camera's HTTP API and bind the same\n  UDP port, which conflicts and can leave the camera stuck. If that happens, the\n  fix is on the camera: *Preferences → Connections → Reset Connections* (a USB\n  unplug alone won't reset it, since USB keeps the camera powered).\n- Streams at 1080p30 (whatever the GoPro's USB stream outputs).\n- The low-latency `STARTLTP` protocol used by GoPro's macOS app is not publicly\n  documented; this uses the standard UDP/8554 endpoint.\n- Why OBS isn't bundled: OBS's virtual camera is GPLv2. This project only talks\n  to it at runtime through shared memory (the same approach as `pyvirtualcam`),\n  it does not redistribute any OBS code, which keeps it MIT. A fully\n  self-contained version would require shipping our own virtual-camera module (a\n  possible future addition).\n\n## Acknowledgements\n\n- The [OBS Studio](https://github.com/obsproject/obs-studio) project (the\n  virtual-camera shared-memory format is reproduced from its virtual-camera plugin).\n- The GoPro reverse-engineering community:\n  [Open GoPro](https://gopro.github.io/OpenGoPro/),\n  [gopro_as_webcam_on_linux](https://github.com/jschmid1/gopro_as_webcam_on_linux),\n  and [GoProStream](https://github.com/KonradIT/GoProStream).\n\n## License\n\nMIT, see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froukmoute%2Fgopro-cam-tray","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froukmoute%2Fgopro-cam-tray","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froukmoute%2Fgopro-cam-tray/lists"}