{"id":14533287,"url":"https://github.com/rse/vdon-call","last_synced_at":"2025-06-25T06:04:52.275Z","repository":{"id":66345643,"uuid":"471820417","full_name":"rse/vdon-call","owner":"rse","description":"Remote Caller Ingest for Live Video Productions with VDO.Ninja \u0026 OBS Studio","archived":false,"fork":false,"pushed_at":"2025-06-04T21:34:43.000Z","size":7171,"stargazers_count":41,"open_issues_count":1,"forks_count":10,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-06-18T20:02:31.326Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://caller.studio/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rse.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2022-03-19T21:52:09.000Z","updated_at":"2025-06-04T21:34:43.000Z","dependencies_parsed_at":"2023-02-22T02:16:13.391Z","dependency_job_id":"335db013-53d1-4c67-8524-fcfcc069e6d6","html_url":"https://github.com/rse/vdon-call","commit_stats":null,"previous_names":[],"tags_count":49,"template":false,"template_full_name":null,"purl":"pkg:github/rse/vdon-call","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rse%2Fvdon-call","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rse%2Fvdon-call/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rse%2Fvdon-call/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rse%2Fvdon-call/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rse","download_url":"https://codeload.github.com/rse/vdon-call/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rse%2Fvdon-call/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261816312,"owners_count":23213863,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-09-05T02:00:54.519Z","updated_at":"2025-06-25T06:04:52.250Z","avatar_url":"https://github.com/rse.png","language":"HTML","readme":"\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/rse/vdon-call@master/vdon-call-logo.svg\" width=\"300\" align=\"right\" alt=\"\"/\u003e\n\nVDON Call\n=========\n\n**VDON Call** is a [WebRTC](https://en.wikipedia.org/wiki/WebRTC)/[NDI](https://ndi.tv)-based\nremote caller ingest solution for live video productions, based on\nthe two swiss army knifes in their field: the awesome, low-latency,\nP2P-based video streaming facility [VDO.Ninja](https://vdo.ninja),\nand the awesome, ultra-flexible video mixing software\n[OBS Studio](https://obsproject.com). An instance of the landing page, the\ncorresponding URL trampoline, of **VDON Call** is publically available\nunder the meaningful name URL [caller.studio](https://caller.studio)\n(*caller of the studio*).\n\nMotivation\n----------\n\nThe name **VDON Call** (spoken *ViDeO Ninja Call*) is derived from\n[vMix Call](https://www.vmix.com/products/vmix-call.aspx), the name of the\ngreat but weaker product **VDON Call** is intended to substitute in\npractice, if necessary. The motivation and primary killer feature of\n**VDON Call**, in contrast to the otherwise also awesome vMix Call,\nis that the callers can ingest their camera and content *in parallel*\nand without having to fiddle around with two independent Browser tabs\nand that this dual-ingest approach is available for 8 callers in total\ninstead of just 4 (because vMix Call supports a maximum of 8 incoming\nvideo streams only). The resulting ingested video streams are available\nas NDI streams on the local network and can be easily consumed (usually\non a separate computer) with a video mixing software like vMix or OBS\nStudio.\n\nConstraints\n-----------\n\nThe [underlying VDO.Ninja parameterization](https://github.com/rse/vdon-call/blob/master/index.html#L368)\nis very opinionated and heavily optimized for a total of 16+1 video\nstreams, to allow one to ingest up to 8 callers with their camera and\nshared content (screen or window) into the video production and to\nprovide a return feed from the video production back to the callers. The\ncallers can hear but not see each other, except the provided return feed\nis some sort of multiview and shows the callers. This is intentional,\nas this is not a general video conferencing solution, but a dedicated\nway to ingest remote video callers of a production. Please keep this in\nmind.\n\nThere are two particular bottlenecks in this approach, which are\naddressed by the particular VDO.Ninja parameterization:\n\n1. **CALLER INGEST FEEDS**:\n\n   The caller receiver-side is an OBS Studio, acting as a WebRTC-to-NDI\n   gateway and has to run on a medium gaming PC (Intel Core i7 11700KF,\n   NVIDIA RTX 3070Ti, 32GB RAM) with just about a maximum of about 80%\n   overall resource utilization. As a result, the callers camera use\n   720p24 and a bitrate of 2000 kbps with H.264 and the callers content\n   use 1080p6 and a bitrate of 3000 kbps with H.264.\n\n2. **PRODUCTION RETURN FEED**:\n\n   The production sender-side, providing the return feed of the video\n   production back to the caller, should require no more than half of\n   the uplink (50 mbps) and downlink (100 mbps) of the usual Internet\n   connections available in Germany. As a result, the return feed uses\n   1080p29.97 and a bitrate of 3000 kbps with VP8.\n\nInstallation\n------------\n\nThe solution consists of the following parts which have to be installed:\n\n1. **URL TRAMPOLINE:**\n\n   This is just the files [index.html](index.html), [vdon.css](vdon.css) and [vdon-call-logo.svg](vdon-call-logo.svg),\n   which act as a URL trampoline, a\n   tiny webpage which generates the underlying, heavily parameterized VDO.Ninja\n   URLs. Install it as `index.html` to an arbitrary Internet service.\n   The page without any attached parameters is usually only used\n   by the video production crew to generate URLs. The page\n   with attached parameters is used by all **VDON Call** components\n   (see below) to expand the short URLs to the underlying VDO.Ninja URLs.\n   For convenience reasons, an instance of this URL trampoline\n   is publically available under the meaningful URL\n   [caller.studio](https://caller.studio).\n\n2. **WEBRTC-TO-NDI GATEWAY:**\n\n   This is an OBS Studio instance, driven by the files [obs-studio/basic.ini](obs-studio/basic.ini),\n   [obs-studio.json](obs-studio.json),\n   [obs-studio.lua](obs-studio.lua) and\n   [obs-studio.html](obs-studio.html).\n   These are the OBS Studio profile, scene collection, configuration update script and\n   optional entry page, which establish OBS Studio as a WebRTC-to-NDI gateway.\n   For this to work, you have to locally install the following\n   prerequisites:\n\n   - [NDI Tools](https://www.ndi.tv/tools/)\n   - [OBS Studio](https://obsproject.com/)\n   - [OBS NDI](https://github.com/Palakis/obs-ndi/)\n\n   Then use *Profile* \u0026rarr; *Import* for importing the\n   [obs-studio/](obs-studio/) directory. Then use *Scene Collection*\n   \u0026rarr; *Import* for importing the [obs-studio.json](obs-studio.json)\n   file. Then, use *Tools* \u0026rarr; *Scripts* \u0026rarr; `+` for importing the\n   [obs-studio.lua](obs-studio.lua) file.\n\n   Once this is done, use *Tools* \u0026rarr; *Scripts* \u0026rarr;\n   `obs-studio.lua` to update all browser sources in OBS Studio with\n   your URL trampoline information. The \"Base URL\" is either `https://caller.studio/`,\n   `file://\u003cpath-to-obs-studio.html\u003e/#https://caller.studio/` (if you want to\n   use the optional entry page -- usually just for debugging purposes),\n   or your own URL where you deployed the URL trampoline (see above).\n\n3. **VIDEO PRODUCTION:**\n\n   This is the actual video production which requires a video mixing\n   software like vMix or OBS Studio to consume and mix the NDI streams\n   of the callers and produce a \"program\" (aka output) which can act\n   as the return feed video stream to the callers. This really has to\n   run on a computer which is separate (but in the same LAN) to the\n   WebRTC-to-NDI gateway.\n\nComponents\n----------\n\nThe solution consists of the following logical parts under run-time:\n\n- **URL Trampoline**\n\n  This is the URL trampoline which is deployed to a publically reachable\n  URL like `https://caller.studio`, and which can be used by the\n  production crew to easily generate the required \"short\" URLs based\n  on unique organisation name and a room name (unique per organisation). Its\n  trampoline functionality on access of these \"short\" URLs expand to the\n  underlying, technical, heavily-parameterized VDO.Ninja URLs.\n\n  ![](shot-1-trampoline.png)\n\n- **Caller (Sender)**\n\n  This is the caller sender-side, i.e., Google Chrome opened a URL\n  like `https://caller.studio/#/example/example/C1`.\n  The result the VDO.Ninja user interface, configured for a caller\n  participating in a room where the user can only see its own camera and\n  shared content preview and the return feed of the production (here\n  a multiview from vMix).\n  You can also attach the following optional parameters to the URL (concatenate multiple ones with \"\u0026\"):\n    - `vdon=\u003ckey\u003e:\u003cval\u003e,...` (apply arbitrary VDO.Ninja options)\n    - `version=\u003cid\u003e` (force use of a particular VDO.Ninja version: `v20`, `v21`, `v22`, `dev`, `alpha`, `beta`, or even fully-qualified URL to own VDO.Ninja instance)\n    - `quality=high` (use 30/30 FPS and 3/3 Mbps instead of 24/6 FPS and 2/2 Mbps for camera/screen)\n    - `codec=\u003cid\u003e` (use codec `x264`, `vp9`, `av1` or `webp` instead of `vp8`)\n    - `audiocodec=\u003cid\u003e`(use codec `pcm`, or `g722` instead of `opus`)\n    - `cam=\u003cname\u003e` (camera device)\n    - `mic=\u003cname\u003e` (microphone device)\n    - `spk=\u003cname\u003e` (speaker device)\n    - `lang=\u003ccc\u003e` (ISO country code for UI language)\n    - `bg=\u003ctype\u003e` (background replacement: `blur`, `green` or `canvas`)\n    - `ducking` (use audio ducking/noisegate)\n    - `audiodelay=\u003cms\u003e` (delay audio)\n    - `videodelay=\u003cms\u003e` (delay video)\n  An example sender URL would be\n  `https://caller.studio/#/example/example/C1?cam=Standard\u0026mic=Standard\u0026lang=de\u0026bg=blur`\n\n  ![](shot-2-caller-sender.png)\n\n- **Caller (Receiver)**\n\n  This is the heart of the solution, the caller receiver-side,\n  i.e., OBS Studio with the **VDON Call** profile and\n  scene collection loaded which accesses URLs like\n  `https://caller.studio/#/example/example/C1?stream=camera` and\n  `https://caller.studio/#/example/example/C1?stream=content`. For an\n  overview, a special multiview scene is in preview (and also exposed\n  via NDI for inclusion into the multiview of the production -- see\n  below).\n  You can also attach the following optional parameters to the URL (concatenate multiple ones with \"\u0026\"):\n    - `vdon=\u003ckey\u003e:\u003cval\u003e,...` (apply arbitrary VDO.Ninja options)\n    - `version=\u003cid\u003e` (force use of a particular VDO.Ninja version: `v20`, `v21`, `v22`, `dev`, `alpha`, `beta`, or even fully-qualified URL to own VDO.Ninja instance)\n    - `quality=high` (use 30/30 FPS and 3/3 Mbps instead of 24/6 FPS and 2/2 Mbps for camera/screen)\n    - `codec=\u003cid\u003e` (use codec `x264`, `vp9`, `av1` or `webp` instead of `vp8`)\n\n  ![](shot-3-caller-receiver.png)\n\n- **Production (Sender)**\n\n  This is the video production. It uses a video mixing software\n  like vMix (shown here) or OBS Studio (as a decent alternative). This\n  production receives all callers (and the multiview) from OBS\n  Studio via NDI and mixes them into a resulting program video\n  stream. For convenience reasons, beside this program video\n  stream, this vMix instance also exports a multiview video stream\n  which shows the caller ingest multiview, selected callers, the\n  program video stream and the clock. Either the program or (as\n  shown shere) the multiview video stream is then send back to the\n  callers via a companion Google Chrome instance accessing the URL\n  `https://caller.studio/#/example/example/A1` (standard) or\n  `https://caller.studio/#/example/example/A2?mode=meshcast` (using the VDO.Ninja meshcast feature).\n  Similar to the `mode=meshcast`, you can attach the following optional parameters\n  to the URL (concatenate multiple ones with \"\u0026\"):\n    - `vdon=\u003ckey\u003e:\u003cval\u003e,...` (apply arbitrary VDO.Ninja options)\n    - `version=\u003cid\u003e` (force use of a particular VDO.Ninja version: `v20`, `v21`, `v22`, `dev`, `alpha`, `beta`, or even fully-qualified URL to own VDO.Ninja instance)\n    - `quality=high` (use 30/30 FPS and 3/3 Mbps instead of 24/6 FPS and 2/2 Mbps for camera/screen)\n    - `codec=\u003cid\u003e` (use codec `x264`, `vp9`, `av1` or `webp` instead of `vp8`)\n    - `cam=\u003cname\u003e` (camera device)\n    - `mic=\u003cname\u003e` (microphone device)\n    - `spk=\u003cname\u003e` (speaker device)\n  An example URL would be\n  `https://caller.studio/#/example/example/A1?cam=vMix Video External 2\u0026mic=Line 2 (Virtual Audio Cable)`\n\n  ![](shot-4-production.png)\n\n- **Director (Control)**\n\n  This is the optional VDO.Ninja director\n  view, i.e., Google Chrome accessing the URL\n  `https://caller.studio/#/example/example/D1`\n  where the production crew can send messages to the callers, adjust the\n  parameters of the callers, etc. The director view intentionally has\n  all incoming video/audio feeds disabled and also does not send an own\n  outgoing video/audio feed to not cause any additional network traffic\n  on the callers.\n  You can also attach the following optional parameters to the URL (concatenate multiple ones with \"\u0026\"):\n    - `vdon=\u003ckey\u003e:\u003cval\u003e,...` (apply arbitrary VDO.Ninja options)\n    - `version=\u003cid\u003e` (force use of a particular VDO.Ninja version: `v20`, `v21`, `v22`, `dev`, `alpha`, `beta`, or even fully-qualified URL to own VDO.Ninja instance)\n\n  ![](shot-5-director.png)\n\nDesign Cruxes\n-------------\n\nThe design of **VDON Call** is based on the following cruxes:\n\n- **OPTIMIZED VIDEO ENCODINGS**:\n  The *Caller Ingest Feeds* use the video codec H.264, reduced\n  resolutions (720p and 1080p), and reduced framerates (24 and 6) to\n  allow the WebRTC-to-NDI gateway to cope with the decoding of 16 video\n  streams and the re-encoding of 16+1 video streams. In contrast to\n  this, the *Production Return Feed* uses the video codec VP8 as it\n  provides better overall quality (H.264 on smaller sizes regularly\n  degrades the video stream to be greyed or washed out).\n\n- **MINIMUM TOTAL VIDEO STREAMS**:\n  The *Director* mode in VDO.Ninja is forced to not use any video\n  or audio at all, to reduce the minimum number of total video streams\n  in the room and especially reduce the load on the callers as good\n  as possible.\n\n- **REDUCED USER INTERFAC CLUTTER:**\n  The *Caller* mode in VDO.Ninja is forced to be as simple as\n  possible from a user interface perspective (many features are\n  intentionally disabled) to not confuse the callers as good as\n  possible.\n\n- **SIMPLE AND INTUITIVE URLS:**\n  The *Caller URLs* use the meaningful \"caller.studio\" domain and\n  are reduced to the absolute minimum of the required information.\n  All technical aspects of the underlying VDO.Ninja facility are\n  hidden and are provided on-the-fly by expanding the URLs internally.\n\n- **NAMESPACE CONFLICT AVOIDANCE:**\n  The VDO.Ninja room identifiers and stream identifiers are based\n  on the hashing of an organization and room name. This way **VDON\n  Call** does not \"trash\" the namespace of VDO.Ninja too much and is\n  less likely in conflict with regular VDO.Ninja uses.\n\n- **USER INTERFACE STYLING:**\n  The VDO.Ninja user interface, especially the entry page for selecting\n  devices and the chat module, in dark mode and by default look rather\n  unpolished. For an improved user acceptance, the appearance of the\n  user interface of VDO.Ninja is improved with a VDON Call specific\n  style.\n\nSimplified Usage\n----------------\n\nFor just ingesting 1-4 remote guests with VDON Call instead of vMix Call\ninto vMix, you can alternatively directly run the receiver side inside a\nWeb Browser type input of vMix (for vMix 25 it is an ancient Chromium\nV86, but for vMix 26 it is at least V103).\n\nFor ingesting a guest with 720p24 (camera) and 1080p6 (content) use:\n\n- Guest URL:        `https://caller.studio/#/example/example/C1`\n- vMix Input 1 URL: `https://caller.studio/#/example/example/C1?stream=camera`\n- vMix Input 2 URL: `https://caller.studio/#/example/example/C1?stream=content`\n\nFor ingesting a guest with 1080p30 (camera) and 1080p30 (content) use:\n\n- Guest URL:        `https://caller.studio/#/example/example/C1?quality=high`\n- vMix Input 1 URL: `https://caller.studio/#/example/example/C1?quality=high\u0026stream=camera`\n- vMix Input 2 URL: `https://caller.studio/#/example/example/C1?quality=high\u0026stream=content`\n\nSee Also\n--------\n\nThis solution was announced 2022/03 in the following communities:\n\n- [Reddit: VDO.Ninja](https://www.reddit.com/r/VDONinja/comments/ti8jz4/vdon_call_remote_caller_ingest_via_vdoninja_to/)\n- [Reddit: OBS Studio](https://www.reddit.com/r/obs/comments/tihbxz/vdon_call_external_ndibased_remote_caller_ingest/)\n- [Reddit: vMix](https://www.reddit.com/r/vmix/comments/ti8r3g/vdon_call_remote_caller_ingest_via_vdoninja_obs/)\n- [vMix: vMix Call](https://forums.vmix.com/posts/t28731-VDON-Call--a-vMix-Call-substitute--when-parallel-camera-and-screen-sharing-is-required)\n- [Twitter: Engelschall](https://twitter.com/engelschall/status/1505340731593998339)\n\nCopyright \u0026 License\n-------------------\n\nCopyright \u0026copy; 2022-2025 [Dr. Ralf S. Engelschall](mailto:rse@engelschall.com)\u003cbr/\u003e\nLicensed under [MIT](https://spdx.org/licenses/MIT)\n\n","funding_links":[],"categories":["HTML"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frse%2Fvdon-call","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frse%2Fvdon-call","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frse%2Fvdon-call/lists"}