v20 🎁

Ending 2021 with a bang 🎉🧨✨


Since the previous v19.4 update was proving quite stable, more time was available to work on getting added features into v20, so it ended up being quite a big update. While there are a few important fixes in v20 also, it's mainly quality of life enhancements. And lots of them.

Some highlights

  • new signal meters for the director indicating a guest's connection and battery status

  • improved co-director functionality, including permission controls

  • screen sharing updates, including a screen-share centric layout

  • improved &meshcast support; ideal for handling larger rooms or slow guests

  • new options for custom-layouts, including a new experimental VDO Mixer app

  • an experimental chunked video transfer mode added, for high quality video transfer over connections with higher packet loss

General VDO.Ninja updates

  • Created a new parameter called &totalscenebitrate , with aliases &maxtotalscenebitrate, &tsb, and &mtsb. Mainly added to help offer another way to optimize performance and limit inbound bandwidth used, since why not.

    This is similar to &totalroombitrate, but &tsb applies to scenes and faux-room scenes instead. That is, it splits the total bitrate available for playback by the number of videos in the scene. It's a way to keep the inbound bitrate below a certain threshold. If &videobitrate is also used, &videobitrate becomes a max limit on any individual video, so you can set &tsb=6000 and &videobitrate=2000, to keep all videos below 2-mbps each, but potentially go lower if more than 3 videos are present.

  • Made some improvements to the rotation and mirroring self-preview logic.

  • Updated VDO.Ninja with &forcelandscape / &forceportrait (aka, &fl and &fp), which will let you specify whether the video output is landscape or portrait, regardless of how the phone is rotated. You add this flag to the sender's side, and it applies to the sender and the viewers of that video stream. There's a short sub-second delay that it takes to counter-act any system-flipping. It can be used in conjunction with &rotate, if you need to do a 180 or something also.

  • Added the &facing setting, which lets you specify either the front or rear facing camera as the default camera. Passing one of rear, environment, back, front, and user are required to specify whether to select back or front. Example usage:https://vdo.ninja/?webcam&facing=rear &facing takes priority over &vd , but it will fail to &videodevice or the default behaviour if the rear/front camera can't be selected automatically. If there are multiple rear or front cameras, it will use the first one. &videodevice=0 will disable the video outright.

  • Added the &h264profile flag. This is added to the Viewer-side to tweak the h264 profile type. Use it as is if you wish to disable hardware h264 encoding, for example. Instead, OpenH264 software encoding will be used, if H264 is used. Open264 software encoding can actually use less CPU than the Windows-selected hardware encoder, and in some cases will suffer from less video glitching. Advanced users can also pass a 6-character h264 profile ID to the parameter to get used instead. This flag will not force H264 to be used, but rather configures it in case h264 gets used. You can still use &codec to set the codec to h264. Example: https://vdo.ninja/?view=xxxxxxx&h264profile=42e01f&codec=h264

  • I added a few extra keyboard shortcuts; nothing special, but they might be useful. Feedback welcomed. on Windows: CTRL + ALT + F => Open the file-sharing window CTRL + ALT + C => Cycle the camera to the next camera available CTRL + ALT + S => Open the screen-sharing window on macOS: CMD + ALT + F => Open the file-sharing window CMD + ALT + C => Cycle the camera to the next camera available CMD + ALT + S => Open the screen-sharing window

  • I show the camera's capture resolution, and often the frame rate, in the stats menu now. It appears in the stats even if no guests are yet connected.

  • Custom layout support added; screen-sharing is the first built-in custom layout added, but more will be coming. Using the new VDO Mixer app, you can create and switch between your own custom layouts. See the section about the new mixer app for more details.

  • Added the &slots parameter, where you can pass a positive integer and it will force the auto-mixer to have that number of slots, even if there are more or less videos available to fill them. O

    • I made positioning sticky when using &slots, so videos will stick in place now (slot position wise at least), even if another video before it leaves.

    • If a video is made invisible, it gives up its slot position, which allows a new video to take its spot potentially. When the original video becomes visible again though, the mix-order takes priority. If the mix order is the same, then the connection order takes priority. Dislodged videos are treated like newly joining videos, wrt. to slot positioning.

    • Screen sharing and highlighting a guest may still break the slotted layout

  • Changed the large video play button icon to an SVG; it loads instantly now versus sometimes delayed

  • &quality=-1 has been expanded to also unlock the resolution being requested from a screen; not just the camera. (it just lets the system pick the resolution; often higher than 1080p)

  • Added a slider to adjust the amount of blur when using the digital background blur effect; you can increase or reduce the amount of blur now

  • Added &effectvalue (&ev) which can take an integer; this can set the amount of blur (or effect) applied. It's best to keep it under 10 and using this flag disables the option to use the slider.

  • Added a flag called &recordcodec (&rc), which lets you set the video recording codec (saving to disk mode; ala &record). The container format is still webm, and not all codecs are going to be supported, but things will fail back to vp8 if not supported. Main reason for this is because vp8 on chrome for android kind of stinks, so at least you have an option to tinker with things now.

  • Added the ability to adjust the width and height of the camera capture independently; the behavior will be "crop-to-fit", with each width/height slider being independent by default. If you hold CTRL (cmd) while changing values though, it will lock the width/height together, allowing for scaling without having to crop first. The director will have remote control access as well. The "preview" for the guest will still appear HD even at low resolutions selected, as the width/height change will only apply to the outbound video stream. Cropping is still applied to the preview though. It should be possible to increase the width/height to something HIGHER than what was set with &quality, if the camera supports it. So you can join at 720p (&quality=1), you can then increase it to 1080p or 4K or whatever after joining.

  • The director's selected shared website will not show up in scenes anymore, regardless of whether &showperformer is active. If you want to share a website as a director with a scene, either do it via OBS, as a screen share, or open a new tab and share it as a guest.

  • There is no more default website URL when sharing a website for the first time; it is now just a blank field. If you hit enter on the input field while it is blank, it does nothing and just cancels.

  • Added &speakermute=false as an option; this will have the director's mic not start muted. You can use &autostart to auto-select the mic of course, also.

  • Added back in "stand-by" as a tally light message -- I may remove it again, but it's been added for now.

  • Added pop-up messaging for when WebRTC is blocked by the browser at a code-level, with a couple offered solutions.

  • Added the &autoadd parameter, which can be added to a scene link, passing to it a comma-separated list of stream IDs. If any of those streamIDs connect, they will be auto-added to that specific scene page.

    • The director won't see that they were added to the scene page, but the director can still toggle the add-to-scene button to remove them.

    • This is just an alternative to using &view= to auto-add a guest to a scene, as &view filters out non-listed stream IDs as well, while &autoadd will not.

  • The digital background effects are available by default now if you visit vdo.ninja without any &push, &view, &room, or &director parameters added. I'm hoping this adds to the discovery of the function, since I get asked about this feature a lot. it will not show up though if those parameter are present, unless &effects is explicitly added, so directors are still in control.

  • Created &ssec, &ssdn, &ssag, and &sss flags that can be used to adjust the audio of a sub-screen share. echo-cancellation, denoise, autogain, stereo, respectively

  • Did some minor tweaks to the VDO.Ninja speed test. The packet-loss graphs' width fit the width of the page better now, so the graph can visualize longer time periods.

  • I'm hiding some TURN-server details in the stats window when the turn-server isn't actually in use; hoping this reduces confusion whether its' in use or not.

  • Added &43 as a viewer-side aspect ratio option; previously there was just 16:9, 9:16 and 1:1.

  • AV1 codec support updated; changes in recent Chrome broke it, but all good again now. On production and beta. AV1 is more advanced compared to VP8 and VP9; it's like a VP-10; better video compression, but requires more CPU.

  • Rather good news on the iPhone front, but it seems 1080p30 finally works with h264 on iPhones running iOS 15, rather than failing without an error. I've made this change to the VDO.Ninja code, so now if you are running an iOS 15 device, you can simply select &quality=0 (1080p mode), and it will actually work at 1080p now. On older iOS versions, I still limit you to 720p30 to avoid things crashing.

  • Added messaging for USB audio devices connected to Android; if a USBaudio device is selected, you get told to use Firefox mobile.

  • Added a section to the docs for user-contributed guides on setting up show formats / best-practices. There's two there now; more welcomed.

  • Finished a guide on how to screen share from iOS to VDO.Ninja, including audio capture. https://docs.vdo.ninja/guides/screen-share-your-iphone-ipad

  • Added the &proxy flag. You can add it to the view/push/director/scene link or wherever. This simply forces your computer to try to connect to the handshake service via a different physical network end point and domain name, which might help if the Internet ever splits in two. The purposes of this flag is that sometimes ISPs / network routers mess up, and this is just a backup option to get around those errors. While this should try to connect to the closest edge node relative to your location, I don't recommend using this feature unless there are problems.

  • The native Android APK now will stay active in the background despite battery throttling settings.

  • Added in mic-audio capture to the screen-share capture mode of the android app. I don't recall how it got removed, but I added it back in, along with a mic-mute button for it. I can't yet capture the actual desktop audio on an Android, just the mic, but if you set the speaker to loud enough, it's a poor-mans option for now.

  • Replaced a US-WEST TURN server with a new premium server hosted in Oregon, along with upgrading another TURN server that covers US-EAST. d reduce packet loss.

  • Added support for Microsoft's Mixed reality WebRTC framework by means of supporting BLOB-based data-channel API requests by 3rd party clients

  • Spanish translations updated ; thank you, Mixgyt

  • Updated all the pop-up prompts to use the modal-boxes instead. This should allow the director to be fully-usable within the Electron Capture app now, and perhaps with some iFrame/webview applications.

  • Added a button for rainbow-puke fixing to the remote api sample page that works for non-group room targets, so basic push/view links; https://companion.vdo.ninja/

  • A viewer can mute a specific video now, and not have it randomly unmute itself later on.

  • added &cleanviewer (&cv). This is the exact same thing as &cleanoutput, except it only triggers if added to a view-only link.

  • OBS and Twitch Studio Beta (which uses electron.js) should automatically make vdo.ninja videos transparent as such

  • Added the &meterstyle parameter, which lets you customize the audio-loudness meter,

    • &meter=1 will show the VU-style meter that the director has by default already.

    • &meter=2 will show a green-border around the guest's video when they are talking.

    • &meter=3 will show a little green dot in the top-right corner when the guest's talking. This is default for the guest's view already.

    If you use the &meterstyle parameter on a scene link, it will work there too.

  • Added support for vimeo.com-based video links, so when a simple vimeo video link is shared in VDO.Ninja as a website-link, it will auto re-write it as an embed-link; this allows it to be played successfully and be sized correctly.

