Updates - VDO.Ninja

February 23

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

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

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

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

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

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

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

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

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

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

February 20

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

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

** on vdo.ninja/alpha/

February 16

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

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

February 12

February 10

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

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

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

February 9

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

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

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

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

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

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

** for testing on vdo.ninja/alpha/

February 8

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

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

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

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

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

February 4

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

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

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

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

  • Minor improvements to &chunked mode

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

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

    • Better control over the buffer latency

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

January 26

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

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

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

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

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

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

** updates to vdo.ninja/alpha/

January 24

  • Added &lanonly as a new URL parameter

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

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

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

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

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

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

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

January 23

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

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

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

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

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

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

January 22

January 20

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

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

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

January 17

  • GitHub updated with recent VDO.Ninja changes

January 16

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

January 10

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

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

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

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

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

January 8

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

January 7

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

January 6

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

    • On alpha for testing

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

January 5

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

  • Updated GitHub with some recent fixes and changes.

2023

December 29

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

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

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

December 22

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

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

    • Available on alpha at vdo.ninja/alpha/

December 19

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

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

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

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

December 17

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

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

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

** on alpha

December 15

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

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

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

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

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

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

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

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

December 9

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

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

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

** changes on alpha at vdo.ninja/alpha

December 6

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

December 4

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

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

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

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

December 3

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

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

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

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

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

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

** changes on alpha

December 2

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

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

  • Completed a couple nights of dev ops systems maintenance work

November 20

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

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

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

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

November 9

November 8

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

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

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

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

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

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

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

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

** changes on alpha

November 5

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

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

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

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

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

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

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

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

November 4

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

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

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

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

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

    ** change on alpha

November 3

November 1

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

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

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

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

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

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

October 30

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

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

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

** on alpha

October 25

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

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

October 23

October 22

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

    • Seems to fix audio/video sync issues.

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

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

https://github.com/steveseguin/browser-to-rtmp-docker

October 21

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

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

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

October 20

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

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

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

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

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

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

October 19

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

October 16

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

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

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

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

October 15

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

October 14

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

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

** on alpha at vdo.ninja/alpha/

October 13

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

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

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

October 12

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

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

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

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

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

October 9

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

** on production (hot patch) and alpha

October 7

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

October 6

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

September 27

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

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

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

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

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

September 25

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

** on alpha

September 20

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

September 15

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

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

https://vdo.ninja/alpha/?label=Steve_Seguin\n(he/him)\nhttps://twitch.tv/vdoninja&push=JaAiVEH
https://vdo.ninja/alpha/?view=JaAiVEH&showlabel

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

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

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

September 14

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

September 8

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

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

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

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

September 5

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

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

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

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

September 2

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

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

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

** changes on alpha

September 1

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

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

** changes on alpha

August 28

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

August 27

** at vdo.ninja/alpha/?clock24

August 26

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

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

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

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

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

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

** on vdo.ninja/alpha/

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

August 23

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

August 17

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

** on alpha

August 13

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

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

** on alpha

August 11

August 10

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

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

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

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

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

** on alpha at vdo.ninja/alpha/

August 9

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

August 6

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

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

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

** on alpha at vdo.ninja/alpha/

August 5

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

August 3

July 31

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

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

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

** everything is updated on production and alpha

July 28

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

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

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

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

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

July 25

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

July 24

July 23

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

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

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

July 20

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

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

July 19

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

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

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

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

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

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

** on alpha

July 18

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

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

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

** on alpha

July 17

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

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

*changes on alpha at vdo.ninja/alpha/

July 15

  • Using &room&director together now gets handled better

  • Minor fix to solo talk with the remote API

  • Alt solo talk support added to the remote API

July 13

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

July 10

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

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

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

July 9

July 7

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

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

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

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

** changes on GitHub and on alpha

July 4

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

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

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

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

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

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

-- eg:

vdo.ninja/alpha/?view=stream2,stream2&avatarimg=./media/avatar1.png&avatarimg2=./media/avatar2.png&avatarimg3=./media/avatar3.png

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

** on vdo.ninja/alpha/

July 1

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

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

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

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

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

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

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

June 28

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

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

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

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

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

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

*** on alpha for now

June 27

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

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

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

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

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

** all changes pushed to production

June 26

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

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

Example of the commands:

https://vdo.ninja/alpha/?view=YbFmisR&poster=./media/bg_sample.webp&hideplaybutton

** on alpha for testing

June 19

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

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

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

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

** on alpha and now also on production

June 14

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

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

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

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

** changes on alpha

June 8

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

June 7

June 6

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

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

June 4

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

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

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

*on alpha

June 2

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

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

May 30

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

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

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

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

** changes on alpha

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

May 28

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

** on alpha for testing

May 26

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

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

May 24

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

** on production

May 23

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

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

** updated on production and alpha

May 17

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

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

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

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

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

  • Few other CSS changes to the settings menu

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

May 14

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

May 10

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

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

May 9

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

May 8

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

May 5

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

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

May 4

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

May 3

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

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

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

May 1

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

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

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

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

April 27

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

April 25

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

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

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

April 19

April 18

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

April 17

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

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

April 16

April 14

  • 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

April 13

April 12

  • 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.

April 11

  • 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

  • If having issues with Meshcast and iPhone/iPad users (video being black), I pushed a patch to vdo.ninja/alpha/ and meshcast.io (either will work). I've partially updated &meshcast on production with a fix also, but I won't be able to fully fix it on production probably until late tonight.

April 9

April 7

April 6

  • VDO.Ninja updated on GitHub and alpha with all recent changes.

