TL;DR – OBS can do this using a display capture source and multiple output projectors. I’m using Streamlabs OBS on Windows, but you can probably make it work on regular OBS on any supported OS.
On my home workstation I’ve got three side-by-side monitors. Normally I roughly dedicate them to separate tasks – left usually has social/chat apps, music, etc., middle is whatever I’m working on, and right is usually either reserved for reference (e.g. documentation, diagrams, etc.) or as a sort of holding ground for other tasks and content I’m likely to switch back to later. But sometimes there’s an occasion where I want to display the same content across all three monitors. When I host D&D sessions, I like to turn the screens into virtual fireplaces, and when I watch sporting events (not physical ones, of course – it’s always Starcraft 2!) I sometimes like to have a full surround experience like you’d get at a sports bar.
The problem is that trying to run three instances of a YouTube video or Twitch stream in sync across three monitors is a pain. If I pause one I’d have to pause the others manually, and pressing play at the same time is tricky. Even with automation, Twitch has a lot of variation in timing between streaming instances, often leading to a few seconds of desynchronisation between the separate windows. I could, of course, just change my display configuration to mirrored instead of extended desktops, but that disrupts everything else I’ve got running and doesn’t work cleanly when I’ve got a different resolution monitor (like my Cintiq tablet) connected.
The solution I found, prompted in the right direction by Vern McCandlish on Twitter (thanks Vern!), was to launch OBS, set up a scene containing a Display Capture source to capture my middle monitor, then right click in the Sources panel and use Create Output Projector to create projectors for each other window I want to mirror the content onto.
This makes it super easy to show YouTube or Twitch or whatever other content I like on the main monitor, and have it mirrored to the other monitors without any noticeable latency or excessive CPU usage (at least on my 56 core monster box).
There is one snag. You might have noticed that the screenshot above looks a little brown. That’s because I’m using f.lux to reduce eye strain. A side-effect is that the display gets the colour temperature correction applied before being captured, and then gets it applied again when shown in the output projector windows, so the projected monitors look very dark and brown. There are two easy fixes for this. The easiest is to just disable f.lux entirely while mirroring content like this, which turns off all the colour correction. That’s fine sometimes, but if you’re doing a late-night viewing marathon you might not want a bunch of blue light searing your retinas to a nice medium-rare. The alternative is to disable f.lux on just the monitors that you’re showing the output projector windows on. This causes the colour temperature correction to be applied on the main monitor, which is then captured by OBS and re-displayed on the output projectors, which are on screens that don’t get any additional colour correction.
The end result is that I got to watch the finals of Starcraft 2 at IEM Katowice 2020 in glorious surround.