Screen Sharing specific layout

  • Screen sharing in a group causes the first screen share to now take up the majority of the screen.

    • This custom screen-share layouts supports up to 9 guests, plus the screenshare, currently.

    • After 9 guests, the subsequent guests are hidden from view; this might be updated in the future

    • It won't work if multiple screen shares currently; just one screen share.

    • Designed for 16:9 video currently, but might work fine with other aspect ratios

    • Custom layouts will over-ride the auto-mixer.

    • The bitrate allotted to screen shares in a video mix has been increased to use up around 66% of the total bitrate cap, if there is a total bitrate cap in the room. Before the bandwidth was divided equally to all the videos in the mix, but since screen share now takes up two thirds of the screen now, I increased the bitrate to match.

  • Added &screensharebitrate (aka &ssbitrate), which lets you manually set the video bitrate for screen-shares in kbps. This is a viewer-side command, and works with scenes link, view links, and guest links. This specified screen-share bitrate will not count towards the total room or scene bitrate, if those are being used. It also takes priority over most other bitrates parameters, with just a couple exceptions.

  • Added &screensharevideoonly (aka, &ssvideoonly or &ssvo) ; this lets you disable the option to select audio when screen sharing. It will not impact the microphone or other audio options.

New screen-sharing mode

  • Added a new screen-sharing method, making it more transfer-room friendly, making it not crash if quitting a PowerPoint share, and making it support echo-cancellation correctly. It has required major code changes, so I am make it an opt-in change, where to enable it you need to use &sstype=3. You add it to the guest link. The new &sstype parameter in general can be used to specify which type of screen-sharing logic is used. Specifically, sstype=1 replaces the webcam screen with the screen share, sstype=2 creates a totally new connection for the screen share, and sstype=3 reuses the existing connection, adding a second video track. I hope to have sstype=3 become the standard for sharing screens eventually, but for now it will remain optional, until the issues are all worked out.

    As a viewer or scene link, to specify only loading the &sstype=3 screen-share, you can now use &view=xxxxx:s , where :s is appended to the end of the stream ID. This tells the system to ignore the webcam/mic feed, and just send over the screen share. You can do &view=xxxx,xxxx:s to target both webcam and screen share though. I may change this syntax over time, but for now it works. The solo-links in the director's room has this :s applied already where needed. Note, the type-3 screen share is still not fully cooked for use in scenes, etc, and it won't yet work with &meshcast, &novideo or &noaudio.