April 5

  • 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.

  • &noaudio and &novideo works with &chunked mode sources now also, so you can have audio or video only chunked mode if needed. ** on alpha

  • 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)

April 3

March 31

March 24

March 23

  • 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

March 20

  • 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.

March 18

  • &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

March 17

  • 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.

  • The hidden user-list can be closed when using &broadcast mode now

  • Bug fixed with the vdo.ninja/twitch page, via a community code contribution

March 13

  • 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

March 6

March 4

  • Pushed some audio-related fixes for iPhones onto alpha. The audio-meter was active even when muted, and I think I fixed that now.

March 2

  • 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)

February 27

  • 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)

February 26

  • 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 later

    https://vdo.ninja/alpha/?room=roomID
    https://vdo.ninja/alpha/?room=roomID&push=XdTX2qX

** on vdo.ninja/alpha/

February 24

  • 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 to xxxxx: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.

February 22

  • 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)

February 19

  • 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

February 16

  • &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.

  • 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/

February 15

  • Digital zoom fixed to support a change in orientation.

February 10

February 9

  • Welcome message in vdo.ninja will not auto-clear now, rather there is a close button to clear it

  • Fixed an issue with darkmode + &avatar (fix via Lindenkron)

  • 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

  • &chunked mode on alpha will work now even if there's no audio included ** on vdo.ninja/alpha/

February 1

January 31

  • Added &record=false or &record=off (or session.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 adds data-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.

January 25

January 23

  • 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.

January 21

January 20

  • 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=XXX
    https://vdo.ninja/alpha/?view=XXX&controlobs&bitcut=300&cutscene=FML&remote

    You 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

January 19

  • &autorecord can now accept a bitrate as a value, as it wasn't doing so before (on alpha)

January 16

  • New turn server added to Washington DC area.

  • &website as a director now works again (auto shares a website to all guests)

  • If multiple mic inputs are selected, they will be auto-selected on page load (rather than just one mic only). ** changes on alpha

January 12

  • &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

January 11

January 9

  • 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.

January 4

2022

December 30

  • 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.

December 27

  • 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 &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/

December 21

December 19

  • &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 at https://vdo.ninja/alpha/?fsb (join a room as a guest to trigger)

December 18

  • 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.

December 11

  • 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.

December 10

  • Pushed a couple hot fixes for recently found bugs introduced in VDO.Ninja v22.

    -- 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.

December 9

December 8

  • 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

  • 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

December 5

  • 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.

  • Fixed the Tally light system. (broke in v22 I guess)

  • 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

December 4

  • 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

December 2

  • &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.

December 1

  • Fixed a bug where the guest screen share, while in broadcast mode, was misplaced on the screen.

  • Fixed a bug where &language didn't work in translating a couple elements, like "join with camera".

  • 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.

November 29

  • 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.

November 24

  • 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 with the video-settings sliders in the director room, where changing a setting didn't visually always update the correct feedback input field - fixed a bug where using &view=xxx&novideo didn't display a press-to-play button in the browser.

  • Fixed a bug where the self-preview video didn't have the right height when using &layouts.

  • 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.

November 23

November 22

  • Fixed an issue where the right-click -> edit URL feature in v22 broke

  • 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.

November 19

November 18

  • I separated &sync and &buffer, so audio-sync isn't auto-enabled when &buffer is specified in the URL. I was finding &sync was causing some audio clicking issues, as adjusting audio playback speed isn't easy; you have a choice now. Use &buffer and &sync together or standalone items.

  • Fixed an issue with iPhones where changing the camera caused your own preview video to go small.

  • &screensharebitrate now works outside of group rooms, even with basic push/view links.

November 16

  • 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.

  • 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 with session.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.

November 15

  • 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.

  • I improve the &buffer and &sync feature a bit -- it will activate and sync up faster now, which might be helpful on unstable connections.

  • 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.

November 11

  • 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".

November 8

November 7

  • 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 contain obs 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

November 5

  • 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

November 4

  • 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.

November 3

  • 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/

November 1

October 30

  • Deployed a turn server to Seoul, SK. on beta & alpha

October 28

  • Added more 'visually impaired' meta data to help with assisted readers ** on vdo.ninja/alpha/

October 26

  • Added &labelsuggestion=defaultnamehere (aka, &ls) This is the same as &label, except it asks the user still for a user name. If they leave it blank or cancel the prompt asking for a name, it will use the default label. https://vdo.ninja/alpha/?ls=guest&webcam Once the user enters their label, &label=username is added to the URL, so if they reload, they won't be asked again for the label. &label takes priority over &labelsuggestion. This is on vdo.ninja/alpha for testing/feedback

  • Fixed an issue where &activespeaker and &showlist and &style=6 wasn't working together as expected

  • Updated vdo.ninja/beta/ , so it's now in sync with alpha

October 24

  • Added &groupmode to VDO.Ninja, which changes the way groups work when not in a group. With &groupmode added to your URL, when not assigned to a group, you don't hear or see anything. This also goes for remote participants who are not in a group - you will not see or hear them if they are not in a group, even if you also are not in a group. The default normally with VDO.Ninja is that if not in a group, you see and hear everyone. This remains true if not using &groupmode, even if others in the room are. Others may not be able to see or hear you though, if they have &groupmode enabled, and you haven't picked a group. So, &groupmode only impacts the local user, and will not impact remote connections. ** changes are on alpha. Please report bugs.

October 10

  • Added &layouts=[[{xxxxxx}]] as a URL parameter option, where you can pass a set of different layouts (as a URL-encoded ordered array) to VDO.Ninja. (** on alpha) This is akin to using the vdo.ninja/beta/mixer, to visually set layouts, but instead you are just manually setting all the available layouts directly, bypassing the mixer app. Once you have set the layouts, the "layout" API feature becomes a bit more useful, as you can remotely activate any of those layouts with a simple API command. I documented the 'layout' API option a bit here, but the tl;dr; is that you can either use this API call to set a layout from within the array of layouts that are set, or you can pass a full-fledge layout-object, for on-the-fly custom layouts. ie: {action:'layout',value':5} or {action:'layout',value':[{xxxx.layout-stuff-here.xxxx]]} fyi, the layout and the API in general work with the vdo.ninja/beta/mixer page, so you can use it to create the layouts, and then manually switch between them via the API. The API is streamdeck-friendly. https://github.com/steveseguin/Companion-Ninja/blob/main/README.md#custom-layout-switching-

  • &meshcastbitrate works again; some recent chrome updates I think broke it a bit, but it's fixed now. This lets you set the Meshcast bitrate higher than 2500-kbps via VDO.Ninja. (Please set sparingly, with targets limited to just what's needed)

  • The director's "request" microphone/output change button has a "refresh" option now, which doesn't require a user's permission to use. It will "refresh" the currently active microphone/speaker output, which might solve issues with unexplained sudden audio loss. (the 'refresh' will reconnect the audio pipeline for that device, so if it crashes, this can potentially fix it -- fyi, this already was an option for the video device. -- if using the &consent, then the buttons will now say "apply", instead of "request", as you don't need to request a change in that case.

  • Fixed some niche audio issues where if loading canvas-only view links (no video, just audio) are loaded in Chrome/Firefox, with &style=2 set, the audio didn't play due to auto-play problems. With this fix it will now play the audio, although you'll still need to click the screen first. Before it got a bit stuck, even if clicking the screen. ** changes on alpha at vdo.ninja/alpha/

