Updates - VDO.Ninja

February 23

  • Added &splitrecording, which allows a media recording to be split up into multiple files when recording to disk in the browser. (eg, when using &record)

    • The point of this feature is to allow recordings to be saved fully to disk incrementally, avoiding the case where the computer crashes and the entire recording is lost. You can also auto-upload the video in chunks to the cloud this way, while still recording using a cloud-linked drive.

    • &splitrecording accepts a time value in minutes; 5 minutes is the default splitting time if not specified; this is about 30-MB at 720p.

    • The files that get saved are a single video container, just split up into different partitions. Only the first partition can load into a video player, requiring subsequent partitions to be concatenated for them to be played. (since only the first chunk has the header media info)

    • On Windows, you can concat files using the command prompt; copy /b savedfile.webm + savedfile.webm_1 + savedfile.webm_2 out.webm. You can also use ffmpeg to do it using a playlist.

    • Each partition has a postfix as seen, so you know which order they should be in.

    • I considered making each partition it's own video file, with its own header, but this risks an audio click or lost frame, and complicates the code. For now then, this is the approach I'm using

  • Regardless of whether you are using &splitrecording, if your battery life (mobile/laptop) reaches 2-percent life left, VDO.Ninja will now auto trigger the current recording to be saved to disk, continuing the recording in a new partitioned file. While you might end up losing the last 10 minutes of the recording in this case, you won't accidentally lose the previous hour or two.

    • Battery life is only available to me on Chrome (chromium-based browsers; not iOS fake chrome), so this low-battery life safety feature won't work on iOS/iPad devices.

** this new feature and function is on alpha at vdo.ninja/alpha/ for testing and feedback.

February 20

  • Added {setBufferDelay:1000, UUID:"*", streamID: "abc"} and {getGuestList:true} to the VDO.Ninja IFrame API

    • setBufferDelay lets you specify the video delay for a specific video, by a specific UUID or streamID, all videos (UUID:"*"), or the default buffer delay.

** on vdo.ninja/alpha/

February 16

  • Added the option &preferaudiocodec to VDO.Ninja. It's a sending side option, which lets the sender choose which codec they prefer get used. ie: opus, red, g722.

    • Not intended to be used really other than for debugging or for WHIP publishing

February 12

February 10

  • A green screen error was fixed on iOS (pushed a hotpatch to production for it)

  • &focus was added as an option to vdo.ninja/alpha/

    • it lets you set the manual focus of a web camera of smartphone camera (if supported) to some specific focal distance value. ie: &focus=100

February 9

  • Added an option called &outboundsamplerate (&obsr) to VDO.Ninja, which accepts a value; 48000 for example. (sender side)

    • Background: new in v24 of VDO.Ninja, the output from your microphone gets re-sampled to 48000hz, for the purposes of the web-audio nodes pipelining, but this command lets you override and specify it yourself if needed

    • The audio from your microphone gets encoded to 48000hz anyways, due to OPUS audio, so the main reason to change this is for debugging / testing purposes

    • Mobile / Firefox / Safari don't get re-sampled by default, so using this will force-enable the resampling if possible in those cases also

    • Pass no value or 0, and you'll disable the re-sampling, which might be useful for chrome/chromium users who are facing any new audio issues in v24. You can also just use &noap to disable the web audio pipeline entirely

    • A high sample rate in the web audio pipeline will cause it to crash, so that's why the audio gets re-sampled to 48000 in v24, so I'd avoid a high resample rate as well when using &obsr

** for testing on vdo.ninja/alpha/

February 8

  • When unmuting their microphone, an iPhone/iPad user's microphone will reload now as well. This is to address an issue where sometimes the audio track is killed due to background system notifications, but VDO.Ninja isn't always made aware of the issue; reloading the audio source can sometimes fix it. @Yong

  • Fixed a rare mobile rendering issue where the top button was half visible

  • vdo.ninja/v24/ exists now, though it's not 'frozen' yet, yet it may be in the next couple weeks

  • Added options to remotely control the pan tilt of a camera when using the &remote option as a viewer

** All of this is on alpha for testing at vdo.ninja/alpha/ and also on GitHub

February 4

  • I've updated the volume slider for the director to act logarithmically now, with a higher max gain allowed

    • This means instead of the slider going 0 -> 50 -> 100 -> 150 -> 200, it now goes 0 -> 20 -> 100 -> 200 -> 800

    • If you have a quiet guest, you can get them a lot louder now in other words, with ~800% loudness being the max

    • Steps between incremental values can be as big as 20 now, rather than always one

  • Minor improvements to &chunked mode

    • You can change the camera source now without it cutting out

    • Doesn't lag as much or at all if changing tabs/visibility

    • Better control over the buffer latency

** changes on alpha at vdo.ninja/alpha/ for testing

January 26

  • If using &noaudio, embedded YouTube videos loaded via other guests/directors will play muted by default

    • This only works with YouTube links at the moment; other websites loaded might trigger audio still

    • Using &relay will not do this behavior, despite using the turn server none-the-less; so &privacy is evolving to be a bit more strict than &relay alone

    • It will even show if loaded into OBS, as privacy trumps there. (IFrames can steal IP address, etc.)

    • You can also just use &nowebsite, to disable IFrames from loading at all (always existed as an option)

    • Certain known sites are excepted; YouTube, Twitch, Vimeo, etc. will not ask for confirmation

** updates to vdo.ninja/alpha/

January 24

  • Added &lanonly as a new URL parameter

    • This tries to block all p2p connections that are not on the same LAN as you

    • It tries to filter public IPs for both incoming and outgoing p2p connections, along with blocking turn/stun.

    • This still requires the Internet, as the handshake server / website still need to be accessed.

    • Failed connections will just keep retrying every several seconds, but won't actually establish a p2p connection.

    • It isn't tested to work with WHEP/WHIP, but likely will only allow for local WHIP/WHEP services also

    • I doubt it's hacker proof, given the limited testing so far, but it passed a few basic tests.

** on alpha for testing at vdo.ninja/alpha/?lanonly