MIDI support updates

  • Updated the &midiin and &midiout forwarding function to also include the channel-ID. Before all channels were sent to all remote channels, but now, for example, if channel 15 is used locally, it will be forwarded to channel 15 remotely also. Had to upgrade to v3 of webmidi-beta to get this to work.

  • Added &mididevice=N and &midichannel=N as filtering options. These work in conjunction with &midi to allow for specifying which midi device (1 and up) and/or midi channel (1 to 16) to listen on. If you don't specify anything, it listens to all channels and/or all midi devices. Previously it was hard-coded to listen to just channel-1, but now it will listen to all channels unless filtered.

  • Bi-directional MIDI support added that works with the raspberry_ninja project.

  • Fixed a couple issues with the MIDI sample test app: http://vdo.ninja/midi

Show, hide, or stylize how to show audio-only guests with &style

  • &style can now take values 1 to 6 now. Previously only &style=2 worked, and even that was a bit buggy.

    • &style=1 hides audio-only windows from appearing. The default is for guests to see audio-only boxes for guests that do not have a video feed; the director is excluded.

    • &style=2 still just shows an animated audio waveform of the speaker's voice, although I made the quality HD now.

    • &style=3 shows the audio meter, which you can customize using &meterstyle. You can conversely just use &meterstyle on its own, and mix it with a different style, and it will still work.

    • &style=4 will just show a black background for any audio-only source.

    • &style=5 will show a random color for a background, instead of just black.

    • &style=6 will show the first letter of the guest's display name, in a colored circle, with a black background. If no display name is provided, it will just be a colored circle on a black background.