October 8

October 2

  • Fixed a couple minor bugs with VDO.Ninja, such as the &consent message on dark-mode not being easily read.

  • Improved the API for remote controlling mute/add2scene/etc for guests. True/false and 'toggle' work as values now; before just toggle worked for guest-specific calls. (changes on alpha)

September 27

  • &welcomeimage added; this lets you specify a welcome image (URL) that appears for a few seconds before fading away once a guest joins. ie: https://vdo.ninja/alpha/?welcomeimage=https://vdo.ninja/alpha/media/old_logo.png&webcam ** on alpha

September 26

  • Updated the screen-share layouts to have a larger screen, relative to the other videos: It now targets an average of around 80% screen real-estate for the main screen share.

  • Up to 20-videos on screen now are supported in the screen-share view; before after around 12-videos they started to be hidden

September 23

  • Firefox won't playback stereo audio as stereo by default now; it will require the &stereo/&proaudio flag to enable stereo playback. &mono also works with Firefox now, allowing you to use &proaudio&mono with Firefox. (this was just a quirk of Firefox's default settings vs Chrome that I long needed to address)

  • ** updated both alpha and beta.

September 21

  • When using &waitimage, the specified 'waiting to connect' image will appear after all connections end. This is a bit different than the default behaviour of the spinner, which doesn't re-appear, but I assume if you're advanced enough to use the &waitimage option, you're okay with this.

  • ** on alpha at vdo.ninja/alpha

September 19

September 17

  • &waitimage now has its wait image 'fit' to the screen, and &cover will have it 'cover' the screen.

  • &waitimage now works with scene links; not just basic view links. (** on alpha)

September 16

September 12

September 9

  • Added mobile touch support to the tap-to-focus (only mouse support previously).

  • Minor issue with drag-to-zoom fixed.

  • Fixed issue with not being able to reset video settings to default after changing them.

  • &autohide works better now; also on mobile, the &autohide makes the control bar transparent on timeout, to avoid conflicts with tap-to-zoom/focus logic.

  • It's easy to adjust video settings on mobile, as there is a large space to scroll without accidentally clicking a setting slider. Also more bottom padding, making it easier to click close in landscape mode.

  • Made the &sticky redirect confirmation prompt less ugly, and I now don't ask if the URL already matches the saved session's URL.

  • Made some changes/fixes to the recently new switchMode (&previewmode) function of the director room (hopefully no bugs?). ** changes on alpha @ vdo.ninja/alpha/

September 7

  • Increased the size of Canadian and German turn relay servers (4x larger), and completed other backend maintenance.

September 6

  • &showconnections will display the total number of p2p connections of a remote stream. Works with the director's room and the automixer. Might help give comfort over privacy/security during a stream.

  • Total number of p2p remote connections (viewers) of a stream source will also appear in the stats menu, even without &showconnections. Could be useful for debugging CPU/bandwidth issues.

  • Added showChat and showDirectorChat as HTTP/WSS API options for sending messages to guest(s). Useful if you want to hotkey a streamdeck command with some welcome message for guests.

  • Added events notifications relating to the director's guest-mute, guest-video-mute, and guest-position-change actions, along with any remote-video-mute updates to the HTTP/WSS API (by request for the bitfocus companion app)

** on alpha

September 2

  • Noise gate remote control has been tweaked a bit; the correct state is loaded now on a director's page refresh

  • Fixed issues on alpha, including now where the labels for guests were not always positioning correct if audio-only

  • ** changes on alpha @ vdo.ninja/alpha/

