Updates - VDO.Ninja
- Fixed a recent issue where the director's screen share would appear in the OBS scene (not their webcam though), without having
&showdirector
added.-- If the director wants their screen share to show in the scene, but not their webcam, they can use&showdirector=3
now instead. -- The screen share still shows for the director, in its own control box, but add-to-scene options are hidden and some text clarifying the performer state of the screen share is provided.
- 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.
- 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
- 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.
- 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 bescreensharetype=1
(one shared stream for webcam+screen sharing). This is just due to the nature of broadcast mode.
** on production
- 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
- 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
- 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.
- Added an option for the director to mirror a guest's video -- This applies globally, so within scenes, other guests, and for the actual guest -- If a guest's video preview is mirrored already, such as if using
&mirror
, this function will mirror their local mirror effect; so it doesn't override it, but applies on top of it for them. -- If a guest mirrors someone else's video via the right-click context menu manually, if the director changes the mirror for that video, it will override what the guest has set. They can always re-mirror it manually, but the director in this case takes precedent.
** 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.
- 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
- 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/
- 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
- 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.
- Also added a bitrate slider for the sender-side to the stats menu, so you can adjust the video bitrate that you are sending for that particular viewer. -- you can't set it higher than the initial connection bitrate, if it was set, or the max defined bitrate. -- the default max of the slider will be either the initial/max bitrate of the connection; or otherwise 6-mbps. -- it updates on release of the slider and will take upwards of 3 seconds to take effect, if it can. -- also, importantly, this is not available to any user within a group-room. This is purely available for simple push/view setups. If you find this new data / tool useful, particularly if it helped fix quality issues, please let me know how it helped so I can invest more time into it.
- If an
iPhone 12 (and up)
user is detected, who is usingiOS +16
, with theREAR camera selected
, and who has&quality=0
(high performance) mode active, then1080p at 60-fps
will be enabled. So yes, iPhones actually work at 1080p60 now.. related to this update, the stats menu has more data: -- The viewer stats menu show the iOS version now by the browser stats: ie: Safari 16. (I'd recommend updating to iOS 16.2 if you do have an iPhone.) -- The stats menu now shows whether it thinks the remote iPhone is an iPhone 12 and up (SE versions excluded) -- "iPhone 12 and up" will be true or false.** on alpha at vdo.ninja/alpha/
- Added
&minipreviewoffset
(&mpo
), to alpha. This accepts an interer value,-20
to120
, 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.
- 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.
- Added a report bug feature back into VDO.Ninja; it might show up in some cases in the lower-right hand of screen, where clicking on the bug icon will let you submit the app logs to me for analysis. It will appear more often on alpha than on production, to avoid being a nuisance.
- 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.
&selfbrowsersurface
, which excludes the current tab as an screen share source option. (you can passinclude
orexclude
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)
&displaysurface
will pre-select "display-share", rather than tab-share, when screen sharing. You can passmonitor
,browser
, orwindow
as options to customize this though.For more details on these new features see here: https://developer.chrome.com/docs/web-platform/screen-sharing-controls/ (Chrome/chromium-browsers only) * on alpha
- Continuing to tweak and improving the styling of VDO.Ninja.
- 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/
- Added
&structure
as an option, which will have the video holding div element be structured to 16:9 (or whatever&aspectratio
is set to), making it easier to apply custom CSS backgrounds to videos. -- It will have the label/border/margins align relative to the 16:9 holder element, rather than video itself. -- Also related, you can also specify the background color independent of the border color with&color
(new). If using&border
, it will not set the background color, so you may need to use both&border
and&color
. -- May not yet work with&forcedlandscape
or&rotate
. - Added
&blur
, which will try to add a blurred background to the video so it fits the structured video container -- Using&blur
auto enables&structure
. -- Code in the auto mixer, so you won't see the effect in a simple preview or some self-preview types. --&blur
doesn't work with&color
, etc. -- You can change the blurring intensity with&blur=25
or whatever;10
is default --&blur=0
works as well -- may be buggy if using it with&forcedlandscape
or&rotate
- Added new accessibility options, include button states using the
aria-pressed
attribute. ** changes on alpha. ie:https://vdo.ninja/alpha/?scene&room=ROOMNAME&blur&margin&border&structure
- 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/
&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.
- You can now publish from VDO.Ninja directly to Twitch. -- Go here, https://vdo.ninja/alpha/whip, enter your Twitch stream token in the correct field, GO, and then select your camera in VDO.Ninja as normal. -- There's also a new development version of OBS Studio that has improved support for direct publishing of OBS -> VDO.Ninja (via whip) here: https://github.com/obsproject/obs-studio/actions/runs/4711358202?pr=7926
- Added
&effects=8
, which might be useful if using a Camlink or simple HDMI capture device and&record
mode. The current&record
mode doesn't seem to always scale down the video before recording (browser issue it seems), so local file recordings might be 4K in size, despite the target resolution being set much lower.&effects=8
will use a canvas to first resize the video though, and then recordings will be based on that, making smaller recording sizes possible. (You could also use&effects=7
, which then provides digital zooming controls and is otherwise the same thing). This&effects=8
mode might also be helpful in solving issues with cameras disconnecting or having their frame rate change while recording, causing issues with the recording. The canvas acts as a reliable middle man between the camera and output video stream, so if the camera's input stream fails, the recording stream will not be impacted, other than perhaps skipping some frames. The canvas is sensitive to CPU load or browser throttling though, so frame rates may fluctuate more often when using it, so I can't suggest using it unless the guest/user is known to have a problematic camera. ** on alpha - Added a new IFRAME code example that prompts a guest who is joining a room with a message if the director is not there yet. The message clears when the director joins the room. This sample can be used like a normal vdo.ninja/?room=xxx link (as seen below). The code is extremely easy to customize or embedded into your own websites. The code is just provided as an example. https://vdo.ninja/examples/waitingroom?room=TESTROOM123
- Control bar styling for VDO.Ninja has been overhauled to look a lot nicer, curtesy of @Lindenkron. This style update is available on vdo.ninja/alpha/ and on GitHub.
- Added the number of CPU threads (logical cores) to the stats in VDO.Ninja, as well as the check/results testing page.. (update on alpha & GitHub)
- Fixed an issue with
&forcelandscape
, with the patch on https://vdo.ninja/alpha/; the viewer side should have the video rotate now also; not just on the guest side. This is still a bit iffy, but feedback welcomed.
- The VDO.Ninja's director's interface and control bar UI style has been further updated on alpha. (design improvements by Lindenkron)
- The Social Stream and VDO.Ninja HTTP/WSS remote API server went thru some changes; let me know if you have any sudden new issues
- Added a "restart connection" button to the sender's side stats menu. I'll tinker with this a bit more, but the notion is if you are having problems with perhaps audio or video quality gets "stuck" low, you can try to restart the connection without refreshing the page. -- if this works well for users, I'll see about adding something into the code to automate pressing it when problems are detected (if possible). -- button only shows on compatible devices/ browsers -- not all devices support reconnection in this way.** on alpha at vdo.ninja/alpha/ and on GitHub.
- Based on user feedback, I'm testing the concept of a "join with mic-only" button. -- You can enable it with
&miconlyoption
(or&moo
). -- It's exactly the same as join with video, except the video device is not selected by default. -- When used, a mic only button shows if a guest joining a room, and if&audiodevice=0
is not present. -- Hoping this will give more users courage to click the join button, but if it causes issues, I may revert.** on alpha for testing at https://vdo.ninja/alpha/?room=someetestroomhere&moo
- Our very own @Lindenkron on Discord further improved the styling of the director's control boxes on alpha.
- VDO.Ninja updated on GitHub and alpha with all recent changes.
- If a VDO.Ninja guest has
&chunked
added, the viewer or another guest can now use&nochunked
to ignore the chunked version, and use the low-latency version. In this way, guests in a room can still use the low latency streams to chat, but publish chunked video to OBS for (delayed) high quality video. - invite.cam updated to support the recent
&headertitle
and&favicon
feature. (use via the encoded input URL, such as VDO.Ninja; not the invite.cam URL)
- Adding
&headertitle
and&favicon
as options. These will change the browser's page title and favicon image, respectively. -- Passed values should be URL encoded (Google URL encoding if needed). -- Since this is Javascript based, the values only update once the page loads. Meta-page-previews will likely not reflect the values. ** on alpha Sample link:https://vdo.ninja/alpha/?headertitle=LINDENKRON4TW&favicon=https%3A%2F%2Fmeshcast.io%2Ffavicon.ico
- Added a
disable video
button as a new director's remote control option. This will remotely disable the guest's video in the same way that the guest themselves can disable it. -- The guest can't override it (unless they reload the page I guess). -- This disables the video preview for even the director, as its disabled as the source, so there isn't for even a solo "view" link to override it. This then is a bit more of a sure-fire way to disable a video from a guest. -- The previous "hide guest" button still works, but has a new icon. This differs from the new "disable video" in that the director can still see a preview of the guests video and it also hides any avatar/style-place-holder. When "disabling video", audio-only styles and avatar placeholders may still work. -- The guest gets a little note in their header bar that the director muted them when enabled. Also, the guest is unable to see their own video preview when enabled, hence the need for a message.** on alpha https://vdo.ninja/alpha/, by user request. Please report any issues/feedback regarding it.
- Right click a video and click
Snapshot to Clipboard
to save the current video frame to the clipboard as a PNG image. This can be pasted into most applications, such as Photoshop, for quick use in a production-- Also the option to save to disk** on alpha @ vdo.ninja/alpha/
- If using
&permaid=streamidhere
to specify the stream ID, rather than just&push
, will save that stream ID to local storage and reuse it every time&permaid
is used without a stream ID -- You could also just use&permaid
on its own initially, which will auto assign a unique stream ID and save that generated one to local storage, which makes it easier to use one invite for many users, but have VDO.Ninja manage the stream ID assignments. -- If not using&permaid
, it will just default to using&push
with a random ID. (this avoids 'stream already in use' mishaps) * on alpha
- Pushed a fix for
&screensharetype=3
not always updating the layout; specifically when VDO.Ninja is used in an IFrame. Update on alpha and also all code has been pushed to github.
-
&codecs
and&videocodec
were added; these are an alias of&codec
. Additionally,&codec
(and these new aliases) can now accept comma separated values that define the order of preferred video codecs if the primary one fails. You might want this it you want AV1 to be the main codec, falling back to H264 rather than VP8 if not supported. ie:&codecs=av1,h264
- Added an option to count-up from 0, rather than count down. You can set the time to 0 to count up, or use the checkbox to enable it.** changes on vdo.ninja/alpha/
- Fixed an issue with
&screensharetype=3
where a screen share when stopped would continue to be listed as an "unknown user" in the hidden user list. - When a guest is using
&screensharetype=3
, the screen share holder control box that the director sees dims when that screen share stops. It does not disappear though. - When recording iPhone/iPad videos in portrait mode with Chrome as a remote VDO.Ninja viewer, the videos should be saved correctly (both via p2p and with Meshcast), rather than in a chopped-in-half corrupted version.
- Added
&postapi
(aka&posturl
), which lets you specify a custom POST URL to send events within VDO.Ninja to. -- data JSON encoded, post URL requires HTTPS+CORS, and the passed URL parameter value needs to be encodedURLComponent. ie:&postapi=https%3A%2F%2Fwebhook.site%2Fb190f5bf-e4f8-454a-bd51-78b5807df9c1
-- If you don't want to listen for events with the websocket server API I host, you can use this with your own API https server instead and get key events pushed to you that way - Development Progress update: WHIP and VDO.Ninja I've been slowly improving the WHIP/WHEP interface for VDO.Ninja. It's a bit mentally exhausting, but there is some progress up on alpha: - WHEP in now added (test with cloudflare whep out), - WHIP out now added (tested with cloudflare whip in), - WHIP in improved a bit (tested with a private build of OBS and Larix, but isn't 100% stable yet) Still working on WHEP out and all the polish/integration that goes with this all. Hacking support in is one thing, but having it all work well with the rest of VDO.Ninja is tricky. One challenge is the interface and configuration for these WebRTC options. To help make it easier to play with things, I've created a little config page to test the very basics with. Many WHIP/WHEP apps are just as buggy/limited with their support as VDO.Ninja is, so incompatibilities and unstable behavior is unavoidable in the near term. Happy to work with others in the community to improve cross-app support.** changes available for testing at vdo.ninja/alpha/
- If you hover over a name in the Not Visible user list, it will show the stream ID as a tool tip. (useful if it says "unknown user").
- If you
CTRL + Click
on the user name in the list, it will open that user stats menu, showing all details: system deets, stream ID, settings, etc. - Applied a fix for recording iPhone video that's portrait mode; might be properly oriented now when saved? ** on alpha
- The default for iOS 16-devices and newer will now have 720p60 selected by default, rather than 720p30. 60-fps still isn't working at 1080p on iOS, but baby steps I guess.** on alpha at vdo.ninja/alpha/
- Pushed some audio-related fixes for iPhones onto alpha. The audio-meter was active even when muted, and I think I fixed that now.
- Added a volume control to the list of hidden users. As well, when you close the hidden user list, you can open it again via a little icon that appears in the lower-right corner (an icon with two masks).** on alpha at vdo.ninja/alpha/
- Some translations updated (via Lindenkron)
- Tycho and Lindenkron fixed a few random typos/errors in the code base
- The UI/CSS for the director's room control-boxes has been updated/improved. The majority of this effort was done by Andrewww, which is also his first repo commit. -- you can see we adopted some color coding (actual colors might get changed over time), which was inspired by Lindenkron. -- the CSS / HTML is slightly less rigid, so should be easier to customize with custom css by users. -- rainbow puke button removed, (but is still available as the sender if you
CTRL + click
on the video preview) - I added in a little "minimize" button to the control box, which lets you minimize it. It's not all that robust, but it might come in handy for hiding a couple annoying windows (like a co-director) that is taking up space.** changes on alpha at vdo.ninja/alpha/
- Added the option to "pin" the room-settings to the side of the director's room. This way you'll have access to certain global/room settings quickly, if needed. (expect some tinkering over the following weeks though)
- Added buttons to the room settings to start/stop all recordings; both remote/local.** these updates are available on alpha at https://vdo.ninja/alpha/ for testing/feedback
- If you hold CTRL when clicking highlight, the target guest becomes 75% of the screen (not 100% as normal), leaving room for other guests along the side.
- Fixed an issue where when using
&screensharetype=3
, stopping the screen share as a guest didn't clear it from the screen (a frozen image remained). That should be fixed now. - That "are you sure you want to quit" pop up now appears when joining VDO.Ninja by either of these links; before it only appeared in the laterhttps://vdo.ninja/alpha/?room=roomIDhttps://vdo.ninja/alpha/?room=roomID&push=XdTX2qX
** on vdo.ninja/alpha/
- Improved the guide on 1080p60 streaming via VDO.Ninja, along with some other sections in the documentation: How to screen share in 1080p Can't select a camera lens on mobile Virtual camera not working on Mac Added a link to it to the screen-sharing setup page as well in VDO.Ninja, so its easier to find.
- I've set the default &sstype for screen sharing to 3 when in a room now, versus 2. This change is on alpha and beta. If using
xxxxx_s
with &ssid before, you'll need to switch toxxxxx:s
instead I think, but otherwise it should be all the same? (feedback welcomed) - Updated vdo.ninja/beta/ with the current vdo.ninja/alpha/ version. A bit overdue, but I am looking to have the current v23 released tested some more.
- Fixed an issue with the audio-meters not always showing in the director's guest-control boxes (hot patched)
- Added a small on-hover over buttons effect to buttons (nod to @Lindenkron)
- I've refined the WHIP service on
vdo.ninja/alpha/?whip=xxx
, making it as robust as I can I think, so if some third-party WHIP client/app doesn't work with it, it may not an issue with VDO.Ninja. In those cases it will be up to the client to ensure full support of the WHIP specification, else it may not work with VDO.Ninja. - Added
&allowedscenes
as an option to filter which OBS scenes a remote guest has access to controlling when using&controlobs
. Uses CSV to split up the scenes (avoid special characters in your scene names if there are issues) example:vdo.ninja/alpha/?view=xxx&remote&allowedscenes=Scene1,Scene2
** on alpha
-
&timer=N
can be used to position where the countdown timer is positioned on a guest's window. Default is still center top, but a value of 1 to 9 can be be passed to change positions. - Setting the time as a director, for the timers, now can accept minute/seconds, rather than just seconds.
- The
&datamode
option was tweaked to work a bit better now when using it to both connect via push and view modes. Data-only mode is an advanced option; it's a bit like doing&ad=0&vd=0&webcam&autostart&hidemenu
, but a bit cleaner and disables a few other common functions that might be considered bloat. Useful perhaps if you want to use only the data-channels of VDO.Ninja, for remote control only operations or sending files. ** changes on alpha at vdo.ninja/alpha/
- Digital zoom fixed to support a change in orientation.
- You can set the totalroombitrate via manual value input now (rather than slider) in the room settings menu. (on vdo.ninja production)
- Welcome message in vdo.ninja will not auto-clear now, rather there is a close button to clear it
- Adding
&tally
will make the tally sign larger and colorize the background of the page, for added emphasis - The 'loudness' IFrame request will work with the local mic's audio as well; not just remote audio
- Added options for the
&clock
parameter.&clock=N
, whereN
can be1
to9
; each option specifies where the clock will appear on the screen. ** on alpha atvdo.ninja/alpha/?webcam&autostart&clock=5
- Added
&record=false
or&record=off
(orsession.record=false;
in code) will disable the user from being able to record a video. Buttons for recording are hidden/deleted and the recording function is disabled when used; so the director won't even be able to trigger it remotely. (won't stop OBS from recording of course) - Added
&distort
as a URL parameter for the sender's side, which will try to "distort" your microphone's output audio, making your voice a bit anonymous. - Added
&meterstyle=4
, which should work on any VDO.Ninja link, and it addsdata-loudness=N
as an attribute to the videos. You can use as a CSS target, to apply your own custom CSS on/off/effects for those speaking. - Our very own @Lindenkron on Discord made their first code contribution to the GitHub; they were able to fix a bug on alpha related to the director's control-box UI. ** on alpha/GitHub.
- Updated the http API getDetails request to include info about video visibility; makes it a bit more usable if querying a scene link
- Updated GitHub with the current alpha-version of VDO.Ninja (v23-alpha I guess). Also updated GitHub with a formal 'stable' release of the existing v22.9, which is what's been running on production for the last couple months.
- There's new logic added to support secret-auth-tokens for private turn server deployments; this was mainly a contribution by
Jumper
on GitHub.
- Streamlabs mobile support improved, but there are still some users who are not able to see video. I can confirm though, it's working with my Google Pixel 4a now at least.
- If you adjust the resolution on mobile, the frame rate shouldn't change now. I also have the aspect ratio tweaked a bit on android, so if in portrait mode, the aspect ratio is correctly adapted. (I can't say the same for the resolution though, which has a mind of its own still)
- You can change the Buffer of a video on alpha via right-clicking the menu; this has been further improved to its own window with a numerical-input option as well as a slider.
- I've added a new IRL-related command called
&cutscene
(aka,&lowbitratescene
), which you can use to specify an OBS cut scene to switch to when the bitrate drops below a threshold and return to the original scene when the bitrate recovers. (assuming the cut scene is active; it won't switch back from a scene that isn't the cut away scene) The default bitrate threshold is 300-kbps, but you can use the existing&bitratecutoff=N
option to specify a custom one. Using&cutscene
with&bitratecutoff
will override the behaviour of&bitratecutoff
's other features. It won't start triggering until the bitrate has hit at least the threshold once. to use:https://vdo.ninja/alpha/?push=XXXhttps://vdo.ninja/alpha/?view=XXX&controlobs&bitcut=300&cutscene=FML&remoteYou can of course use this with&controlobs
&remote
, to have the publisher change the scenes dynamically, and see what the current OBS scene is (if still connected). ** Note that the OBS Browser source needs the permissions to be set to high, to give VDO.Ninja permissions to change scenes. (on alpha for testing) - Added a new experimental parameter called
&maindirectorpassword
, which lets you set a pseudo 'master room password' as a director. It helps avoid getting locked out as the director, if someone else tries to claim the director-role first. ie:https://vdo.ninja/alpha/?director=ROOMNAME&maindirectorpassword=MASTERPASS
This will add a&token
value to the invite/scene links. This token is used by the guests to check a remote database server to see who currently 'owns' the token; it persists though, even if the director is not connected. When using&maindirectorpassword
as a director, it tells this database that you are the owner, and it will persist even if you aren't connected to VDO.Ninja. The&token
tells the guest to ignore other logic about who the director is, instead using the info provided by the token-lookup to determine whose the director. I may change or revoke this feature, depending on how testing goes this week, as it's rather experimental. ** on alpha for feedback
- If multiple mic inputs are selected, they will be auto-selected on page load (rather than just one mic only). ** changes on alpha
- Improved publishing stats when using
&meshcast
; server region + external watchURL are available now there. -
&screensharevideoonly
will hide the audio selection menu when screen sharing; it will also hide that warning message about no audio selected when screen sharing. - Fixed some issues with
&viewwidth
and&viewheight
(works like&scale
, but tries to target certain resolutions instead (also from the viewer's side tho). ** pushed to alpha
- Re-worked the animation logic for VDO.Ninja; should be much smoother and accurate now.
- When screen-sharing with
&screensharetype=3
, you'll now see your screen share preview, in the same way the normal screen share mode works. This allows it to work with custom layouts, as before it was hidden there, too. - The UI for the director's guest control boxes have been reworked; hoping this makes it easier for external CSS customization.
- Added some added connection stats; initial capture resolution/frame of the remote publisher, along with aspect ratio iframe api updates. This should make it easier for iframe wrappers of VDO.Ninja to have accurate placeholders for incoming video feeds during loading.
- The remote http API sample page was updated to include some recent additional button options, specifically relating to joining/leaving groups.
- Added an option called
&widget
, which lets you pass a URIComponent-encoded URL value. It will load a side-bar with that page as an IFRAME embed, with support for YouTube/Twitch specifically added. -- The director of a room also has the option to enable/disable the widget function for everyone in the room via the room settings menu.-- This was designed for Twitch / YouTube / Social Stream chat, but could in theory work with any CORS-friendly site, such as a third-party web tool. -- If the director uses&widget
, it will auto sync that with all guests as they connect. I'll try to find ways to make it easier to resize/minimize in the future.**changes on alpha at vdo.ninja/alpha/
- Added support for remote PowerPoint slide control. (previous/next slide) -- Documented things quite a bit here: https://github.com/steveseguin/powerpoint_remote -- I've only tested with Windows + PowerPoint so far, but it can be tweaked to work with more than PPT without much trouble. -- Uses AutoHotKey + VDO.Ninja + MIDI to achieve the result; quite a few different ways implement it, with samples provided -- built-in basic controller added, via
&powerpoint
(aliases:&slides
,&ppt
,&pptcontrols
) -- IFRAME sample app provided with larger buttons and sample code to add more custom buttons/actions if needed. (start/stop/etc): https://vdo.ninja/examples/powerpoint -- HTTP / WSS remote control also added;https://api.vdo.ninja/YOURAPIKEY/nextSlide
andprevSlide
-- Local Streamdeck support also working, via MIDI. -- YouTube Tutorial: https://youtu.be/ORH8betTt8Y* on alpha at vdo.ninja/alpha/
- Added
&groupview
, which is the same as&group
, except it lets you see those groups without actually needing to join them with your mic/camera. (There's no button in the directors/guest view for this, since there isn't a need yet for that.) - You can change the view-only groups via the API (HTTP / IFrame) or using the Comms app, which has been updated with buttons for this option. the HTTP documentation: https://github.com/steveseguin/Companion-Ninja/blob/main/README.md#api-commands
- You can now use the HTTP/WSS API to both join and leave a group; not just toggle said state. Both the view-group function and regular group function.
- Added
&mididelay=1000
, which lets you precisely delay the MIDI play-out from VDO.Ninja to your MIDI device when using&midiin
, irrespective of network latency. Use case: If you have a remote drum machine, you can have it play out the beat exactly 4-bars ahead, allowing for music jamming types with even high ping delays between locations. - Added the option to right click a remote video and add/adjust the
&buffer
delay for that specific video dynamically. - Added
&buffer2=500
, which is the same as&buffer
, but instead also tells the system to include the round-trip-time in the buffer delay calculation. This way 500-ms of buffer on a connection that has a 200ms ping time will result in a smaller 300-ms buffer, leading to an end-to-end playout delay of ~500ms. -- won't work that well with Meshcast. -- not super precise, but on a stable connection maybe within 20-ms of flux? ** changes on alpha at vdo.ninja/alpha/
- Added experimental "WHIP" support to VDO.Ninja, which means in the near future you'll be able to publish directly from OBS to VDO.Ninja without a virtual camera. There's some big caveats to it all, so I don't recommend it over the normal method to most users, but we'll see how it evolves. (https://vdo.ninja/alpha/?whip=xxx + https://whip.vdo.ninja/ + xxx) YouTube tutorial: https://youtu.be/ynSOE2d4Z9Y
-
&fullscreenbutton
is improved, so that even when there is a single video on the page, it will show. It also shows more reliably, without needing to move the mouse around a bit to re-show the button after going full screen. Lastly, when used, it now hides the native full-screen button, so users have to use it. Unlike the native full screen button, this full screen mode alternative keeps the chat and control bar overlays visible (like press F11). Since this is probably the preferred way most users will want to full screen to work, I may make it the default mode at some point, after some more testing/feedback. (not supported on iOS/iPhone tho) Changes on alpha for testing athttps://vdo.ninja/alpha/?fsb
(join a room as a guest to trigger)
- Fixed a stats (relay vs host vs srflx) issue, where sometimes the incorrect stat appeared. fix on alpha at vdo.ninja/alpha/
- Added a small mouse-over tooltip to the candidate type value in the stats menu, to hint at what it means again if needed.
- GitHub updated with the newest code (currently in sync with alpha).
- Made it so mobile won't go to sleep while streaming out audio-only content.
- I created a guide + script for offline / local-only deployment of VDO.Ninja, so using it without Internet, connected to a router-only or something. -- I've tested it on a raspberry pi, and have included the resulting RPI image as well, if you want to quick deploy it, but the guide is pretty simple as well. https://github.com/steveseguin/offline_deployment -- please note: there is already code / instructions for self-deploying VDO.Ninja; this new repo is specifically to help non-techies use VDO.Ninja offline.
- Also fixed a minor issue where specifying a custom handshake server via index.html was adding a needless URL param to all links; pushed that fix to GitHub already.
- -- One bug caused mobile phones to push lower than available bandwidth. -- The second bug had
&optimize=0
sometimes causing video scenes to not correctly load all guests when toggling scenes in OBS.These fixes have been pushed everywhere; production, beta, alpha, and github. Thank you for reporting the issues; please report any others you find.
- Add
&clearstorage
(aka,&clear
). This will clear all the saved user preferences for all sessions, including&sticky
'd data, director settings, any camera and microphone settings, and probably a couple other small things. This also includes the "default" saved stated of camera settings before adjusted. I also added a button to manually do this via the User menu settings.** on alpha
- Added "change URL" permissions to the
&consent
flag. That is, when using&consent
on the guest URL, the director can remotely change the guest's URL without additional permission -- it will just change. (&consent
already gave the director controls to remotely change mic / camera) * added to alpha - Added
&fakeguests=N
(or&fakefeeds
) as a parameter. It creates simulated guest videos, based on the value passed to the parameter, using real-guests where possible. The default value is 4. -- You can use this feature to help position and visualize what&cover
,&portrait
, etc. looks like. -- This doesn't yet support labels or layouts really, but I welcome feedback. -- Currently I just threw up a video of me, 16:9, of 500-kbps. -- You don't actually need to create a room / scene to play with it.** on alpha. try it at: https://vdo.ninja/alpha/?room=xxxxtestxxxx&scene&cover&square&fakeguests=7 - Fixed an issue where the director's last-used saved audio output destination wasn't applying, even though the settings menu should it was selected.
- Made it so the right-click pause video feature works with
&meshcast
streams. Doesn't actually stop the incoming data stream, but it does pause its playback. - Just pushed beta into production (v22.9) after a week of testing; this had a fix for Meshcast screen sharing and some translation mistakes. Alpha currently is running v22.10.
-
&smallshare
will work on the scene-side now also, which disables the automixer's larger screen share layout, and instead just uses an equal-sized video layout for all videos. * on alpha - Fixed a bug with the 'deafen guest' function in the director's room. * updated on prod, beta, alpha
- Added
&automute
, which will auto mute the microphone of a guest when not loaded in an active OBS scene. -- Useful for perhaps limiting the discussion in a group chat to those on air. --&automute=2
will mute it everywhere, while the default will still allow the director to speak to the guest, even if not in a scene. -- This is a guest-side URL parameter; you may want to apply it to all guests. -- Required quite a bit of code reworking; error reporting is on in the console, so please report issues. Feedback also welcomed. - The group buttons for the director will appear under their control-box when using active and using
&showdirector
now, rather than isolating them to the lower control bar. - Some minor CSS / code tweaks
- Cleaned up some HTML code on director's page to make it a bit easier to modify with custom CSS, by a user's request.
- Improved Firefox support for the director's solo talk and for the new
&automute
function; will need some further testing though. ** changes on alpha for testing at https://vdo.ninja/alpha
- Updated the
&audiodevice
(&ad
) parameter so it can accept multiple audio devices.&audiodevice=cam,cable
for example, will select the camlink and virtual audio cable devices as an audio source when joining. -
&audiodevice={device name}
will now also now show the selected audio devices before joining, while&audiodevice=1
or&audiodevice=0
will still hide the option to change or see audio devices. ** pushed to alpha and Beta
&noaudioprocessing
is even more aggressive in disabling audio processing effects now, useful for debugging, but breaks a lot of functionality.- The parameter
&codec=hardware
is added; it's Android-specific and is the same as doing&codec=h264
&h264profile
, but perhaps easier to remember. Worth trying if your android phone is struggling to publish video at a high enough quality into OBS. I may expand on this feature to be smarter. ** changes pushed to alpha for user-testing and feedback. Thank you.
- Added
&fullscreenbutton
, aka&fsb
, adds a full-screen button to the control bar. It essentially just mimics F11, with added support for detecting the Escape button to exit full screen. -- also while using&fullscreenbutton
, the previous little 'full window' button in the top-right of videos (if in a group room) will also auto-F11 and isolate that video, rather than just isolate the video. -- you can still right-click and select "full-window" on any video to isolate it without going full screen, if you need that. -- you can test by opening two such guest links: https://vdo.ninja/alpha/?fsb&room=test123123123&webcam&autostart -- ultimately I'd like to override the native video full screen button with this behaviour, when&fullscreenbutton
is used, but I'm still working on that aspect. - Fixed a bug where the guest screen share, while in broadcast mode, was misplaced on the screen.
- Re-enabled
&limittotalbitrate
for non-guests, as it was causing me some problems before with versus.cam. It might still be causing issues, so more testing is needed. - Fixed an issue where changing a system-level audio device duplicated the audio output options during camera/mic setup.
- Fixed an issue where screen sharing as a guest, while someone is sharing a website with you, causes the website to refresh. (In the case of meshcast.io, this caused a reconnection loop) ** changes on alpha at the moment at, pending more testing.
- Patched an issue with VDO.Ninja where the 'page loaded' event didn't always trigger, causing the browser to display an incorrect 'waiting to load' state. This might cause odd behaviors' to the how the page loads now, but should fix issues where OBS custom CSS styles didn't always apply. Please let me know if there are problems, and remember, the previous version of VDO.Ninja at vdo.ninja/v21/ is still available if so.
- The recently added
&audiocodec=pcm
option no longer needs&insertablestreams
to be used on the sender's side; works with just a viewer-side flag now and works with video. -
&audiocodec=pcm
now will support 48khz and 44.1khz mono playback (48khz default), and if&stereo
is used, it changes to two-channel stereo 32khz. - The existing
&samplerate=44100
option can lower the sample rate of this pcm mode (down to 8khz even), and hence the resulting audio bitrate. Since pcm is raw,&audiobitrate
won't work, so expect 550 to 1200-kbps in just audio bitrates per viewer. - Fixed a bug where if a guest muted their video, and unmuted, it didn't always resize correctly afterwards.
- Fixed a bug where if a guest muted their video, the audio-only spacer box that remained would resize smaller, rather than just staying the same size. ** changes have been pushed to production (and beta/alpha) Please report any other bugs.
- Added a couple exact presets for the aspect ratio setting; should make it easier to precisely crop an incoming guest who doesn't have their smartphone oriented right, or just in case you want to reset the aspect ratio to 16:9, etc.** on alpha at https://vdo.ninja/alpha/
- Made the
&clock
and timer overlay be something you can 'pop out' and overlay as a native picture-in-picture element; just right-click it and select pop-out from the context menu. - Viewer-side
&audiocodec=pcm
is now available as an audio codec option; this is 32khz, 16bit, mono, and uncompressed, so ~512-kbps bitrate. You'll need the sender to have&insertablestreams
applied to their URL for this to work currently, as it requires the sender to enable a special mode that allows for custom codecs. This is very experimental at the moment, so its still a WIP. &micsamplerate
(&msr
) added, which lets you specify the capture audio sample rate. Also added purely for experimental reasons; I don't recommend touching. ** All these changes are on alpha at https://vdo.ninja/alpha/, which I'll push into production pending user testing.
- Some advanced audio-related VDO.Ninja updates: -- I show the audio codec now used in the stats, along with whether audio forward error correction (FEC) is on or not (on by default)--
&nofec
on the viewer side can disable FEC. --&audiocodec
on the viewer side can let you specify the audio codec;opus
(default),pcmu
,pcma
,isac
,g722
andred
--&audiocodec
=red
is pretty much sending two opus streams, with one as a backup in case of packet loss; support in Chromium 97 and up, but the only way I can so far tell that it is working is to check if the audio bitrate has doubled --&dtx
(aka,&usedtx
), is also now functional (viewer side). Using this flag will turn off the audio encoder automatically when no little to no sound is detected. The VDO.Ninja default uses a dynamic audio bitrate mode (&vbr
), but using&dtx
takes things to the next level. It might be useful as a very mild noise-gate I suppose? -- Also fixed a couple minor bugs, such as no play button appearing when using&view=StreamID
&novideo
** changes on alpha at https://vdo.ninja/alpha/
- For better or worse, I updated Production (VDO.Ninja) to version v22.6 ... up from v21.4. IF HAVING PROBLEMS suddenly, please do a hard-browser refresh. This includes in your browser and the OBS browser source, if using that. The previous v21 release can still be found at https://vdo.ninja/v21/, if you want to go back. Release notes coming soon.
- Fixed an issue with iPhones where changing the camera caused your own preview video to go small.
- Added the "mic delay" option as a slider to the director's control; it's available by default, with up to 500-ms of delay ready. If you make use of it, it will "enable" the
&micdelay
web audio node remotely if not yet on, which might cause a clicking sound. Hoping that this though can help with problematic guests who might be out of sync. This is not the same as&buffer
or&sync
delay, which are a view-side parameters.

-
&micdelay
, if used on a basic push link, will show the mic delay as a slider now also. So you can adjust it as needed. I don't show the slider by default unless using the URL parameter, as I don't think its a commonly used feature. - I think I fixed an issue with Firefox where not all the audio-output devices were available to choose from, at least on desktop, and so I've added the custom logic Firefox requires to get it working. On Firefox, you'll now need to select "Show more options" in the audio drop down menu, where Firefox will prompt you to select the audio output device with its own prompt.
- Added an option called
&hidehome
, which hides the VDO.Ninja homepage and many links that lead to it. You can also enable at a code level withsession.hidehome=true;
, which is useful if doing a self-deployment, where you don't want anyone to stumble onto the site and start using it. You'll still be able to join push links and create rooms via URL parameters, but that's about it. ** updated alpha (vdo.ninja/alpha) and GitHub with all changes.
- Added the
&clock
parameter, which shows the current time in the lower right; this can be applied to pretty much all link types.-- The director has a button that lets them enable the clock for everyone in the room (via the director's room settings button). --&clock=false
or&cleanoutput
will force-disable the clock from being remotely triggerable. -- The director has a button that lets them also enable a global count-down timer. Holding CTRL + click will let the director pause the timer. If someone joins the room or reloads, the timer will also be reloaded, in sync. Button also in the room settings menu.-- This count down timer is the same concept as the per-guest timer the director already has, and will actually conflict with it if both are used, since it uses the same state/variable to keep track of time remaining. -- The director will see the global count down timer also; it will just be a bit smaller on screen. - For VDO.Ninja, right-clicking a video and selecting "audio output destination" should work again. I had to disable that feature for a bit, as some users were reporting audio issues with it enabled. It might have some compatibilities issues, but it won't activate now unless used.
- When using the special
&screensharetype=3
screen share mode (screen share with better echo cancellation), support for recording that local screen share, at the same time as as the main video, has been added. You'll need to use the&autorecord
feature to trigger the recording, and when it does start recording, a button will appear specific to stopping that screen recording if needed. - I haven't been able to validate it works, but I think I added support for H265 (HEVC) to VDO.Ninja; the catch is it might only work between two iPhones running the experimental H265 WebRTC support currently; maybe Raspberry Ninja in the future. I haven't managed to make it work yet though, so its just hypothetical support. ** This is all on alpha, at https://vdo.ninja/alpha/. I'm definitely feeling its time to push this code into production soon, so if you get a chance to do any tests on alpha (maybe mobile / load testing?), it will help speed up the release. Thank you.
- Applied a small hotfix to production related to iPhones, specifically in response to iPhone 14 issues. If anyone encounters problems with using iPhones on production, including issues with muting, let me know.
- Added a new URL parameter.
&directoronly
(&do
). This is just the same as doing&view=DirectorStreamID
, but without having to know the stream ID for the director.-- It will actually connect to any director, including co-directors, not just the main one.--&view
,&include
,&exclude
have a lower priority to&directoronly
. So if there are two directors, you can do&directoronly&exclude=coDirector123
, so that the codirector doesn't connect.-- I changed the toggle in the director's room for "Guests hear others" from&view=
to&directoronly
. The point of this change is that the director can now still talk to those in the room.-- Purpose of change: I had a user who wanted&broadcast
, but also not have the guests hear each other. It's a bit of a hassle to do&view=DirectorStreamID
, and the toggle is labelled to be misleading by saying "guests", not "everyone".-- You can use&directoronly
to replace&broadcast
if you don't want the guests hearing each other.** change is on alpha for testing and feedback. https://vdo.ninja/alpha/?directoronly
- Added a 'cycle visual styles' button to the "users" settings menu in VDO.Ninja (and Comms app) This lets you toggle the
&style=N
options, between 1,2,4,5,6 I think? So if you find it distracting, the waveform in the Comms app or such, you can toggle as a guest.** Change is on alpha at vdo.ninja/alpha/
- Fixed some issues with the 'last used' audio output device saving feature, as it was not always triggering fully on page reload. The selected output device didn't always match the actual output device, in some cases, after a page reload. -- note: I don't load the last-used 'saved' output device if loading a scene/view link, unless its set in URL param, as I just found it was too confusing as there was no obvious way to check what the default audio output device was in that case.
- When using
&vd=videoDevice
, the name matching order now sorts based on NameStartsWith, then ExactDeviceID, and then finally NameIncludes. This should avoid the Streamlabs OBS Virtual Cam being selected when you actually want the OBS Virtual Camera being selected, as the two devices both containobs virtual camera
in their name. It was causing me grief at least. - Couple minor bugs, like the right-click "show control bar" option not toggling the menu option in the UI properly when the control bar is visible. *** changes on alpha for testing and feedback. Thank you
- Fixed an issue where the transfer-function for co-directors wasn't a bit broken; transfers were only partially completed. The fix for this should be on alpha now at https://vdo.ninja/alpha
- Pushed a workaround for a nasty iOS bug that is impacting iPhone 14 Pros. Fix is on production and alpha; https://vdo.ninja/alpha/ Please report any issues it might cause.
- Fixed a bunch of co-director sync logic, which was a bit buggy before, but I think I got the issues out.
- Updated the video stats code with the newest spec; Chrome was deprecating the API I was using.
- Added stats support for Firefox, including support for it in the speed-test, the guest check app, and stats pop-up.
CTRL + click
support to access the stats pop-up added to Firefox (before you had to right click and select "show stats" from the menu). ** changes applied to alpha at https://vdo.ninja/alpha/
&controlbarspace
forces the bottom control bar to be in its own dedicated space, regardless of screen size.
&volumecontrol
(alias,&vc
) shows a dedicated local audio-volume control bar for canvas or image elements. Video elements already have a control-bar with volume, so I don't show it there currently. I'll likely tweak this more over time.- Fixed an issue with
&screensharetype=3
crashing the browser when specifying an audio track to share. ** changes are at vdo.ninja/alpha/ The Comms app is a good demonstrator of the features @vdo.ninja/alpha/comms