Director specific updates

  • Added support for solo-talk to the co-director.

  • Updated the "Create Room" button to offer users an option to join as a participant, rather than director (currently experimenting with ideas to improve this workflow).

  • Tweaked some of the dark-mode colors and improved the mobile-workflow for creating a room to fit better on screen.

  • The director can issue commands to fix rainbow puke for guests via the MIDI interface now (already could via iframe, http and ws).

  • Found and fixed a race condition within the co-director feature. Codirector should not be left waiting now on whether they got accepted or not, which sometimes was happening before.

  • when you create a room, via the Join room as participant button, but join as a participant instead of a director, you are provided an invite link as a pop-up to that room's creator. Clicking it copies to clipboard.

  • Added the ability for the director to "refresh" the currently active video device without needing to request a user's permission to remotely do so. This can be helpful if the camera freezes, as the director can unfreeze it potentially by refreshing it (reconnecting). The director will still need permission to change the camera source to something else though (privacy concerns).

  • The signal meter turns into a flame when the remote computer is being throttled by the CPU, instead of the network. This represents the remote computer is overheating or overloaded. Only supported by guests using Chrome really.

  • Added a signal-meter to the director's room, per guest. It visualizes the packet loss of the guest. green == good, red == bad, and there is a gradient of colors in-between.

  • Added a way to enable/disable the transfer ability of co-directors (default set to allow). Available via room settings as the main director.

  • The main director can enable co-director support dynamically; it will ask for a codirector password to be used. Also available via room settings as the main-director.

  • If refreshing the main director's page, it will still remember and use the previous co-director password that was dynamically set (adds the password to the URL as a memory).

  • Updated the Transfer room function to have some additional options, including:

    • Director can update the guest's URL with the new room name during a transfer, so if the guest refreshes or gets disconnected, they can rejoin the transfer room immediately.

    • During a transfer, the director can also change the state of the guest's &broadcast mode, so change whether the guest is in broadcast mode or not be in broadcast mode.