August 31

  • &noisegatesettings has been added to vdo.ninja/alpha/, which is used in conjunction with &noisegate. This feature lets you tweak the noise-gate's variables, making it more or less aggressive as needed. example: https://vdo.ninja/alpha/?noisegate&noisegatesettings=10,25,3000 It takes a comma separated list: -- First value is target gain (0 to 100), although 0 to 40 is probably the recommended range here -- second value is the threshold value where the gate is triggered if below it. ~ 100 is loudly speaking, ~ 20 is light background noise levels, and under 5 is quiet background levels. -- third value is how 'sticky' the gate-open position is, in milliseconds. Having this set to a few seconds should prevent someone from being cut off while speaking or if taking a short pause.

August 25

  • Added new sender-side parameters that can customize how you want VDO.Ninja to balance resolution vs frame rate, specifically when bitrate or CPU is insufficient to offer both at the same time. -- for video, &contenthint=detail -- for screen-shares, &screensharecontenthint=motion, which will override &contenthint for just screen-shares if set also. The two options for video are detail or motion. Screen shares generally tends towards detail by default, and camera sources are tend towards motion by default. detail will try to prioritize resolution over frame rate, so the frame rate may drop a lot used. motion will try to maximize frame rate, but may drop the resolution a lot. There's no way to force both on as there's no magic bullet if your CPU or network cannot keep up. note: If using &codec=vp9 on the viewer side, the frame rate may drop as low as even 5-fps. -- Also for audio, I've added &audiocontenthint=music The two options are speech and music. No idea what it does exactly, but when using music there seems to be a fixed bitrate of 32-kbps sent out by default, where as with speech it is variable, using less bandwidth when not speaking. These parameters have been tested on Chrome, but other browsers may vary in behavior. Safari seems to just ignore things, for example. ** changes on alpha

August 23

  • Updated the translation files on GitHub and on vdo.ninja/alpha/, so recently added UI elements can have alternative translations added

August 22

  • When you toggle the customize-scene-link function as a director, some of those items will now be applied to the guests' solo link also. (just the ones I think are relevant)

  • &sharper and &sharpen are now aliases of &dpi=2, which should 'up to' double the amount of playback video resolution, if the dynamic resolution optimization is enabled at least, in certain cases. This is a lot like &scale=100, but perhaps slightly more efficient in some cases. This is mainly for when you intend to have a large screen-shares in a scene, where you don't want the tiny guest videos to be a 100% scale, but 50% scale is fine (up from 25% scale). &dpi already exists on production, but by adding these aliases, I hope it's more discoverable.

  • As an alternative to &sharper, I've also added &sharperscreen, which sets &scale=100, but only for screen-shares. (virtual cameras not included). This is probably even more efficient than &scale=100 or &sharper, and it's designed for when screen-sharing a lot of text. Text looks a bit soft when streaming video at 1:1 pixel resolution. It's recommended to only use these parameters within the context of a scene link, and not on guest links, due to the higher CPU / bandwidth it may use.

  • Chunked mode on alpha lets you switch cameras/audio now, without them breaking; muting video still breaks things tho. (chunked mode remains a WIP) ** changes push to alpha

  • Put up a YouTube video (second in a series so far) where I am investigating the performance of a cellular bonding device and its software, specifically as it relates to VDO.Ninja uses. If on a bad connection, doing remote streaming, or just want some added stream reliability, cellular-bonding seems worth considering. https://www.youtube.com/watch?v=-BNpoWhzKHw

August 17

August 16

  • &activespeaker=3 and 4 added; which are the same as 1 and 2, except it will not switch to show audio-only sources (just video only). As a recap, active speaker mode shows the person(s) who are actively speaking, and hides those who aren't.

  • Fixed a bug/race condition in Chrome where the web-audio audio effects pipeline and having to 'click-to-play' didn't always unmute all the audio. (&activespeaker mode when viewed as a scene, in chrome, for example. Wasn't an issue in OBS)

  • Changed chunked mode a small bit, so the video stream uses the same frame rate and resolution of the original video source, rather than a fixed resolution/frame rate.

  • Chunked mode should work with audio-only or video-only tracks now

  • Solo links are setup to use &solo instead of &scene now; it's the same outcome, except &solo tells the system not to apply custom 'layouts' to them. Links updates in the director's room and the mixer app. ** changes on the alpha version of VDO.Ninja at https://vdo.ninja/alpha/

August 11

  • Bugs with &screensharetype=3 have been resolved, I think. (this mode supports desktop-audio capture without echo issues)

August 9

  • &aspectratio now works with screen shares, so you can force crop an incoming screen share to be a certain aspect ratio. If &screenshareaspectratio is used, (&ssar), it will apply to just screen shares. If &ssar does not have a value passed, it's assumed to be set as "default", which overrides &aspectratio option, if used also. ** on alpha, ie: vdo.ninja/alpha/?ar=2.0

August 6

August 5

  • When the director talks to you in solo-talk mode, the other guests in the room now drop to 25% volume. This way the guest the director is talking to can hear the director more clearly. (by request) * on alpha, https://vdo.ninja/alpha/

August 3

  • &hidecodirectors will hide the co-directors from appearing in the director's room. You might have a few co-directors join you, but they might be taking up space, so this is a way to prevent that. It simply hides the boxes; they are still there at a code level.

  • Added https://updates.vdo.ninja/, which will mirror the updates from this discord 📑│updates channel, which should be helpful for those not using Discord to see development progress. (basic, but will undergo more updates). The Discord in general has been undergoing improvements; the mods here have been working hard to keep the discord and documentation functional, so thank you to them.

  • Added &mobile and &notmobile as a couple options to vdo.ninja/alpha/ I already have &flagship, &noscale, and &forceios as a few options to configure mobile devices, but mobile/notmobile are more generic options that will optimize a guest/push link based on whether VDO.Ninja thinks they are a smartphone or not. &mobile might help reduce CPU issues, and &notmobile might be able to improve video quality (in case you want to override the automatic defaults, which already detects if a device is mobile or not).