January 23

  • Added a check-box option to VDO.Ninja that allows a smartphone-user to auto-remember their stream ID. (At the bottom of the add your camera page)

    • The option is checked by default (will remember your stream ID, as if using &permaid), however if you uncheck it, it will delete the stored stream ID and remember that you unchecked it.

    • This addition is more targeted to help out basic users who are intending to use their smartphone as a basic webcam.

    • The option only shows if you are a mobile-user. (This was decided on because mobile users can't easily have multiple tabs active really, whereas desktop users commonly do, and so this on desktop would cause a lot of stream ID conflict issues. The native app already recalls the stream Id as well, so this just mimics that proven workflow on web).

    • The option also only shows if you do not have the stream ID already included in the URL (&push / &permaid, will disable it, for example).

    • The option does not show if joining a room or screen sharing, etc - just sharing your camera, as that is the workflow that some users are having issues with.

January 22

January 20

  • Fixed a recent issue where when a guest who joined with video-only, and then later added an audio track, their audio wouldn't always start playing.

    • This seems like a bug within the browser itself, as the solution was to just mute and unmute the video element programmatically.

    ** on alpha for quick testing, before I push it to production

January 17

  • GitHub updated with recent VDO.Ninja changes

January 16

  • The &welcome message on VDO.Ninja will auto hide after 30-seconds now, and the close button is also big and red, to be more obvious.

January 10

  • Equirectangular 360-video video support added, via a standalone player page (mostly just an example app)

    • Access it here: https://vdo.ninja/360?view=the360StreamIDHere (change the view ID to match your push ID; &password optional).

    • supports Chrome/Chromium browsers only currently; and only one stream can be viewed at a time only.

    • The viewer can interact, with each viewer having control to look around in 360-space on their own.

    • As the sender, you can use the OBS Virtual Camera as a source, when sending, or use a camera with a Equirectangular output.

January 8

  • When using &layout=xxxxxxx as a URL parameter, (where xxxx is a URL-encoded JSON layout), it won't allow the director to remotely change the layout anymore. If you just use &layout, and pass no value, it will let the director remotely change the layouts. I think this makes more sense, and so I pushed this update to production and alpha.

January 7

  • When using the &api service for VDO.Ninja (companion.vdo.ninja), chat messages sent/recv via VDO.Ninja will be sent over the API server. ** on alpha for testing

January 6

  • Added &nofullscreenbutton (&nofsb), which hides the full-window button that appears sometimes in the top-right corner of videos.

    • On alpha for testing

    • If you prefer the button not to appear at all, or if you like having it in, feel free to let me know.

January 5

  • Fixed a recent issue with the speedtest in v24 not working.

  • Updated GitHub with some recent fixes and changes.


December 29

  • Removed the 'submit bug' and 'help' buttons in the lower-right; they weren't being used enough to justify the annoyance they added.

  • Fixed an issue where the &chunked mode didn't work with custom &layouts (Mixer App).

  • Fixed an issue where switching from WiFi to Cellular with an iPhone didn't always reconnect.

December 22

  • showChatMessage and showChatOverlay added as API options (ie: https://api.vdo.ninja/xxxx/sendChatMessage), which will show a message in that user's chat feed, or as a more visible message overlay.

    • Might be useful if you want to send messages to a host, without having a director connected

    • Available on alpha at vdo.ninja/alpha/

December 19

  • VDO.Ninja on GitHub updated https://github.com/steveseguin/vdo.ninja

    • Expect a release to production shortly, pending some last minute changes. It's quiet this week, so seems like a good time. to update to v24.

  • Well, VDO.Ninja is updated with v24.4 now. So it's in sync with alpha. If you have any problems, please use https://vdo.ninja/v23/ instead, which is the previous version that was available for the last few months.

  • Happy Holidays everyone. Let me know if you have any issues and I'll work on fixing them asap.

December 17

  • If you add &debug as a URL parameter, you'll see a verbose log output in the browser's console log.

    • As well, when you hang up or end the page with &debug appended, it will try to save the log output to disk automatically. This may not work with OBS, but should work with Chrome in most cases. If the system totally crashes of course, the log probably will be lost.

  • You can also do &debug=somewebsocketserver.com however also , and the system will then also stream in real-time the log output to the specified basic websocket endpoint. You need to host your own websocket server in this case.

** on alpha

December 15

  • Mainly just been fixing bugs/issues from the backlog this week, in both OBS and Social Stream, but mainly trying to get v24 of OBS ready for production launch.

    • Please start testing vdo.ninja/alpha/ for any newly introduced bugs/issues, as I'd like to get it out by years end.

  • Improved the tally-light sign further; no longer will I show "active" now also, unless &tally is used explicitly

  • Updated the zero-commission swag options at zero.vdo.ninja. Removed the masks, add mouse pad/tote bag. I welcome swag suggestions/designs.

  • The &jsURL parameter will now only be accepted if loaded via an IFrame or third-party hosted domain; to improve user-trust.

  • Added a new IFRAME / HTTP API action: '{getStats:true} or https://api.vdo.ninja/XXXXXX/getStats; it returns the current p2p stats, including bitrate.

  • Made yet another demo of the IFrame API, this time a very simple incoming-events listener for viewing videos: https://vdo.ninja/alpha/examples/iframe.inbound-stats.html

** these new VDO.Ninja changes are on alpha at https://vdo.ninja/alpha/

December 9

  • The '?i=' parameter used by VDO.Ninja can support URL encoded or non-URL encoded strings

    • Added a sample to the index.html on how to preset such as a hard-coded value for self-deployments.

    • &style=1 will now apply to your own preview video also; so if using &style, muting your video will see it become hidden.

** changes on alpha at vdo.ninja/alpha

December 6

    • on alpha at - https://vdo.ninja/alpha/?ptt

December 4

  • Added Server-Side-Events support to the VDO.Ninja API

    • You can listen for push-notifications essentially, without needing to use Websockets.

    • It's listen-only, but its easy to use, versus Websockets, which already can do all of this, but with more code.

    • Background: VDO.Ninja clients send some basic events out when using the &api option, including connection and stream ID details, allowing a developer to write their own application layers to know when someone has joined a link, etc.

December 3

  • &ptt=ctrl+alt+m added as an option to set the push-to-talk hotkey.

    • The ctrl/meta/alt keys need to be specified first, then a normal key.

    • The default is CTRL + ALT + M if just &ptt is set, but no value passed.

  • api.vdo.ninja/xxxx/tallylight/1 set the tally light; 0,1,2, or 3 , depending on off, live, standby, and active.

    • Uses the same style for the tally light as the OBS state tally light system.

    • Until initially triggered, the existing tally light will use the OBS state for the tally; &obsoff I think can disable that tho.

** changes on alpha

December 2

  • Made some improvements for iOS video recording in VDO.Ninja - shouldn't crash after 15-minutes anymore, assuming on iOS +16. ** on alpha (more improvements coming for it tho)

  • Updated the self-hosted VDO.Ninja handshakeserver code for VDO.Ninja with some minor optimizations

  • Completed a couple nights of dev ops systems maintenance work

November 20

  • Added &forcecontrols as a URL option to VDO.Ninja.

    • It's experimental, but it will try to keep the video controls visible, even if your mouse isn't hovering over the video.

    • The VDO.Ninja tab/window still needs to be 'active' however, for this to work; changing focus to another tab will stop it.

    • Only works really for chrome/chromium on desktop; not Firefox, etc.

November 9

November 8

  • Loading up the camera should be faster in most cases now, especially on mobile browsers when selecting the non-default camera.

    • For example, loading the rear camera on an Android device should be under 1-second now, rather than 1 to 5-seconds.

    • Things will still be slow if needing to request camera or mic permissions, or if using an older browser.

    • Browsers have matured in the last three years since I previously wrote this logic, so I'm presuming issues of the past aren't present anymore.

    • Please test it though and report any issues to me of course - I think everything should be more stable now, but you never know.

    ** changes on vdo.ninja/alpha/, as well, all the recent code updates (v24.2 beta) are on Github too.

  • Fixed an issue where if you were recording a &chunked stream remotely, and then refreshed the page accidentally, the video file often wouldn't close in time and the file would be lost. The new code now will do a faster emergency file close on a page reload, avoiding this issue; the non-chunked recording option already did this e-stop option.

  • The chunked file recording now supports AV1 video codec; before it was limited to VP9. (AV1 is the new default chunked mode atm)

** changes on alpha

November 5

  • ALT + A as a hotkey will toggle the speaker-output audio mute on/off.

    • This is only usable when the browser tab is in focus

    • If you have conflicts with this option, please let me know and I'll change it up

    ** on alpha for test; vdo.ninja/alpha/

  • I put together a code example of how to use the IFrame API of VDO.Ninja to remotely control OBS; so you don't need to use the built-in controller menu, but you can make your own and integrate it into your own web apps.

    • I have an older OBS remote example, using WebSockets, but that's a bit depreciated at the moment.

    • The page gives you a link to put into OBS, and assuming you did it right, you'll see your OBS scenes appear as buttons.

    • This sample uses a newly added IFrame API end point in VDO.Ninja, designed for controlling OBS; it's on only alpha currently, so this sample only works on alpha atm. You could technically make your own OBS controller however instead, and just use VDO.Ninja to relay generic messages; that's how social stream does it, for example.

November 4

  • When using the &limittotalbitrate option as a director, the room settings will include a new slider to let you dynamically change that value.

    • This lets the director set a maximum total bandwidth outbound from them to the guests; useful if you set the total room bitrate to something high. Combined, you can ensure the guests as high quality as possible from you, without causing your OBS RTMP output or whatever to get smashed.

    • When using the Mixer App (vdo.ninja/alpha/mixer), the &limittotalbitrate value was set to 350-kbps before, but now I have it set to 1500-kbps. Guests in the Mixer App should as a result now see the director's broadcast output in 3x higher quality now, for better or worse.

    • I may adjust the default value in the mixer based on user issue reports.

    • The slider doesn't appear if not using the &limittotalbitrate value in the URL (or if not using the Mixer App). It's just too confusing to explain to include it by default.

    ** change on alpha

November 3

November 1

  • Dropbox support improved on vdo.ninja/alpha/, so that it works properly now, and will recover from a crashed browser once the guest re-opens their browser. Still no UI for this feature, so it's a WIP still.

  • Added an API hotkey option to toggle a remote guest's camera on/off.

  • Fixed a bug where if the director used the remote-record option on a guest's screen-share, it would instead record the guest's camera; not the screen share.

  • Improved the messaging of the two record options (local/remote); should be easier to understand what each does and the advantages.

  • Added some URL parameters to VDO.Ninja that let you manually pre-set some basic camera settings: - &whitebalance (&wb) - &exposure - &saturation - &sharpness - &contrast - &brightness -- &whitebalance is in Kelvin I think, so 5000 or 6500 are typical values it will take. -- The rest normally will take an integer value in the range of 1 to 255, at least for a Logitech webcam. -- I already currently auto-save camera settings for android devices that support video settings, but for desktop browsers, I am not. Using these new values though you can manually set things to auto-configure as you want. -- These settings will apply to ALL video devices though, not just a specific one. -- If a setting isn't supported by your camera or browser, it will just fail quietly, and not apply. You'll see an error in the console log though. -- You can check the video settings menu as to whether a device supports a certain feature or what value; you can also check out https://vdo.ninja/supports.

Feedback and bug reports welcomed ** Available for testing on alpha at https://vdo.ninja/alpha/

October 30

  • There's a new stat for helping tell if you or a remote guest is blocking p2p WebRTC traffic.

    • If blocking p2p, it will still work, but via the relay server. This is far from ideal in most cases.

    • Just changing the browser can often fix this issue if detected

** on alpha

October 25

  • Added support for something called "end to end encryption" using "insertable streams" to VDO.Ninja. To use, add &e2ee to both the viewer and sender side links. Can be used in conjunction with &password to specify a cipher. More technical details about it: -- VDO.Ninja is already end to end encrypted by default (in peer to peer mode), so this isn't anything of much value to most users. -- In p2p mode, this will double up the encryption on the video/audio stream, which might be useful if your system was compromised by a state actor. -- Uses the browser's built-in AES algo, but there is dedicated js file for the encryption logic, so you can custom-code to use your own encryption I guess -- Does NOT work with Meshcast, as I don't have insertable streams working server-side there yet, so there is no E2EE with Meshcast still -- It can be used with compatible WHIP/WHEP services, but most WHIP/WHEP services won't support insertable streams. Still, some do, and that's probably the main reason why I bothered to add this all in. -- The default crypto key used will be hard coded, public, and not secure, but if you provide a &password it will use that as the secure cipher phrase instead. -- The encoder and decoder algo will fail-safely, rather than fail-securely; I can change this if needed, but it allows for broader peer compatibility and user friendliness. I have more work to do on visually indicating the state of this all, and to allow for more customization, but I'll wait on that until there is more feedback I guess. -- Not all browsers support this, so in those cases, it may fail safely, if possible; otherwise it will just fail completely.

** on alpha for testing at vdo.ninja/alpha/

October 23

October 22

  • Re-wrote much of the the Browser-to-RTMP docker project, so it uses Chromium instead of Firefox now.

    • Seems to fix audio/video sync issues.

    • Tested support on Ubuntu x64 (cloud server) and Ubuntu Arm64 (orange pi).

    • useful if you want a headless or cloud-hosted way of streaming VDO.Ninja to YouTube/Kick/Mp4, without needing OBS Studio.


October 21

  • Added a work around for a chrome bug impacting some Androids where their video preview would sometimes freeze on initial camera loading, requiring a refresh.

    • If curious, the fix just better detects that a player error occurred, and then just retries loading it again a second later, fixing itself.

    • Pushed the change to production (https://vdo.ninja/) as a hot patch, but the change is also on alpha and GitHub now.

October 20

  • 7.1 surround sound audio is being supported now, in a technical sense, although really only if the source is a server stream. To use, add &stereo=8 on the viewer end. (5.1 multi channel was around supported with &stereo=4 I think)

  • Fixed an issue with stereo sound not working on the WHEP viewer.

  • Fixed an issue with the WHEP player stats not showing correctly.

  • Fixed an issue where &buffer wasn't working with the WHEP player.

  • Made it a bit easier to setup the WHEP player as a basic viewer page; hiding menus that probably aren't commonly needed.

  • Improved the vdo.ninja/alpha/whip page and added SVC scalable options to the WHIP output option there, making it easy to select a compatible SVC mode if desired.

October 19

  • Added &recordmotion as an option, which takes a video snapshot and saves it to disk as a PNG file whenever there is motion detected in a video. -- Auto saves (to download folder) one photo per second, max. -- It can take values, such as &recordmotion=15, which will control the sensitivity of the motion capture -- It's primarily designed for the sender-side, but I think it should work if a viewer also -- I don't think this will work within OBS, so Chrome/Chromium is recommended instead -- I guess the point of this is to allow for basic security camera operation, but also as a source of inspiration for other ideas -- File name of the saved file contains the timestamp ** on alpha at https://vdo.ninja/alpha/?recordmotion&webcam

October 16

  • Added a new experimental option called &retransmit; it will relay the incoming 'chunked' media stream to others connected to you, without transcoding. In a way, this enables a form of peer to peer to peer broadcasting. -- It only works with incoming &chunked data streams, however trying to forward more than one chunked stream will break things currently. -- It will disable your own mic/camera from being streamed; when &retransmit is used it configures itself as a viewer in a sense. -- Chunked mode has a default play out buffer delay of about 1-second still, but that buffer time does not get passed down to the relayed viewer. There is still some transmission delay that gets introduced though, but it can be very low latency on a series of good computers/network. example p2p2p setup:

https://vdo.ninja/alpha/?chunked&push=PUBLISHER123   // this is the source. Notice they are publishing in chunked mode
https://vdo.ninja/alpha/?view=PUBLISHER123&retransmit&push=RESTREAMER123   // this person is both viewing the video, but also relaying
https://vdo.ninja/alpha/?view=RESTREAMER123   // this person is viewing the stream from the relayed chunked stream; p2p2p. They don't know they are getting a relayed stream.

This feature is just for fun at the moment. It's does not do automatic p2p2p broadcasting, as you still need to manually customize who sees what, and chunked mode isn't compatible with all browsers/devices yet. It's on alpha at the time being (vdo.ninja/alpha/).

  • Completed some needed server maintenance/upgrades @ ~2:20am est

October 15

  • I actually think I might have figured out a software solution to the previously mentioned issue, re: high sample rates, and so I just pushed a patch into production. If you notice any brand new issues with audio though, such as extremely clicking, let me know of course. Thanks!

October 14

  • I now include a trouble solving tip for users with extremely high audio sample rates set, which is the cause for some microphones not to work.

  • Added &nodirectorvideo and &nodirectoraudio to VDO.Ninja; these are just like &novideo and &noaudio, except they only apply to incoming connections from room directors. So, if your are using the Mixer App with OBS, but you want to exclude the audio of yourself from the OBS, this potentially could be an easy way to do that.

** on alpha at vdo.ninja/alpha/

October 13

  • I re-wrote the canvas drawing logic (the digital effects code) to make it more performant when a tab is not visible. Some browsers will throttle hidden tabs, and it was causing low frame rates when doing green screen or digital zoom while multitasking. I'd love some testing of it from others, to ensure no bugs slipped in, and also to let me know if it actually helped.

  • Added some logic to the green screen / virtual background code that tries to lower quality of the effect a bit when low frames are detected, to try to allow slow devices or mobile devices to maintain a better frame rate. If its an issue on mobile, &flagship can disable that code.

** change on alpha (https://vdo.ninja/alpha/)

October 12

  • &effectvalue=1.2 will now work with &zoom (&effects=7), so you can trigger the camera to digitally zoom in on load.

  • Fixed a bug where &border was off by about 5%, causing some blank areas to sometimes show.

  • The sender's sub-gain audio sliders, while working, didn't update text label value fields correctly when making adjustments; that's fixed now.

  • Fixed an issue where some icons were white in dark mode, when they should have been black.

** updates on alpha at vdo.ninja/alpha/

October 9

If you want the VDO.Ninja self-preview to not be mini-sized in broadcast mode, which might be the case on mobile, you can try using &minipreview=0 or &largepreview. These flags will disable the mini-preview functionality, keeping the preview the same size as other videos.

** on production (hot patch) and alpha

October 7

  • &nocaptionlabels added to VDO.Ninja. This disables showing the names when using the &closedcaptions feature, as you might want to only show labels on the video themselves, and not in the transcription text. **available for testing at vdo.ninja/alpha/

October 6

  • Pushed a hotfix for VDO.Ninja related to &deafen not working with &meshcast or WHEP-in incoming audio sources. ** change on production as a hotfix and on alpha.

September 27

  • &totalroombitrate can now take two values; the second of which gets used if the device is a 'mobile' device, while the first gets used otherwise. ie: &totalroombitrate=1000,500 -- useful if you don't know if the guest is going to join via Desktop or via Smartphone, and you wish to avoid overloading a mobile device. **on alpha and GitHub

  • &limittotalbitrate also now has the option for two bitrates; desktop,mobile, just like with &totalroombitrate.

  • The "queue" mode, when applied only to the guest-link, has been extended with new options. These modes do not apply when you have &queue also on the director's link, however, rather just when added to the guest-invite link only.

    These options might be appealing for screening guests when either you don't want to use a transfer room or don't expect too many guests to be in queue. -- I changed &queue to not allow the guest to see the director's video, until the director activates the guest with their pink activate-guest button. Otherwise, it's the same as before. -- &screen now replaces the way &queue worked before, where the guest can see/hear the director, but not other guests, until activated. -- &screen is given the alias &queue2, intending to imply you can use this mode to screen incoming guests by talking to them, before approving them. -- &hold added, with the alias &queue3, which is like &queue, except the guest gets a message telling them they need to wait until approved by the director. They don't see the director until activated, and the director doesn't see the guest's video/audio either - just their control box with any label. Once activated, the director will see the guest's video/audio, and vice versa. -- &holdwithvideo added, with the alias &queue4, which is just like &hold, except the director does see the guest's video and audio before the guest is activated. The guest can't see the director until activated, but does get a message telling them they are waiting to be activated. -- In any of the cases mentioned above, transferring the guest to another room will also automatically activate the guest. You don't need to press the pink 'activate' button if you just intend to transfer them and don't want to talk to the guest you are screening.

** on alpha at https://vdo.ninja/alpha/

September 25

  • Fixed a couple bugs, such as the local screen share preview not re-appearing after full-windowing another guest's video while screen sharing.

** on alpha

September 20

  • Added &forceviewerlandscape to VDO.Ninja, which keeps all incoming videos oriented (rotated) so that the aspect ratio is always above 1, so effectively, forces landscape mode. -- ie: https://vdo.ninja/alpha/?forceviewerlandscape&view=xxx -- This normally shouldn't be needed, as the sender side should control the orientation, but the native app seems to auto rotate back to portrait when the phone is locked. Until that is fixed, this can work around the issue I think, by rotating the video when it detects its been rotated. -- The parameter can take a value, the default is 270, which is how much the video is rotated. You might want to also use 90, or in the case you want it to be locked upside down, you can technically pass 180 I guess? ** This is on alpha for testing

September 15

  • Until I figure out a better way of doing this, I've enabled a way to have a display name be on multiple-lines in VDO.Ninja.

&label=DisplaNameHere\nSubtitleHere Note the use of as a line break ie:


So it's not super obvious how to do this currently, so I think the next goal will be to add the option to let a guest enter their own sub-title, etc, when joining, using dedicated input fields. But until then, I hope this still helps. You can stylize the sub-label within OBS's CSS section, targeting the following CSS, but please note I'll probably be tweaking the CSS/HTML as well in the future:

.video-label>span:nth-child(2) {
    font-size: 50%;
    display: block;
    text-align: center;

** this change is on alpha at https://vdo.ninja/alpha

September 14

  • A Safari mobile bug related to incoming screen-shares not always loading has been addressed. -- This Safari bug isn't present in Safari 17, just older versions it seems. ** fix is on vdo.ninja/alpha/

September 8

  • Version 23 of VDO.Ninja (currently what's on production), has been archived to https://vdo.ninja/v23/, as a fixed version. Version 24 of VDO.Ninja (what's on alpha) will go live at some point soon, so if concerned about bugs, you can lock into v23 now.

  • &rotatewindow=90 (&rotatepage) will rotate the contents of the VDO.Ninja window. It doesn't target any specific video, and can be used on the viewer-side, not just the sender. -- This will be overridden by &forcelandscape mode, if that is used also. -- You can pass 90, 180, or 270 as a value to the parameter, to rotate accordingly. The default is 90 though, if used without any value. -- You might still want to use OBS to rotate instead, but if not using OBS and find the teleprompter app too cumbersome, this is a good option.

  • Added &motiondetection=15, which does a few things when it detects motion in a video (viewer-side). -- It will feature highlight the specific video where movement is detected, if more than one video is included in the mix. Using a custom &layout will disable this feature though, and use the layout instead. -- It will also trigger an IFrame API event, which might be useful if you want to use VDO.Ninja as a security camera; you could script things to auto-record the video or log data events. -- It will also switch to itself in OBS as a scene, which might be how this will be mainly used. (you need to have the OBS browser source's page permission set to high to allow this to actually work) -- You can adjust the sensitivity of the motion detection trigger as a value; the default I think is 15, but it can be between 1 and 64 I think.

** on alpha at vdo.ninja/alpha/ ** GitHub also updated with the newest code

September 5

Fixed a few bugs and pushed to alpha (vdo.ninja/alpha). Thank you for reporting the issues.

  • The Mixer App wouldn't respond to the change-layout API after a director reloaded.

  • When the director was in 'scene preview mode', sometimes a muted camera or screen share would not show video.

  • the vdo.ninja/twitch app failed to show the 'add camera' menu if using a custom VDO.Ninja link.

September 2

  • The director / co-director will be visible in their own solo-link, even if &showdirector isn't added. They still won't appear in normal &scene links, but rather just &solo scene links. This is being done to just simplify the experience.

  • Unless using &remote on the OBS browser source link now (with the right browser source permissions), the remote guest/director won't see the "remote control OBS" menu option appear. Before it would appear, but it would fail if you tried to actually do anything beyond just observe the current state, and that's probably not worth confusing users. -- I should note, OBS Studio v30 beta seems is a bit buggy with the remote control options, but the current OBS v29 works fine.

  • If you create a co-director link, via the room settings menu, I'm including the room password in the URL now, along with the co-director password. This just avoids the confusion between what password the co-director needs to enter, which was turning out to be a common point of confusion. Hopefully this avoids that confusion. If you wish to remove the passwords from the URL for a boost to security, you can still do that of course; users will then be prompted to enter the corresponding required password on joining.

** changes on alpha

September 1

  • I've tried to make the accessibility (for the vision impaired) a bit easier on the main landing and menu pages, as it was a bit too verbose. -- Essentially, I disabled a lot of the non-important stuff, including non-visible elements, as seen by accessibility readers. Also added more titles, and improved the ordering of some buttons.

  • Played around with some CSS elements here and there; if you get a chance to test alpha, let me know if there are any rendering issues.

** changes on alpha

August 28

  • vdo.ninja/alpha/ updated with this change, and Github has also had all recent changes pushed to it.

August 27

** at vdo.ninja/alpha/?clock24

August 26

  • I've updated vdo.ninja/alpha/ to version "24.0b", to signify a large change to the code base.

  • I've merged the Meshcast and WHIP/WHEP features in VDO.Ninja to share about 95% of the same logic, including the URL options. If you want to use Meshcast, you still need to use &meshcast instead of &whipout, but since Meshcast is essentially a WHIP/WHEP server, I just have Meshcast using the generic WHIP logic now. -- Below shows what whip-output options now are fully interchangeable with Meshcast options, since they share the same code. (alias of each other)

mcscale == woscale, whipoutscale
meshcastbitrate == whipoutvideobitrate, wovb
mcscreensharebitrate == whipoutscreensharebitrate, wossbitrate
mcscreensharecodec == whipoutscreensharecodec, wosscodec
mcaudiobitrate == whipoutaudiobitrate, woab
meshcastcodec == whipoutcodec, woc
  • A goal for a while has been to allow anyone to drop-in their own Meshcast replacement, using a third-party WHIP/WHEP server/service. That is, publish to a whip-service, and have viewers of the stream get the WHEP-view link, so they can view via WHEP instead of p2p. I've achieved this finally; close enough at least.

  • There's a few requirements to make it work though, so either an API wrapper is needed or a set of rules needs to be followed: -- If your WHIP server returns an exposed "WHEP" field in the POST response header, with the URL to the WHEP view link, it will use that WHEP link. You just need to then specify the &whipout URL on the sender side then. -- This should let you make your own Meshcast service with minimal work; the open-source WHIP API code I released the other day further makes it pretty easy.

  • If using a cloudflare.com WHIP URL on the sender side, I'll guess at the WHEP link - seems to be working so far. (built this logic into VDO.Ninja directly and works automatically). This of course still implies a unique whip URL per guest.

  • To make using Cloudflare easier though, I've also created the WHIP end point cloudflare.vdo.ninja, which takes a Cloudflare API token, instead of a stream token. -- This special end point will auto-create a unique WHEP URL. The official cloudflare.com whip endpoint can only be used by one sender at a time, but this API special endpoint and token approach can be used by many senders at a time. It automatically generates unique WHIP/WHEP when used, in the same way Meshcast does, so no need for unique invite urls per guest. -- I've created a page to generate the required special api token; the page also provides further information on this all: https://vdo.ninja/alpha/cloudflare -- &cftoken (&cft) is also now added to vdo.ninja/alpha/; this parameter accepts the special token without needing to specify the cloudflare.vdo.ninja part if using &whipout instead.

** on vdo.ninja/alpha/

  • I focused mainly on adding Cloudflare support first, as it has good pricing for its WHIP/WHEP service, it doesn't require deploying anything, and it has a lot of features (RTMP, SRT, recording, API). It's not 100% cooked yet though, so it's just on alpha currently for testing.

August 23

  • I've open-sourced the VDO.Ninja whip API server code and put it on GitHub: https://github.com/steveseguin/whip It's kinda basic right now, but it will probably grow over time into something more broadly useful.

August 17

  • I've been trying to fix a recent &buffer issue where audio/video fell out of sync with a buffer greater than 3-seconds. The new code isn't yet perfected, but the sync is closer -- I'll continue to work on it. Might be best to keep the buffer under 3 seconds though in the interm.

** on alpha

August 13

  • &humb64 and &welcomeb64 added. These are the same as &hangupmessage and &welcome, which already exist, except these new options take an input as a base64 encoded string. VDO.Ninja will decode the base64 on load. -- Base64 values are less likely to get parsed by apps like Slack incorrectly, so safer to share. If feeling lazy, you can also just use invite.cam, and encode the entire link itself; has a similar effect.

  • When using &cutscene or &bitratecutoff on a room scene, it won't trigger due to a director being in the room with no video, unless they are using &showdirector. -- &cutscene wasn't intended really for a group scene; just a solo link or view link, but this fix makes it at more usable with a group scene.

** on alpha

August 11

August 10

  • Fixed an issue where using &cover and &showlabels, a newly added video to a scene might have had a larger label size than the other labels.

  • Fixed an issue where deleting a label for a guest as a director didn't remove the label from guests/scene.

  • I think I improved the local recording option, specifically for directors, where record-all didn't always work correctly.

  • If a local recording fails, due to no media tracks being present, it will not turn the record button red now.

  • Some minor text and labels fixed here and there, mainly impacting self-hosting.

** on alpha at vdo.ninja/alpha/

August 9

  • Added &nomirror to VDO.Ninja, which unlike &mirror=0, disables the default mirror state of the video preview for a guest. Previews are often mirrored by default... &mirror can be applied on top of that state, to mirror things back for everyone if needed. On alpha at https://vdo.ninja/alpha/?nomirror

August 6

  • &pipme (aka &mypip or &pip3) will cause your self-video preview window to pop out into its own picture in picture (floating/draggable) on load. -- this is not compatible with &autostart -- works with director or guest; not tested on mobile.

  • CTRL + ALT + P will also toggle the picture in picture, without needing any URL parameters. (cmd + ALT + P on Mac)

  • Added experimental support for a built-in browser background blur effect; uses 4x less CPU in theory I guess, but it only works with Chrome on Windows and only with some systems/cameras. I don't actually know if it works or not, as its not compatible with my system, but *if & you see it in the effects list as a second blur option, let me know how it goes.

** on alpha at vdo.ninja/alpha/

August 5

  • A few minor fixes: -- Rainbow puke button in darkmode is correct now -- New &pipall feature doesn't break the site if browser does not supported -- Added a new experimental background blur effect; &effects=13 I think, but it's not supported by most browsers/systems and its in origin trial, but it it works for you, let me know -- The startRoomTimer remote API command now works with specific guests (as well as for everyone still) ** changes on alpha

August 3

July 31

  • Added a flag called &notios, as in "not iOS". It just tells the system that it's not an iOS device, or iPad, even if it is. This might change the behavior of the phone in certain ways, mainly for the purposes of debugging.

  • Updated the rotation logic so it supports legacy and now also future-API standards.

  • Rotating on Firefox should trigger the rotation event about 200ms faster now (found a faster event API).

** everything is updated on production and alpha

July 28

  • Updated the logic for &noremb, &nopli, and &nonack advanced viewer-side flags; there were some scenarios where they didn't kick in if used. I tried to fix that a bit. These flags in theory I think should help try to force a bitrate or resolution, regardless of network conditions, but in practice they still seem to just smash your frame rate. I haven't really been able to find a good use for them yet, but let me know.

  • Fixed an issue where when you hung up on an iPhone, it would still stay the camera/mic was in use at the goodbye/reload page.

  • Fixed an issue with Firefox mobile's camera rotation being wrong in the local preview. (let me know tho if the issues continues tho)

  • Firefox mobile should not go to sleep any more when idle.

** all above changes pushed to alpha for testing at vdo.ninja/alpha/

July 25

  • Released VDO.Ninja v23.8 into production, so GitHub, alpha, beta, and production are all now in sync with all current features/fixes. -- Production was last updated a few weeks ago (v23.7), so the main reason for this minor update has been to activate the native app's new web-view mode custom UI.

July 24

July 23

  • Added options to start/stop/pause the group room timer as a director to the remote http/wss API.

https://api.vdo.ninja/test123456/startRoomTimer/null/600 - start 10min countdown timer
https://api.vdo.ninja/steve123456/pauseRoomTimer - pause timer
https://api.vdo.ninja/steve123456/stopRoomTimer - stop timer
https://api.vdo.ninja/steve123456/startRoomTimer/null/600 - start timer that counts up from 0

for eg: https://vdo.ninja/alpha/?director=countrytownc&api=test123456 test director ** on alpha for testing

July 20

  • Fixed an issue where adding a screen share to a group didn't work, along with some other director-related commands targetting a screen share.

*on https://vdo.ninja/alpha/

July 19

  • Updated the translation files with site/text changes from past few months; should help improve some of the breaking button translations, etc.

  • Updated the translation logic quite a bit; it should further help with some translation issues.

  • Tweaked the director's room CSS a small bit; mainly to help fit languages with long words that don't fit in some buttons.

  • Made some major changes to the way Firefox Mobile handles device rotation. Before, it didn't. Like, the camera didn't rotate when you rotated your device, nor did &forcelandscape mode work. Well, that should should work now (to the extent possible with Firefox).

  • Made the code more patient for both Firefox and Mobile device, particularly when it comes to changing cameras, loading the camera, or applying settings to a camera. Mobile devices, especially Firefox Mobile, seem to like being given a few seconds to process camera changes before accepting new changes. (else crashes or cameras freezes, etc).

  • When switching cameras on Chrome desktop tho, I've made the switches a bit faster; nearly as fast as it will let me. Seems stable enough to let me.

** on alpha

July 18

  • Improved the media file sharing option so that you can now change to a new media file while streaming, without having to reload the page to select a new file

  • Fixed an issue where going to the next video in a playlist of videos caused the stream to get stuck

  • This media file option has long existed, but it's not really used as I suppose you can just screen-share a video instead. Access it by adding &fileshare to the URL: ie https://vdo.ninja/alpha/?fileshare

** on alpha

July 17

  • If the director uses &password=false in the URL or creates a room with password set to false or 0, that will be reflected now on the invite/scene links.

  • Fixed an issue where Firefox Mobile on Android would sometimes have the camera crash if changing changes.

*changes on alpha at vdo.ninja/alpha/

July 15

  • Using &room&director together now gets handled better

  • Minor fix to solo talk with the remote API

  • Alt solo talk support added to the remote API

July 13

  • &batterymeter added, curtesy of @Yong. -- you can read their notes here: https://github.com/steveseguin/vdo.ninja/pull/1078#issuecomment-1627799535 -- It's the same concept of &signalmeter, except shows the battery meter for guests that are on devices with a battery that's draining/charging. -- Shows blinking warning if under 25% battery life. -- The battery meter was already available by default as the director, but now it can be enabled as a guest, etc. -- Also supports disabling the meter with &batterymeter=0. ** on alpha and GitHub

July 10

  • Fixed an issue where changing video/audio sources/settings broke the WHIP out stream.

  • &stereo should work now with the WHIP-Input mode (?whip=xx&stereo), assuming the source supports it (VDO.Ninja whip-out does)

I'll keep improving the support for WHIP/WHEP. Lots to do. Suggestions welcomed also. ** on alpha pending a bit more testing

July 9

July 7

  • Fixed an issue with some private turn servers hosted by others and niche compatibility issues when used with the speedtest.

  • Fixed an issue where the control bar would appear for guests that have joined without video and were added to a manual group scene.

  • Fixed an issue where the avatar image didn't appear always (was triggered I think with scene=1 or using group I think).

  • &stereo=6 is added. Unlike &stereo=1, it doesn't change the default bitrate/aec/denoise/autogain settings; solely just enables stereo for both in/out.

** changes on GitHub and on alpha

July 4

  • Added &meterstyle=5, which has the audio-only background image pulse larger in size when that specific guest is speaking. This is just another new way to tell when someone is speaking; there's several ways now.

    --- It can be used in conjunction with &bgimage to specific a custom background image for the video, which will pulse in size. ie: &meterstyle=5&bgimage=./media/avatar1.png

  • When using &meterstyle=4, or greater, the background of an audio-only element is transparent now; not black. I also specifically hide the video-control bar when using &meterstyle=4, but you can use &videocontrols to add them back in if needed.

  • When using any &meterstyle effect, I now I include a data attribute called data-speaking to the video element. It will be either 0, 1, or 2. 0 is quiet, 1 is whispering, and 2 is loud. &meterstyle=4 includes a fine-grain option already for loudness as an attribute, but for basic CSS needs, this option might be more approachable.

    -- You can use this attribute to use CSS to customize your own effects when someone speaks. You can further target what is CSS used based on a specific guest by using each video's stream ID data attribute as well.

  • &bgimage2 and &bgimage3 were added, and work in conjunction with the existing &bgimage parameter. You pass an URL-encoded image URL to each, and when a guest speaks, it will switch their background image between the 3 possible images, based on their loudness.

-- eg:


-- I've included some hand-drawn avatar sample images to test with; they are the default values for &bgimage, &bgimage2, and &bgimage3. (ugly, but mean to be just placeholders) -- The images will only show when there is no active video and is essentially the same as using &meterstyle=4 with some custom CSS to specify the behaviour, but it is not stream ID specific however.

** on vdo.ninja/alpha/

July 1

  • Added &whipoutcodec=av1,h264,vp8 (&woc), which lets you specify the WHIP video output codec. It can take multiple values; if not used, the default at the moment is open264

  • Added &whipoutaudiobitrate (&woab) and &whipoutvideobitrate (&wovb), which lets you specified the WHIP audio and video bitrate (kbps).

  • &stereo now works with the WHIP output, so if enabled, you'll publish stereo 2.0 with a default audio bitrate of around 80 to 100-kbps; otherwise the default is mono at around 60kbps. These defaults bitrates might be changed own the road.

  • The WHIP sandbox test page is now configured with two drop down menus to let you select bitrate and codec for when publishing to a WHIP output.

  • The Twitch WHIP output example now has a default bitrate of 6000-kbps if used. The video codec for whip out by default is openh264, and the twitch output option uses that by default. (The Twitch defaults need to be changed via URL manually.)

  • Just a reminder you can test the WHIP out by publishing to the VDO.Ninja whip-in URL (https://whip.vdo.ninja/STREAMID and for playback, https://vdo.ninja/?whip=STREAMID).

** all changes are on alpha, with the updated whip sandbox here: https://vdo.ninja/alpha/whip

June 28

  • Added &slot=N, which is a guest side property (sender side). It just tells the director (Mixer App / &slotmode) which slot the guest should prefer to be in, if slots are being auto-assigned. If the desired slot is already taken, then that guest will then not be assign a slot. If the guest was assigned a slot by the director, refreshing will keep the assign slot, and the URL-specified slot preference will be ignored.

  • Fixed an issue where custom scene names in the director's room were incorrectly being capitalized.

  • I updated &orderby to work with non-director view links, such as with scenes or guests.

    -- Previously &orderby only worked with the director's view to sort the positioning of control boxes, based on the stream ID, but now it can apply to the auto-mixer. -- The mix order, or &order=N, of each guest takes priority over the name when sorting. By default all guests have a mix order of 0, mind you. You can change it dynamically as a guest, via the mix-order option in each guest's control box, or pre-assign it via URL with &order=N on the guest invite.

  • I also added &orderby=label as an option, which will sort based on the display name (&label) of each video, if the label is set, instead of by stream ID.

    -- This option doesn't apply to the director's view at the moment, but it does work when used with respect to the auto-mixer (guests/scenes). -- The label sort ignores letter casing, while the default stream ID includes letter casing in the sorting logic.

*** on alpha for now

June 27

  • &sticky and the "save room" button won't work for links loaded in OBS Studio anymore - there isn't a usecase for this really, and using &sticky there just complicates things for some users.

  • Modified the initial p2p connection logic in VDO.Ninja to be a bit more aggressively in dealing with signaling distruptions caused by extreme packet loss and lag. So if a browser can't finalize the connection after X seconds, I just force restart it now, without waiting for it to error. I think this will reduce how often two guests in a large room can't see/hear each other. Let me know if you experience new issues tho as a result.

  • Improved some communication logic related to transfer rooms, where a director transferring a guest into another room with broadcast mode or queue mode being enabled didn't always work as intended if the guest had a high ping (>500ms). Transfers will take a bit longer to kick in now, upwards of a few seconds in some cases, but that transfer issue should be fixed.

  • Updated the &hidecodirectors viewer-option with the aliases &hidedirector and &hd, but also changed the logic so it stops the video/audio/IFrame/widget data from any director loading.

    --- This is a bit like the opposite of &showdirector, but only viewer side. --- Another change is that it works with more than just one codirector hiding another codirector, but can be used with scenes, view links, or guests. --- Lastly, this is not like &exclude, as it still allows the data-connection to happen between the two peers, allowing chat and two codirectors to sync their dashboards/commands. Keeping data connections active is important for directors, who rely on them to issue commands, so exclude is a bit to harsh in some cases.

** all changes pushed to production

June 26

  • Added &poster as a URL option; lets you specify a poster image for videos that have not yet started playing. (using the built-in HTML poster attribute) - This flag takes an encoded URL, pointing to a CORS-accessible image file.

  • Added &hideplaybutton, (&hpb), which will hide the default big play button that overlays a video when auto play is not allowed. This option is useful when you want to perhaps include your own playbutton as part of the poster image.

Example of the commands:


** on alpha for testing

June 19

  • Created &queuetransfer (&qt), which will transfer a guest from one room into another, but one transferred, the guest will be in Queue mode. So they won't share their video with anyone by the director.

  • Added an 'activate guest' button to the director's controls, so that when a guest connects in queue mode, (yet the director isn't also in queue mode, as is typical for a queue mode setup), the director can take any select user out of queue mode.

    --- This has the result of guests joining a room in queue mode, and only being able to see the main director by default. --- In this mode, the director can at any point allow the guest to see and talk to everyone in the room by taking them out of queue mode by activating them with the button. --- You could of achieved a similar function to this 'activate button' as just transferring the guest back to the same room, but this has some polish and is less confusing.

  • Some more CSS fixes when in dark-mode, plus the create room buttons are now green.

** on alpha and now also on production

June 14

  • Few CSS fixes, including a larger thumb-button for the input value sliders, making it easier to use on mobile devices, and the START button on darkmode had a text-color fix.

  • I've added &broadcasttransfer (aka &bct) as a URL option, which will let you specify the default for whether to transfer a guest from room to room in broadcast mode or not. Mainly useful for when using &rooms, since there isn't a transfer menu option when using it, since its more of a hotkey option.

  • I made some fixes to the UI as well, related to &queue and &rooms and the upload button (which is now part of the chat pop up).

  • When a guest has a network disconnection with the handshake server while in a transfer room, I do a better job properly closing all existing peer to peer connections, and putting the guest back into the main lobby room. The improved logic also works with &include, so if you specify a stream via &include that isn't in a room, it won't be disconnected like other non-excepted stream IDs.

** changes on alpha

June 8

  • Updated production with some fixes, such as director's view has the guest mute state working again, stats work with screen sharing in screensharetype=3 mode, green screen updates, and a few UI glitches.

June 7

June 6

  • Bug fix: Firefox forgot to make this new 'active' feature of theirs work with audio tracks, which caused a recent issue here with solo-talk + Firefox users.

    I think I've fixed the issue for now though, by having audio-tracks still use the old method of muting Firefox streams, while allowing video tracks to still use the new method. I've pushed this fix to alpha for the time being; testing welcomed. I've also submitted a bug report to the Firefox devs.

June 4

  • Fixed a recent Meshcast issue where the director wasn't able to select the Meshcast server manually before going live.

  • Fixed an issue where if you joined as a guest via iOS, if you didn't select video when joining, you couldn't enable your camera later via settings.

  • Fixed an issue (i hope) where joining as a guest via iOS without selecting your camera caused a black video to play full screen until closed. (seems like it was caused by a recent UX/security decision on apple's part? so this may end up being just a temporary hack if apple keeps poking at this new concept).

*on alpha

June 2

  • Fixed a recent issue where the director's screen share would appear in the OBS scene (not their webcam though), without having &showdirector added.

** update is currently on alpha, just pending a bit more testing. https://vdo.ninja/alpha/

May 30

  • The VDO.Ninja getDetails API request returns some added details for slots-position & active-speaker.

  • When using the JSON Layout blob (&layout=jsonblobhere) obtained from the Mixer App, the director in &slotsmode will now be able to change who is in which slot without the Mixer App open.

  • The Twitch WHIP ingest endpoint now works directly via VDO.Ninja (rather than via a proxy server I had hosted).

  • Played a bit with the audio loudness metering styling. More feedback welcomed.

** changes on alpha

  • New larger web server for VDO.Ninja going to go live tonight - same website, but different server. Should be a smooth transition, but fyi.

May 28

  • Added &playchannel as an option to VDO.Ninja, which will play either the left or right audio stream-only for an incoming stereo stream. -- It will play back the selected channel as mono audio, dropping other channels from the playback. -- &playchannel=1 is left channel; 2 is right; and if multi channel works for you, then you can target 6 different channels. -- This is useful if you wanted to capture the left and right audio channels of a remote guest in OBS in different browser sources, without having to do any fancy audio routing on the studio side. -- Both left and right audio channels are still sent; it's just during local playback that the non-selected channels are dropped, so it's not as efficient as local routing, nor will both channel be in exact sync anymore either. -- This will not currently work in conjunction with &panning of &channeloffset; and will override those options. Example usage: https://vdo.ninja/alpha/?view=XXXXXXXX&stereo&playchannel=1

** on alpha for testing

May 26

  • Pushed a bug fix to VDO.Ninja production and GitHub, where a temporary loss of Internet could cause a waiting viewer to not notice a publisher has started streaming. This only happened in a niche situation of settings, and would self-fix itself after a while already, but this fix should have it resolve instantly now. The backup check option, in case everything fails still, also now checks 4x more often, just for added assurance.

  • Fixed some minor CSS font/coloring issues in VDO.Ninja, specific to darkmode. Also some changes to the VU meters, but more changes to come there.

May 24

  • When the director share screens now, their screen share will count as a second-video stream, so they can share both camera and screen share with guests by default. No need for &screensharetype=3. The exception to this rule is if using &broadcast as the director, which will have the screen share mode be screensharetype=1 (one shared stream for webcam+screen sharing). This is just due to the nature of broadcast mode.

** on production

May 23

  • Firefox now supports the option to fully-pause the encoding of a video stream to a guest. As a result, I've now updated the code to distinguish between new and old Firefox versions that support this ability.

    -- The director can now "fully stop' the preview for an incoming Firefox-based v110+ guest stream, rather than just limit it to ~ 30-kbps @ 1-fps or so. -- When a Firefox v110+ guest full-windows their own preview, it won't pause the video stream for other guests like it did with older versions.

** updated on production and alpha

May 17

  • Added &meshcastcode (&mccode) as an option, which lets you specify the Meshcast server to use. This was already possible with just &meshcast, but if you wanted to specify audio/video-only modes as well as the server, this new option will let you specify the server another way, allowing both options to work.

    ie: https://vdo.ninja/?meshcastcode=cae1&meshcast=video

  • Couple minor bugs fixed; one related to &cover and dynamic resolutions

  • The mobile settings slide in menu in darkmode is now made transparent

  • Added a spacing between the hang-up button and the other buttons on mobile; avoids misclicking

  • Few other CSS changes to the settings menu

** all recent changes now available on production, beta, and alpha.

May 14

** this new mirror feature is on alpha for now at https://vdo.ninja/alpha/. Feel free to test and let me know how you fair.

May 10

  • Highlighting a guest as a director won't apply the solo highlighting to viewers/scenes who have &layout applied to their own links. The layout is assumed to take priority. (let me know if you have feedback though)

  • Fixed a couple reported bugs in the new release. Please keep any bug / issue reports coming ⁠⁠🐞│bug-report discord channel

May 9

  • Added &nomeshcast as an option in VDO.Ninja. This is a viewer-side option that tells a sender to provide a p2p stream, rather than a Meshcast stream, if they have &meshcast active. A bit of a niche option, but might be useful if bandwidth or latency is a consideration for a specific viewer, like the director. ** this change is on alpha, https://vdo.ninja/alpha/

May 8

  • New version of VDO.Ninja released into Production at https://vdo.ninja/. v23 now live. If having problems, - Please do a hard browser cache clear and refresh, especially in your OBS browser sources and if on mobile. - If still having problems, the previous version of VDO.Ninja can be found here: https://vdo.ninja/v22/ - Report any issues you have with the new version in the ⁠🐞│bug-report discord channel Release notes will be coming over the next few days probably, but some quick highlights are: - the Mixer App has been improved, including with the option to sync OBS scenes to Mixer layouts - connection stats has new features and important fixes to the candidate type stat - a refresh to the UI, with a large contribution from Lindenkron there - chunked mode improvements and options to dynamically change the buffer have been added - Initial WHIP/WHEP support added, including a test page at https://vdo.ninja/whip

May 5

  • Fixed an issue with mobile publishers, where if you rotated the phone from initially portrait mode, switching to landscape mode, the resolution after might have been still limited to the portrait resolution (but with just a rotated orientation). I'm now double checking that the outbound encoded video resolution per stream is maximized every time the sending device's orientation changes.

  • Added some more debugging stats into the VDO.Ninja sender's side stats menu. -- three new video bitrate stats, useful for debugging. You can see what the initial bitrate was set to, the current bitrate target, and any max-bitrate target. -- these stats won't appear if they aren't set.

May 4

  • Added &minipreviewoffset (&mpo), to alpha. This accepts an interer value, -20 to 120, which is used to position where the mini preview is located by default on screen. &mpo=40 would imply center of screen, as the mini preview is about 20% of the screen size. &mpo=0 (or just &mpo) is the left-most side of the screen.

May 3

  • Fixed an issue where if the main director reloads their page, they will have the current director state updated on load, provided by any existing co-directors in the room. Before, only director -> codirector and codirector -> codirector state syncing worked, resulting in the room's state being cleared whenever the main director reloaded.

  • Fixed an issue where the mute-video track button didn't always appear when a director with an active video track.

    changes to VDO.Ninja on alpha at https://vdo.ninja/alpha/

May 1

  • Added &suppresslocalaudio as a new URL option. This will disable local audio playback of a Chrome tab while screen-sharing it. This can be used with the new WHIP output of VDO.Ninja to publish a VDO.Ninja scene directly to Twitch, without having to deal with any audio feedback issues while having that scene tab open.

  • &prefercurrenttab (have the current tab as the default screen-share source)

  • &selfbrowsersurface, which excludes the current tab as an screen share source option. (you can pass include or exclude as a value to control this though)

  • &systemaudio, which excludes the system-audio as an audio source when display sharing. Tab audio is still available though. (can help prevent accidental audio feedback loops)

April 27

  • Continuing to tweak and improving the styling of VDO.Ninja.

April 25

  • Videos should auto-play within VDO.Ninja if using &noaudio. This was already the case if using &mutespeaker.

  • I changed the logic for dynamic resolutions (optimizing to fit window). If the requested resolution is 1920x100 now, instead of requesting ~170x100, the auto mixer will now request 1920x1080. This should account for cases such as using &cover, improving video quality, despite not being super efficient.

  • Added more IFrame API events and deprecated some older events (for those using the IFrame API). * changes on alpha at vdo.ninja/alpha/

April 19

April 18

  • In VDO.Ninja, when switching between the scene-preview and the director view modes (used in the Mixer App), the app will ramp up the bitrate in the scene mode to 500-kbps now (instead of staying at 35-kbps), and then switch back to the preview-targets when switching back in the director mode. This makes things work a bit closer to what is expected by the user, while also increasing the scene-preview's quality significantly (without still being a huge stress on the guests). ** change on alpha at https://vdo.ninja/alpha/

April 17

  • &mute works with the director now, so the mic starts muted when you enable your microphone or when using &autostart

  • Fixed an issue where if you used &style=N on a guest, the director isn't able to "hide" them from the auto mix.