New status icons for the director

  • Added a little battery icon to the director's page, which appears when the guest is on battery (Safari/Firefox not supported tho).

  • Turns orange or red when getting low on battery.

  • Hover over the battery icon to get the exact battery % remaining.

  • When the device is plugged in, a little "plug" icon now shows on top of the battery icon, indicating its plugged in (potentially charging).

  • When the device is plugged in, a little "plug" icon now shows on top of the battery icon, indicating its plugged in (potentially charging).

  • Added support for battery-level and plugged-in status to the stats menu.

Fixes and minor tweaks

  • Fixed a rare edge case where if the main camera errored out, but the camera changed to something else before erroring out, the output stream failed.

  • Fixed an issue where non-English mobile phones might have had the rear-camera improperly mirrored.

  • &micdelay can now delay your mic output for longer than a second now; I've tested 10-seconds but probably could go much longer.

  • Got rid of some flickering on the camera selection screen for iPhones; or at least, reduced it.

  • Co-directors now have permission to direct guests that have &view= set in the URL; before this broke.

  • Added lazy loading to some images/assets on the site; should allow the page to load slightly faster.

  • Re-wrote some of the audio and media track logic, which fixed an issue where audio-only windows didn't always appear after toggling the camera. I'm also hoping it might reduce random rare issues I occasionally get reported with missing guests.

  • &miconly will block the cycle-camera button and hotkey option now on mobile; also added a fail-safe to ensure camera can't become active now when &miconly is used.

  • Tooltip pop ups in a few new places now when click-to-copy is activated, including on invite.cam.

  • Fixed a potential rare glitch where video elements might not re-position correctly.

  • Fixed a bug where changing the audio source glitched the digital video effects filter.

  • Fixed some director's room spacing issues caused by long-text found in some language translations (ie: russian).

  • Fixed a rare issue where if the guest disables their camera, it can cause the director's video preview of them to freeze if the director then tries to set an audio output channel.

  • Updated some of the error messaging around screen-share not being supported on iOS and Android.

  • Fixed an issue where &autostart may have caused incoming video bitrates to be higher than desired in the director's view.

  • Tweaked the error-messaging for when a user is unable to connect to the vdo.ninja service. (added info on using the new &proxy option.)

  • Fixed an issue where if the password was set to false in a basic push/view setup, the share link found at the top of the page didn't include the &pw=false needed for it to work.

  • Fixed an issue where the torch light on phones could be turned on, but not off.

  • Changed port/api server of the caption.ninja service; less likely to be blocked by a firewall.

  • Updated some of the camera error messaging for iOS devices ; making it more specific, including this tip: "If using an iPhone or iPad, try fully closing your browser and open it again; Safari sometimes jams up the camera.".

  • Fixed an issue where android H264 encoders were failing with recent OBS versions on mac m1.

  • Fixed an issue with firefox/iOS bitrates sometimes did not toggle between high and low in certain cases.

  • Fixed an issue where when using active-speaker, highlighting a guest cause the screen to be empty.

  • Fixed an issue with passwords and special characters causing in group-rooms causing issues.

  • An existing feature for guests remembers settings applied to a guest, so when they refresh, they auto-apply. I shortened the local memory's expiration time of those saved settings from a week to 6 hours.