August 1

  • The pop-out chat feature has had a bug fixed and minor polish applied

  • When using the IFrame API to control bitrates, I have added an optional called "lock" that lets you affix the bitrate you set so the rest of VDO.Ninja doesn't try to constantly override it. {bitrate: 2500, lock:true} for example. I also assume lock=true by default, so no changes are needed really to start benefiting from this. (previously you had to disable the auto-mixer to lock a bitrate).

  • Also added {manualBitrate: xxx} to the IFrame API , which is a bit like bitrate, but keeps track of what the current target bitrate should be. When you set manualBitrate=false, it will apply the expected target value. Also, it won't work when used in conjunction with custom audio bitrates, whereas bitrate will.

  • There's a third new bitrate option, which is targetBitrate, which lets the automixer keep doing its thing, but it sets a new max target bitrate. The target bitrate will still be applied when set, but the automixer may lower it if needed when it decides to, but it's the new target for 'unlocked' max speed. Some browser will ignore it though, if it's set higher than the bitrate that was manually set the via URL, so it's probably something you don't want to use along with &bitrate.

July 27

  • Fixed the new OBS &remote=xx not working correctly when a password was set (on alpha and GitHub)

July 24

  • Fixed a bug where if the director is highlighted, newly loaded scenes would be blank.

  • Added two-way solo talk as an option to the http/wss VDO.Ninja API.

July 23

  • The &webp mode has been modified a bit. Main change is that you now enable it by add &webp to the sender's URL, and &codec=webp to the viewer's URL (otherwise, it falls back to normal video mode). No need for &broadcast anymore. (as a reminder, this mode sends the video as a series of low-quality images, rather than a more efficient video stream).

  • I've removed the toggle in the director's room for this &webp feature, as &chunked mode is replacing its purpose there, but you might still want to use this mode when the viewer-side does not support video playback or hardware acceleration. Specifically, this option lets you bring motion images (aka, crude video) into the Streamlabs mobile app, as a browser source, where other forms of video decoding is not supported.

July 21

  • The &grid overlay option now works in non-room mode

  • Added the toggles for &grid and &avatar to the director's link customization section.

  • Added &smallshare as a new option, which makes the screen share behave like a webcam share. ie: not larger in size vs other windows, for the publisher or the viewers. This is a push-side parameter. This is useful if a VR guests screen sharing an app of themselves, versus using a virtual camera. It can also be useful for gaming, where a larger screen share might bog down the system of the sender more than needed. *** on alpha at vdo.ninja/alpha/

July 20

  • Fixed some of the labels for the local audio labels; camel-case is replaced with words, and true/false replaced with on/off.

  • Fixed an issue where iPhones's video output would freeze when the director would feature-highlight any other participant.

    ** on alpha at vdo.ninja/alpha

July 19

  • Added the ability to "tap to focus" when a camera supports focusing. You'll want to switch the camera over to manual focus (via settings->video->focusMode) before it will be active, but then you can just touch on the screen to have it auto-focus on that spot. Note: It's a bit slow and not 100% accurate and may conflict with the zoom, if used. on alpha at vdo.ninja/alpha

July 16

  • Added an option to post a snapshot of your local camera to a HTTPS/POST URL (blob/jpeg)

    https://vdo.ninja/alpha/?postimage=URL_TO_POST_IMAGE_TO_AS_BLOCK&postinterval=INTERVAL_IN_SEC

    so, for example, https://vdo.ninja/alpha/?postimage=https%3A%2F%2Ftemp.vdo.ninja%2F&postinterval=30 posts to a sample test server I have up. The URL is URL encoded, but not always necessary. If posting to my test server, the image can be accessed at https://temp.vdo.ninja/images/STREAMID.jpg. There's caching enabled mind you, so you'll want to post-fix the current timestamp to the URL to disable that per request. For example, https://temp.vdo.ninja/images/yiMkpMg.jpg?t=3412341234 This feature could be useful to checking out a stream before actually connecting to it, as that's my intent with it, but it is also something you can use with Octoprint, where you need an IP camera jpeg source as input. ** on alpha, at https://vdo.ninja/alpha/

July 14

  • The &website function now lets you start/stop and change website sources; no longer is it just one site and that's it. (only the director previously could change websites constantly). I suppose you could use this to remotely change inputs in an OBS browser source via a remote website, as I think the YouTube implementation supports synced playback/scrubbing.

  • There's toggle in the director's room now to add &scale=100 to the scene links. Might improve sharpness a bit, at the cost of increased CPU/network load.

  • Fixed an issue where if a guest was viewing the director in full-window mode, and the director changed the total room bitrate value, the new &totalroombitrate value would be ignored by that guest until they exited the full-window mode.

  • Also fixed an issue where if setting a custom total room bitrate value higher than 4000 via the URL (&totalroombitrate), the slider to adjust the TRB value will be extended so the max range is that of the URL value if higher than 4000. ** on vdo.ninja/alpha/ for testing.

July 10

  • Tweaked the mic meter on vdo.ninja/alpha (3x more intense) and added a visual meter to the settings menu; should help judging if you're mic is active easier. (by request)

  • In case curious, I've been working on quite a few core-components and larger new features for VDO.Ninja this week. ie: chunked video improvements, IFrame API enhancements, refactoring code for future ui dev efforts, and some invite management features. I'll probably update more on those things once they are further along or complete.

July 3

  • Unless manually specified (&screensharequality or &screenshare), I have the screen share resolution matching the webcam resolution now. This avoids a sudden CPU spike when screen sharing; still room for improvement tho.

  • For the time being, I have &limittotalbitrate only applying to guests, rather than all viewers. I need to revisit this at some point soon. ** changes on alpha

