The Runner Stream Source panel works in tandem with Live Switch to provide the final level of automation for your stream. The panel controls the Browser Sources in OBS that capture the streams your runners provide, automatically changing the source URL when a run changes and giving you a simple option to manually sync multiple sources.
This area allows you to add up to 5 seconds of delay to the Discord audio that OBS captures. This means that if you have your host and commentators audio captured through Discord, you can add a delay to that audio so it syncs with the runner's stream. The RESET button returns that delay to 0, whilst the number input can be set anywhere between 0-500. Each digit represents 10 milliseconds, so entering 5 will add 50ms of delay, 50 will 500ms (half-a-second) of delay, and 500 will add 5000ms (one-second) of delay.
The same delay is also added to the Local OBS timestamp on the OBS Sync Scene.
Each row corresponds to each player, and each player has the following options:
This is where you select which stream URL the runner's stream should be coming from. The base URL and individual stream keys are defined in the nodecg-obs-control config. For example, STUK's set of dummy Twitch streams all read as "speedruntoolsukstream" followed by the numbers "1-4". The Stream dropdown list allows you to manually change the final number and swap between the four dummy Twitch streams by changing the URL in the OBS Browser Source.
Additionally, the final option in the dropdown list reads "Local". Selecting this still does the same thing, changing the Browser Source URL to end with the term "local" instead of a number. OBS uses Advanced Scene Switcher to detect that this URL ends with "local", hides the online sources, and unhides the local capture card sources. This means if you're running an in-person marathon you can easily include online runs as well.
If you make a change to the dropdown list, the player name and refresh button will change to yellow. This shows you've made a change, but the change hasn't yet been sent to OBS. Click the CHANGE URLS button to confirm these settings.
Whilst having the dropdown list is handy to change things manually, you should only need to use it if something goes wrong, and the switching of the runner stream is automated through speedcontrol and the Live Switch. In the speedcontrol Run Editor every runner has a Stream field. You should enter "1-4" in this field to determine the numbered dummy stream that the runner will stream to, or the term "local" (not case-sensitive) if they are running on-site. When you go to Intermission using the Live Switch panel, the Runner Stream Source panel will automatically change the necessary sources based on the next runs details.
If a Stream field doesn't contain anything or doesn't exist (for solo runs you won't have stream fields for players 2-4), when you go to Intermission, the term "undefined" will be added to the browser source URL instead. This is intended as it means the unused browser sources won't point to a correct URL and therefore aren't using any resources.
This button refreshes the associated browser source, useful if something's not working as expected, or the source has built up a massive delay and you want to reset it.
This button opens the current browser source URL in a separate browser window. This is useful to quickly see the runner's stream on your own web browser. If you've got uncommitted (yellow) changes, the view button will still open the URL that is active, not the one you've selected to change to.
Like the Local OBS Delay, you can use the delay input to add up to 2500 milliseconds of render delay to the runner's stream. This is only needed for races - see Delay Setup below for details. Like before, a single digit adds 10ms of delay, but because you're now affecting video as well as audio, the delay limit is only 2500ms. You can override this in OBS, but adding more delay is likely to cause strain on OBS, especially if you're adding delays to multiple sources. Twitch's delay has improved significantly over the last few years, so in most case 2500ms should be sufficient.
Adding delay in the panel affects multiple areas of OBS:
the browser source has five active render delay filters, each of which has a 500ms limit. Adding a single digit in the panel adds 2ms of delay to all five filters, adding 10ms of delay to the source.
each player has four audio sources associated with them (see Audio Sources) for details. Adding a single digity in the panel adds 10ms of Sync Offset to each.
CHANGE URLS commits any changes made to the stream key dropdown lists.
RESET STREAMS blanks out every player's dropdown list, but does not make any changes to OBS. Clicking CHANGE URLS with an empty dropdown entry doesn't make any changes to OBS.
RESET DELAYS resets every player's delay to 0. It does not affect the Local OBS Delay.
Depending on how you have your marathon audio organised, you'll need to apply audio delays in different ways. Delay is monitored on the Sync Scene on OBS, which is always displayed on the Preview & Program Viewer. Every runner's stream includes a running timestamp of their local machine - the Sync Scene grabs each players timestamp and displays them along with the Local OBS timestamp. Your goal with syncing is to get as close as you can to these numbers matching. It will never be perfect and as a run goes on you'll likely find some runners will fall further behind, especially if their stream connection isn't great.
You sync streams by finding the slowest source aka the runner with the smallest number - in the example on the right, this would be Player 4 - and adding delay to everyone else to match. If you were syncing the Local OBS for example, you would need to add 3100ms of delay so it synced with Player 4. Obviously, the more players you have in a race, the more complicated this becomes.
STUK supports three different methods of syncing, each has there own benefits and disadvantages:
If you're running a live event and everyone on stream is on location, you won't need to use any delay at all. Keep all delays set to 0 and don't touch them, in fact you won't need the Runner Stream Source panel at all.
The simplest way to sync your runner with your host and commentators is to have the runners capture their Discord audio of the host and commentators and stream them to you. This automatically syncs everyone and means for solo runs you don't need to do any delay sync at all. If you've got any races, you will need to sync the streams, and all commentary will only be streamed from Player 1.
The biggest advantage of this method is obviously that you don't need to do any syncing outside of races. You won't ever need to use the Local OBS Delay and there is a setting in the nodecg-obs-control config to disable this function. The disadvantage of this method is that you have less control over audio levels - the runner sends their gameplay audio down one stereo channel and their mic and all commentary audio down the other, so whilst you have control to adjust these separately, you're reliant on the runner to set their mic and each commentators audio levels correctly. You also can't use this method if you plan to use what many refer to as "god-mics".
The more complicated way of handling audio is to have your host and commentators audio picked up from Discord on the Stream OBS - the runner's mic and gameplay will still come through their stream. This means that for solo runs, you will need to add delay to the Local OBS for every run to make sure your commentators are synced with the runner stream. However, assuming your runners have a good connection to Twitch, you should find that in most cases, once you have a Local Delay set, you won't need to tweak it too much, as everyone will have a similar delay. In races, you'll need to add delay to the Local OBS and every other runner stream to match the slowest runner stream.
Whilst this means a manual sync job for your tech volunteers at every intermission, it means you have full control over all audio sources, as you can go into Discord and change individual commentators audio levels. The other major advantage of this system is that you can give certain volunteers a "god-mic", where you locally mute them in Discord, meaning their voice is never picked up on stream, but everyone else can still hear them. This useful for tech or producers/directors to be able to talk to runners and hosts during a run without being heard on stream.