Chunked video transfer mode

Version 20 introduces the option to enable a chunked-video transfer mode, which is similar to how Twitch or YouTube Live broadcasts videos. This still uses VDO.Ninja's peer to peer connections to distribute video to viewers, except it does not use webRTC's video streaming protocols; rather it uses a custom-made protocol.

The upsides of this mode is that packet loss on a network connection impacts the video stream less, so the quality can be higher. It also makes it easier to record the stream to disk on the viewer's end with no added quality loss and with lower CPU usage. It also supports video transparency, which wasn't really feasible before. In theory, this mode also allows a video stream to be only encoded once, and then it can be shared with multiple viewers, although in this first version of chunked transfer mode, that isn't an option. The same goes with PCM audio; in theory that can now be supported in this chunked transfer mode, but it currently isn't enabled in this first release.

This chunked mode is similar to the previously released &webp broadcast mode, which streamed a series of images as a custom-made video protocol, but the &webp has poor compression and quality, and would drop frames if the connection couldn't keep up.

The downsides of the chunk-transfer mode is that if the connection stalls out long enough, the video will be forced to pause and buffer. It also has a buffer, which is currently around 3 to 5 seconds on a good question -- so similar to that of Twitch. The chunked-transfer mode might be suitable for doing remote recordings of interviews where the highest quality is desirable, but it isn't suitable for live and interactive chat.

Future versions of this feature will include the option to record to a cloud service, the option to use PCM audio, the ability to encode-once, but stream to many, and more advanced protocol logic to lower the latency.

  • The option to save the chunked stream as a viewer is to use &chunked=2 on the sender side. . Using just &chunked will just enable viewing, and not saving, of the video.

  • If you set the &maxvideobitrate to less than 2500, on the sender side, it switches to a low bitrate and lower latency mode (500-ms chunk size). The default is otherwise 3500 with a 2-second chunk size. Obviously the quality will be worse.

  • &chunked=2 and &maxvideobitrate will likely get changed up and moved to the viewer side eventually; currently doing this just for convenience of development/testing. Multiple viewers is not recommended. There seems to be an issue with audio clicking that I'm trying to solve currently.

  • A video demo of the chunked transfer and how to enable support for alpha-channel transparency is available here: https://www.youtube.com/watch?v=SWDlm1Jf-Oo

Info and issues about using the chunked transfer mode

  • Note: When doing live playback of chunked-transferred video, there is currently a clicking sound that needs to be resolved still. This clicking does not appear when recording the stream to disk though, so it is still suitable for remote recordings.

  • You can enable it by adding &chunked on the publisher side of things. It does not yet work in group rooms, just basic push/view links. It also does not work with Meshcast.

  • Chunked transfer is supported in recent Chromium-based browsers, including OBS v27.2 and newer.

Electron Capture Updates

The Electron Capture app is a downloadable app for Win/Mac/Linux that plays VDO.Ninja streams in a frameless window. This makes it easy to screen-share from into Zoom or window-capture into OBS with. It contains optimizations and functions specific for VDO.Ninja, and often offers better performance than the OBS browser source capture method itself.

  • Resolutions larger than the display’s resolution are now supported on load.

  • The VDO &transparent flag will make the Electron App transparent now, although only on the desktop; not yet in OBS. In OBS, the background will appear as black.

  • Added support for the AV1 video codec.

  • Added native support for m1 silicon to the Electron Capture app for macOS.

  • OBS and Twitch Studio Beta (which uses electron.js) should automatically make VDO.Ninja videos transparent as such.

  • Updated the linux build instructions for electron capture; also added a binary of elecap for pop!-linux, so that's a first.