July 1

  • The WSS API (wss://api.vdo.ninja) has been expanded to include hang up events for publishers, along with viewer-side events for incoming connections/streams. These efforts will lead to a richer StreamDeck integration.

June 30

  • Fixed a bug with &statsinterval=100 not updating on sender side (only viewer side before). This updates how frequent the stats updates.

  • Added the ability to dynamically change the scale of a video to the IFRAME API. accepts scale, plus optionally uuid or a stream ID as a a target.

  • Added &base64js, which lets a user add raw java script to the URL to run on page load. https://vdo.ninja/alpha/?jsb64=YWxlcnQoJ2hpJyk= to test. ** changes on alpha

June 28

  • Added support for &buffer and &sync to the viewer when using &chunked mode on the sender. If on an unstable connection, setting the buffer to a few seconds can help avoid pauses in the video playback, as there will be some buffer to use. (a bit experimental still -- so it might be more a WIP still ).

  • Added a new url param called &include, which is like &view, except it's for including streams that do not exist in the room you are in, assuming those streams are not in another room and have matching passwords. So, useful for adding basic push-streams that you might want to be in multiple rooms at the same time, but not actually be locked to any room. (&view, conversely, is pretty exclusive; that or nothing.)

  • Been playing around a new flag called &flagship, which will optimize the mobile experience for more capable smartphones; essentially, streaming higher quality video to other guests versus the normal mobile-performance mode.

  • I've also modified the non-flagship mode, for low-end mobile devices, to use the &limittotalbitrate flag by default (500-kbps). &limittotalbitrate hasn't been that heavily tested yet, but it's part of v22 and might be better than &totalroombitrate; currently I'll increasingly use them together I think though. They are both the same concept, except one is viewer-side controlled, and the other is sender-side controlled; both limit the bitrate that guests in the room see based on the number of guests in the room. ** changes to alpha, at https://vdo.ninja/alpha/

June 25

  • The api.vdo.ninja remote control API is expanded to send push event notifications to web-socket listeners when the local mic/speaker/camera is muted. This was added on request for making the bitfocus companion app smarter about keeping track of mute states. (on alpha)

June 16

  • Option to randomly generate a room name has been added to the room-creation page - minor fixes to the mixer have been applied; (lots more to do)

  • &aspectratio + &crop (sender side options) has been updated to work with more camera/sources. If you do vdo.ninja/alpha/?webcam&aspectratio=0.5625 for example, you'll get portrait mode. Not compatible with Safari though.

  • Video/audio stats for Firefox have been improved; resolution, framerate, codec, bitrate.

  • &meshcastcodec=h264 won't fail when using Firefox and Meshcast

  • &chunked recording in the director's room works correctly ** These changes are on beta @ vdo.ninja/beta

June 9

June 8

  • When screen sharing, if the resolution that's requested by the viewer is roughly 100% full scale, (a value based on their window viewing size), the system will now snap the resolution up to 100% (like &scale=100). This should help with video sharpness (text, etc), when the added burden of slightly more CPU load is worth it. Won't snap if the different is great though.

    For example, if a viewer is on a 720p display, watching 1080p content from a director, that's not close enough to make it worthwhile for the director to send 1080p. But if the viewer's window was 1050p, then sending the full 1080p video is worthwhile. This is mainly because scaling seems look nicer when done on the viewer's end, instead of the sender's side.

    Only applies to screen shares, as text-scaling is kind of ugly, and it seems to be commonly desired to make fonts less ugly when screen-sharing. Scaling will still occur, but it won't be as ugly when done by the viewer. Sending 100% all the time works too, via &scale=100, but is pretty inefficient and needlessly heavy on the CPU in most cases.

  • Fixed on issue where is screen sharing as a director, before turning on your camera, didn't show the screen for guests always.

June 7

  • When holding CTRL and selecting multiple videos to record as a director (in control room), it won't ask for the video bitrates multiple times now; just once for all the selected videos. (this hot fix has been applied to production and beta). This feature is useful for recording multiple videos in sync.

June 6

  • Fixed an issue where if you did right-click -> record of a inbound-video, and then hung up without stopping the recording, the recording wouldn't stop and finalize. (on alpha)

June 4

  • Added the ability to have multiple unique audio output destinations per VDO.Ninja instance.

    To use at the moment, right-click a VDO.Ninja video in chrome/edge/electroncapture, (on the alpha-version of VDO.Ninja), and you'll see a menu option to change the audio output destination. This selected output destination overrides the default audio output destination set in the VDO settings menu, and it's specific to just the video that you right-clicked.

    This option allows you to have one audio stream output to a virtual cable, and another output to your headset, for example.

June 2

  • &sensor now also includes speed and altitude data (on production)

  • Added a demo/sample on how to overlay speed + acceleration on top of video playback (compatible with a mobile phone sender) vdo.ninja/examples/sensoroverlay?view=STREAMID

  • Added a new option to explicitly list what sensor data you want to capture and transmit, when using &sensor &sensorfilter=gyro,lin,acc,mag,pos,ori For the above demo, you can use &sensorfilter=pos,lin to just send the data you need, reducing the load on the phone/network. (on alpha)

  • Implemented a workaround for a novel Chrome bug where specifying a custom audio channel in the director's room (C1, C2, etc) would break the custom audio output device support. * Fix pushed to alpha.

June 1

  • Added the &meshcastscale (&mcscale) parameter; this will scale down the Meshcast video output via the URL, post camera capture setup. Because of how Meshcast works, this is a sender-side parameter. You may wish to use this to lower the resolution if your camera has a fixed capture resolution. (Alternatively, if you need to dynamically adjust the resolution, that option already exists via camera settings via width/height slider adjustments) https://vdo.ninja/alpha/?meshcast&mcscale=50

  • Fixed a conflict when using &director parameter + &webcam/&website/&screenshare parameters at the same time (the later parameters get disabled now, avoiding conflicts)

  • If using a view-push link combo, just to be safe, I have the viewer re-request unloaded streams automatically at a interval now. For unattended viewing sessions.

  • Pausing a video while it is in 'full window' mode, will actually pause it now.

May 27

  • Improved logic for determining best turn server to use, if needed. (on alpha)

May 23

May 21

  • Added new viewer-side parameters that can be used in place of &scale; &viewheight=180&viewwidth=320, (aka &vw/&vh) which effectively does the same thing as &scale, but instead you pass a resolution. -- It's important to note, that due to flexibility to request width/heights that are not aspect-ratio compatible, and due to bitrate/quality resolution limitations, these values are just 'max' target resolution values; the actual resolution you get could be still less. They also do not impact the actual capture resolution of the remote sender's camera, so its purely for requesting a specific downscaled resolution. This command applies to all video elements in a view port, and it disables the auto-scaler functionality. -- Similarly, also added the option to the IFRAME API to request different down-scaled resolutions dynamically, per connection, if you want greater programmatic control vs static URL options. This is on alpha at vdo.ninja/alpha/?vw=300

May 20

May 19

  • Made a new bitrate option called &maxbandwidth, which differs from other commands as it leverages a chromium (chrome/edge/brave/electron) feature to judge the available bandwidth of a sender's connection. Passing a value to it as the sender (a percentage; 1 to 100 ideally), you can try to ensure the connection never uses more than that amount of the available reported bandwidth. (on alpha) So the notion is, if you want to set the invite link bitrate to 50-mbps, but one guest only has only a 20-mbps connection, &maxbandwidth=80 will try to limit the bitrate to around 16-mbps. I sometimes will tell people to set the bit rate to about 80% of what their connection can allow, as higher than that can result in some frame stutter when there is packet loss, since the connection lacks headroom to recover. This command will try to do it automatically, for all the viewers of a stream. My goal here is to use it with the mixer or stats app, so eSports users can crank out high bitrates with less tinkering per guest. I have no idea how well it will work in practice so far.

  • Fixed an issue where the director's mic audio could cut out after stopping the screen share, depending on how the screen-share was cancelled. - added &showall (or &style=7), which will include non-media-based push connections as video elements in a group room. This can include guests that joined without audio/video, directors, or a data-only connection, like maybe MIDI-output source. - to help avoid some types of connections showing up when using &showall, I've also added a &nopush mode, which blocks outbound publishing connections. This acts a bit like a &scene=1 link, so unless &showall is added, you'll need to use the IFRAME API to show/hide videos in it. (also just on alpha atm)

May 16

  • Stats for Meshcast will now appear in the director's scene stats section and the new stats page; by request

May 15

  • Beta updated with all recent updates and new mixer updates. Find it at: vdo.ninja/beta/

May 14

May 11

  • &remote, if used on a push link without a password added, it will now allow the remote viewer limited control (hangup, focus, zoom, detailed stats), even if they don't have &remote added to their URL also.

May 8

  • Had a request to add mirror + flipping of video itself, rather than just via CSS. (as full-screen support was needed). I already had &effects=2 for mirroring the actual video itself, so I've added two more modes that can flip and flip+mirror. Might be useful for teleprompter work.

    https://vdo.ninja/beta/?effects=-1 flips
    https://vdo.ninja/beta/?effects=-2 flips + mirrors
    https://vdo.ninja/beta/?effects=2 mirrors
  • I've added experimental support for local Media Recordings to iPhone/iPad devices. (&record may work now, etc)

  • The iPad/IPhone needs to have "MediaRecorder" enabled in its "experimental webkit features" Safari settings section

  • I've included numerous pop-up warning messages to ensure the 'experimental' part is communicated

    ** on vdo.ninja/beta/ (all current code is up to date on beta)

  • &controls=0 [off/false] or &nocontrols, will force hide the video control bar. (on local dev atm)

May 5

May 4

  • When you "full screen" a video using the native browser-full screen button, it will now behave the same way as the full-window solo button now. (increases the resolution of the target video, and lowers the bitrate of the others, now hidden, videos.). * on beta/dev branches

May 3

  • Made &totalbitrate (&tb) set both &totalscenebitrate and &totalroombitrate flags. Not quite sure how well it will work, but since a scene and a guest are exclusive possibilities, it's a bit of a flexible way to just learn one flag to do it all, as I realize all the options can get confusing. &trb and &tsb limit the total incoming bitrate, dividing up the bandwidth available to each video being played back. There are nuances in differences, with the main one being &trb is for a guest link and &tsb is for a scene/view link. (on local dev for now, pending more testing)

May 2

  • Fixed a more recent bug in VDO.Ninja where the special &sstype=3 screen share mode did not work as solo links; stats for it were not always cleaned up either, so that's fixed too. (on dev)

April 26

  • ** Beta updated will all recent changes, including mixer. (vdo.ninja/beta) I'm considering this upcoming release as version 22.

April 25

April 23

  • Added &disablehotkeys to VDO.Ninja (hot patched), to allow for hotkeys (like CTRL + M) to be disabled.

  • &notify works with basic view/push link combos; before it only beeped when a guest joined a room. (on alpha)

  • &nohangupbutton (aka, &nohub), has been added to VDO.Ninja (hot patched). This option hides the hang-up button, so it can't be accidentally clicked.

April 19

  • Selected audio and video devices are remembered automatically on reload/refresh, without needing a URL parameter. On alpha for now. https://vdo.ninja/alpha/

  • &js is a new parameter for VDO.Ninja that lets you pass a third party hosted Javascript file URL (URL-encoded), allowing for custom code injection without self-hosting, IFrames or chrome extensions. On VDO.Ninja, by user request.

April 18

  • Deployed a TURN server to Mumbai, India.

April 17

  • &minipreview and &grid (rule of thirds) parameters work together now (local dev of VDO.Ninja)

April 12

  • &mcsscodec=h264 should now work correctly independently of &meshcastcodec. (These features let you select the codec / profile ID of the encoder that gets used when publishing video to Meshcast via VDO.Ninja.) ** code updated on beta (vdo.ninja/beta)

  • Added &autorecordlocal and &autorecordremote, which will record just the local video or the remote videos, respectively, automatically on their initial load. Using just &autorecord will do both. This all applies to the director, guest, scenes, and whatever really. -- You can stop/restart recordings as needed via the right-click menu per each video for now, until I can design a nicer UI for managing multi-recording state at least. -- You can pass the default recording bitrate as a value to the parameter, like you might if using &record. (**on beta)

April 10

  • Setting &h264profile=0 (or false/off/default), will now have the h264 profile be left as the default browser default when the sender is an android. (currently I rewrite the h264 profile for android devices when h264 is used, but advanced users might want the default)

April 7

  • Added chrome notification popups when guests join the room (when using &notify). This requires both Windows + Chrome notification permissions to be allowed (Chrome will ask, but Windows will not, if already disabled). *on alpha (vdo.ninja/alpha) as a code preview and committed to a branch on GitHub (by request)

April 6

  • The &screensharequality parameter applies to all three types of screen sharing types, not just secondary-share. Before &quality was needed for primary screen share quality setting.

  • When the user selects the screen share quality via the gear icon (primary share), it will remember that setting in case a secondary screen share is started later in that session.

April 5

  • Tweaked &screensharetype=3 a bit; &aec and such will impact it now.

  • Fixed an issue where the screen share's audio didn't get correctly stopped in cases where it should have been.

    (changes on vdo.ninja/beta)

April 4

  • Screen share in a group room won't crop to fit the assigned window space anymore, even if &cover is used. *on beta at vdo.ninja/beta

  • Fixed an issue on beta where if you changed the audio device, the audio would stop.

  • Spanish language file updated (via community contribution; thank you)

  • An issue where iOS 15.4 devices get stuck at low bitrates has been patched; available on vdo.ninja/beta.

April 1

  • Fixed an issue with passwords in some places not allowing for longer than 30-characters

  • Fixed a password issue with the vdo.ninja/mixer (passwords can be set via the URL now)

  • Published v21.3 of VDO.Ninja to the GitHub main branch (currently what has been on vdo.ninja/beta for a couple weeks now)

March 15

March 9

  • Updated the co-director feature of VDO.Ninja to SYNC the state between the directors. Syncs on refresh and on button change; this includes scenes, volume, mute, groups, etc. The only catch at the moment is the main director won't sync with a co-director; just co-directors sync with the main director. *On beta at vdo.ninja/beta

March 4

March 3

  • Fixed an issue where &maxvideobitrate would sometimes increase the default bitrate as well. (was impacting the speedtest a bit. on local dev atm)

February 26

  • An issue with &fileshare has been fixed and pushed to beta.

  • Added support for &fileshare support to Firefox and added browser-specific help notices.

February 23

February 22

February 21

  • Added "Hold to talk" to the mute button. Hold the mic toggle button with the mouse for more than 300-milliseconds to have it become Hold to talk. You can also do CTRL (cmd) + M for more than 300-ms to also enter the hold-to-talk mode. I'm not calling this push-to-talk because if you just push for less than 300-ms or click the button, it will instead just toggle the mute state as it is now. This is on ALPHA, https://vdo.ninja/alpha/, since there are a few video styling issues with the current code I need to fix still.

  • Applied a hotfix to production to further improve the &record situation that a few users still were having.

February 20

  • Applied some fixes for the director + Meshcast support; the changes are on alpha for now, pending more testing https://vdo.ninja/alpha

February 15

  • OBS 27.2 has been officially released; this fixes some issues experienced by some VDO.Ninja users, such as rainbow puke.

February 14

February 13

  • I'm going to consider v20.8 as v21.0 going forward, which is currently on beta (https://vdo.ninja/beta/)

  • I've archived v20.4 of VDO.Ninja to https://vdo.ninja/v20/, so if you've had continued problems this last week with production, which aren't now resolved on beta, you can give that a go instead of v19. v21 will include changes from v20.5 and onwards (the last couple weeks of code changes).

  • Please note: I am intending to push v21 to production tonight, around midnight EST, which should not cause disruptions; it's small changes compared to what's on production now. The goal of pushing it is to allow for v20.4 to be archived, creating a clear division in versions to be made. v21 has been mainly bug fixes and tweaks, but i'll work on its release notes still.

  • Any testing of beta today though would be VERY welcomed. If you are able to demonstrate an issue that exists in beta (v21) that does not exist in v20.4, please provide me the details of how you are able to replicate it. Android/iOS has had their group-room performance/quality allowances tweaked, and Android has had its h264 encoder profile tweaked to avoid it failing on some devices. I've had a few users mention higher CPU loads and audio sync issues since v20.4, but I am unable to reproduce any higher CPU load myself.

Previous updates

Last updated