About Meshcast, for those uninitiated

Meshcast is a free-to-use server-based service for broadcasting low-latency video streams. It can be used with VDO.Ninja in a couple different ways, either as an iFrame or as a peer-2-peer replacement for guest and director streams. It can be used to help lower system requirements of VDO.Ninja for some users or use cases.

Adding &meshcast to a guest or director link will trigger the service, causing the outbound audio/video stream to be transferred to a hosted server, which then distributes the stream to all the viewers. This adds a bit of latency to the stream and reduces the theoretical privacy, but it implies the guest/director does not need to encode and upload multiple videos, lowering CPU load and bandwidth usage.

  • &novideo and &noaudio now work with &meshcast streams. As in, you can block audio or video streams from appearing, but both streams will still be downloaded if either audio or video is still requested. You need both &novideo and &noaudio to block meshcast entirely, or just exclude it using &view or &exclude.

  • If publishing using &meshcast, I don't bother to show the viewer count, as it won't be accurate currently anyways; instead I just say you're broadcasting. I'll try to improve this in the future.

  • Fixed an issue with &meshcast where a race-condition caused the video to not load for some viewers. fixed a couple issues with the &meshcast feature; sometimes it would be audio-only or not work at all, which is now fixed.

  • Increased the default bitrate of &meshcast from like 500-kbps to max of 3200-kbps; will probably change as the feature evolves and becomes more customizable.

  • A room's codirector(s) can now transfer guests also; they can transfer everyone except the main director really.

  • Increased the total Meshcast servers available, including more in USA and Europe.

  • Added the option to change codec and publishing bitrate (max total available outbound bitrate) of the &meshcast parameter for VDO.Ninja. Example usage: https://vdo.ninja/?mccodec=vp9&mcbitrate=500&meshcast

  • There's 4 codec options currently, including the default option:

    • The unspecified default, which is software h264.

    • There's also h264, which is what the browser then sets. This could include hardware encoding, but that will not work with Firefox or Safari viewers then.

    • vp8 is pretty compatible, so if the default codec doesn't work, you can try that.

    • vp9 is also available, which has better compression/quality, but not fully compatible with all devices.

    • av1 and svc are not yet supported, but that is planned at some point

  • Added &noaudio to meshcast.io, which can be used in place of &mute when sharing a meshcast broadcast link into a VDO.Ninja room. Blocks audio from playing, which can help avoid feedback/echo issues

  • You can select audio-only or video-only streams now with meshcast.io.

  • Added a loudness visualization meter for audio to meshcast.io.

  • Added logic to meshcast.io that auto-switches away from slow/dead servers, despite perhaps being the closest edge node.

  • Added new servers and replaced some others. Applies to the &meshcast flag as well. Should improve quality and global coverage of streams.

  • There's a drop down to select different regions; it automatically tries to select the closest though.

VDO Mixer app

This app is meant to function as a way to create custom scene layouts with VDO.Ninja, allowing the director to switch between scenes and layouts without needing more than one browser source active. It promotes a more flexible and efficient way of creating complex scenes in OBS and elsewhere using VDO.Ninja.

  • I did a walk thru video, demoing and explaining the Mixer app. I realize the mixer prototype isn't the greatest, as it's hard to understand how to use, but hopefully this helps address that: https://www.youtube.com/watch?v=9xdZq4SCBoA

  • Feedback welcomed.


Raspberry_ninja is a project designed to allow streaming to VDO.Ninja using a Raspberry Pi, Nvidia Jetson, or a Linux system.

  • Basic instructions and service file needed to auto-boot raspberry_ninja on boot has been added: https://github.com/steveseguin/raspberry_ninja/tree/main/raspberry_pi#setting-up-auto-boot

  • You now can successful save usable raw h264 video + wav audio direct from a vdo.ninja stream to disk, without decoding first. Usable, as in, it can be played back, though it still needs to have ffmpeg combine the recordings into mp4. The code can be modified to stream out to NDI or RTSP I'd imagine; just needs some tinkering. If you know Gstreamer, contributions to move this forward are welcomed, as its very time consuming for me otherwise.

  • Created a new SD card image for the Raspberry_Ninja project; this one is a year newer than the old one, and auto-resizes to fit the SD card it is loaded onto.

  • Added initial TURN server support to the RPI; should be enough to allow for mobile experimentation where p2p was being blocked before.

  • Added multiple viewer support. Using --multiviewer as a CLI argument enables multiple viewers at a time. This mode reuses the same single encoded stream for all viewers, so it might have some frame loss on bad connections, but it allows even a Raspberry Pi 4 to share 1080p30 video with over 10-viewers.

  • Bi-directional MIDI support added; you can plug-and-play a USB MIDI controller and forward the commands to a virtual MIDI device on a remote computer.

Chat Overlay Ninja

A browser extension that allows for featured-chat overlays in OBS, with support for over a dozen websites and services, including Youtube Live, Twitch, Facebook, Twitter, Instagram, Facebook, Restream, Zoom, and more.

  • add support for Zoom chat

  • fixed an emoji bug in chrome +v96 also with it

Social Stream Ninja

Inspired by the Chat Overlay Ninja project, Social Stream is a new creation that is designed to be more flexible and powerful. It's still a browser extension, but designed instead for advanced social chat tooling, including auto-responders, featured-chat overlays, dockable chat management interfaces, MIDI hotkey support, and a consolidated streaming chat overlay.

It supports Youtube, Facebook, and Twitch. It also uses peer-to-peer connections, rather than servers, so privacy and security are preserved. Chat Overlay Ninja is fantastic if all you want are simple featured-chat overlays for OBS, while Social Stream Ninja is an attempt to disrupt live chat engagement as we know it.

  • Created a youtube video demoing the updated social stream extension; customizing, docking, custom bot commands, and hot-keying: https://youtu.be/X_11Np2JHNU

  • Added hotkey auto-response commands that work with twitch/youtube/facebook, which can be issued using a Streamdeck or DJ controller (MIDI-based).

  • Added support for zoom.us (web version) and Crowdcast to the SocialStream.Ninja extension; this includes the ability to auto-respond to messages.

  • Added a &darkmode option for the chat stream, that changes the color to match a black/transparent-background in OBS.

  • Auto-hides the control bar and disables bot-triggers when chat stream is loaded as a browser-source overlay in OBS.

  • Added a 'filter by text string' input box into the chat stream control bar that lets you filter all the messages by keyword string.

  • Added a visual on/off icon to make it easier to visualize if the extension is on or off.

  • Added some new automated commands, such as !joke, which tells a joke when triggered.

  • Automated chat responses only go to the tab (social media site) that triggered them, rather to all of them.

  • Added a message to let users know if they are using the newest version or not; a link is provided to get a newer version if available.

Thank you. ♥

I'd like to say thank you to all those that have supported VDO.Ninja, particularly these last few months during the v20 development. The moderators on Discord have helped immensely, and leb in particular has helped many with support questions, along with SilverServerT.

Also thank you to those who have contributed financially with sponsorships and donations, and those who continue to do so. RASC Toronto, New Relic, statik, and many others ; thank you. Contributions help subsidize the cost of hosting the service and my caffeine addiction.

To the broader community, thank you as well. Your feedback, bug reports, and general appreciation has been a key motivator for the daily effort put towards VDO.Ninja, related projects, and supporting the community.


~ Steve Seguin

Last updated