Restreamer Guide
Comms Through Discord
Comms Through Discord
Thank you for volunteering as a restreamer at an upcoming event. The restreamers run the stream by using the broadcast package to control the action. If you've got experience with other marathon setups that use NodeCG, you'll feel right at home, and hopefully find your experience even easier than usual! This guide will first go through the actions you'll need to take to end the current run and start the next one, and then dive into the controls you have to achieve these.
You'll organise and work alongside runners, hosts and setup volunteers, with all expected to follow your instructions. You will work under a producer and be expected to follow their instructions. You will control the stream's OBS through an online portal. Your general workflow is as follows:
Receive already set-up runners and commentators from the setup volunteer to start their run
Ensure the runner, host and commentators are audio-balanced and ready to start
Transition to the game scene and start the timer when ready
Be on hand to
display and hide any warning messages
respond to any issues or changes
make run-specific adjustments
Communicate with the live host through Discord chat. Unless agreed otherwise, you shouldn't be speaking on stream as that is the host's responsibility
Stop the timer, then send the current run to intermission when it's finished, running a charity video if requested
Voice communications during the stream take place on Discord:
🔊GREEN ROOM: anyone involved in the event can join this room and chat, but is reserved for preparing runners, commentators, and hosts.
🔊LIVE ROOM: staff, tech and hosts can join this room, this is where the stream takes place. You or your setup volunteer will need to move runners and commentators into this room when ready.
Only hosts and commentators are captured from Discord to output to the stream. Runners are captured from their own streams. Producers and tech are given "god mics" - they can be heard on Discord, but not picked up on the stream. You will have access to the stream machine's Discord to mute and unmute these volunteers as necessary.
During the event, various different amounts of delay are added to different sources so that everyone syncs up. It's important therefore that you never take your cues to take action from Discord audio, you should always take them from listening to those sources on NodeCG/OBS. OBS does have a limitation with audio, in that any delay added to an audio source is not reflected in the monitoring audio (what you hear). Therefore, if you've had to add delay to the Discord audio (you'll learn about adding delay shortly), it will go out to the stream with that delay, but you will still hear it in real time. It might sound as though the host/comms are talking over the runner, but as long as the source timers are synced, it will go to the stream correctly.
What this also means, is that whatever delay is added to Discord audio, you need to wait at least that amount of time after a host has finished speaking before you switch the audio off. The maximum delay for Discord audio is 5 seconds, so if you want to play it safe, whenever you hear a host stop talking, wait 5 seconds before taking the Discord audio off air.
Before you can get the next run started, you'll need to end the current run. Listen out for the runner's instruction to hit the stop button on the timer:
If it's a single player run and no delay has been added to the runner's stream, you are fine to take their audio as the cue to hit the stop button.
If it's a multiplayer run and delay has been added to one or more runner's streams, don't take their audio cue, but instead take a visual cue from their game. Whilst monitoring audio isn't delayed in OBS, all visual elements are.
The runner and host should then wrap up their comms.
Your producer should let you and the host know if you plan to go to a video during the intermission. Once the host has declared they're ready to finish, wait the appropriate amount of time depending on the Local OBS Delay, and then hit the corresponding button on the Live Switch Panel. Do not join the 🔊LIVE voice channel until you've gone to intermission and confirmed the Discord audio is OFF AIR.
It's usually polite to wait for the current runners to leave the 🔊LIVE voice channel, but if they're taking too long, feel free to ask them to jump out or into the 🔊GREEN ROOM, especially if we're behind schedule.
Runners and commentators cannot enter the 🔊LIVE voice channel freely, you'll need to drag them in from the 🔊GREEN ROOM. Check the OBS Preview to ensure the runner's stream is showing correctly on the correct scene and make the final adjustments.
Because the runners are streaming to Twitch, there will of course be a delay for their stream coming through to OBS. To ensure everyone is synced up, the Discord audio from the commentators needs delay adding to it. Checking the Sync preview on NodeCG will show the current times of each stream.
Using the Local OBS Delay field on the Runner Stream Source panel, use the arrows on the input field to add delay to the local OBS until the timers are as close as you can get them (they don't need to be perfect). The arrows increment the delay field by 5 - this adds 50ms of delay. The max delay value is 500 - this is 5 seconds of delay.
In a single player run, you only need to add delay to the Local OBS Delay, you won't need to add any to the runner's stream.
When it comes to multiplayer runs, you'll also need to add delay to all but one of the runners. Work out which runner is ahead (which one's timer is higher) and add delay to that player until it roughly matches the timer for the slower runner - then add delay to the local OBS.
When it comes to setting Discord audio off air, you do need to consider the Local OBS Delay you've set. Consider the example of 360 delay - 3.6 seconds, so round up to 4 - in the image on the above. When taking Discord OFF AIR you need to wait for longer than the delay after a host has finished speaking before pressing the button. In the example you would wait for four seconds before you cut the Discord audio. Pressing the button too fast will cut the host off.
As a reminder, any delay added to audio will only affect what goes out to the stream - OBS's audio monitoring (what you hear from OBS) doesn't include any delay. So if you're listening to the runner and commentators and think they're talking over each other, don't worry, that's normal. If you watch the stream, you'll hear they're correct. As long as you've got the timers on the sync stream close enough together, they'll sound fine.
You need to do a final audio check - the setup volunteer will have balanced the audio with the runner, but you now need to check that it looks right on our end. With any adjustments you make, use the Volume slider first, and only use the Gain slider if needed.
Get the runner to play a particularly noisy section of the game - they should be peaking at the top of the green area on the audio monitor (occasional loud noises going into the orange is fine). If they aren't peaking here, adjust the level on the Audio Monitor until they are.
Ask each person, in turn, to say a few words and check that each person is peaking at the top of the orange area. If they need adjusting, ask them to adjust their own audio levels first, and then if still needed adjust the levels on the stream machine's Discord. This is done by right-clicking on a speaker and using the User Volume in the menu shown on the right. If the host wasn't present at the setup, they'll need their audio balancing again.
Finally, ensure all runners, tech and producers are muted on the stream machine's Discord. Only the host and any commentators should be unmuted.
Check with the runner exactly when the timer should start and finish, and ask them to give you a rough idea of what should be happening about five minutes before the end of the run. This gives you a better idea of when you need to be ready on the timer. Also double check whether you'll need to display any warning messages during the run - the runner's advice on this will be advised on the tech sheet, so go over that with the runner to make sure you're happy with it.
When everyone is ready and you're happy to start, advise that you’ll give a countdown, and at the end of that countdown, set the Discord audio to ON AIR. This allows the Host to start talking during the Intermission. Once it’s clear they’re about to hand over to the runner, press the "Start Run" button. The player mics and player 1’s gameplay will go ON AIR and the scene will switch to the game layout.
Once everyone on the stream is talking, keep an eye on the audio levels and adjust if necessary. If one commentator/host is too loud or quiet, ping that person in the #LIVE text channel to adjust their own level.
When the runner does their countdown for the timer to start, hit start. That's it, the run is underway - just make sure you're keeping an eye on the stream as you're the first port of call should any issues occur. You may also have warning messages to display during the run. If the runner's stream starts to lag, you may need to adjust the local machine's delay to match. If issues do occur, troubleshoot and suggest fixes as best you can. If you cannot find a solution, let your producer know.
If things go wrong, you will be the first port of call to fix anything, so here's a few quick troubleshooting tips:
Remember, whilst NodeCG is there to make tasks easier, sometimes it's better to just go straight to OBS for something. A lot of the time, if there's an issue with a layout not looking correct, refreshing the browser source in OBS that's pointing at that source will fix it. This is something you can only do in OBS directly.
In the Intermission scene in OBS, the browser source for the Intermission overlay is called "Music" - this is because the music for the stream is played in the Intermission layout, and makes more sense for the Live Audio Monitor to be named this way.
If NodeCG crashes for any reason, try and grab a screenshot of the final error before closing it - that'll help to identify the issue. You'll then need to close it, and relaunch it from the NodeCG shortcut. It's very likely once it's reloaded, any browser sources on OBS that are currently active (i.e. being shown on the Preview or Program scenes) will need refreshing, and you should also refresh the NodeCG dashboard on your web browser.
If the Preview scene hasn't updated to the correct layout, or something has changed, you can change it with the Scene Selection panel (see below).
If a runner's stream isn't showing, double check that they're streaming to the right dummy Twitch channel. You can click on the EYE symbol on the Runner Stream Source panel to visit that Twitch channel. If they're lagging behind a lot more than expected, use the REFRESH button to see if that improves it. If it doesn't, ask the runner to stop streaming, select a lower bitrate profile and then start streaming again.
If you can't hear the runner on stream, check that sound is coming through the dummy Twitch channel first - that will determine if the problem is on their end or your end. If you can hear them on stream twice, make sure they're deafened by the stream machine's Discord.
If you can't hear a commentator or host on stream, check that they're not deafened on Discord. If you can't hear any commentators or the host, check the Discord audio source.
If you've been on tech for a marathon before, you'll likely be familiar with NodeCG. Capable of a lot of functions, primarily it acts as a web-based interface for remotely controlling an OBS instance. Whilst you also have access to OBS directly, you should primarily control the stream through NodeCG, because it includes a lot of automated tasks that will be missed if scene changes are completed on OBS.
You'll need to use the first three main tabs across the top left of the workspace. The Settings tab and the tabs on the top right of the workspace are to be ignored, please don't touch them.
On each tab, you'll have a bunch of different controls. Hovering over the bar at the top of each will allow you to collapse and move them; you're welcome to do this and reorder the controls as you wish; this won't affect the display for other users. You can also zoom the page in and out to make the controls easier to manage.
The Main Workspace is used to manage the current run and to change over to the next run. This will be the tab you spend most of your time on, using the following controls:
Run Player
This is useful for looking at the information about any run in the marathon. They're all displayed in schedule order and you can click on the arrow on the right to see more details. You won't need to click on any of the play buttons, switching to the next run is automated elsewhere.
Preview/Program
This is a live feed of the Sync Scene, OBS Preview, and OBS Program. Sync is used to monitor each player's delay sync with OBS. Preview can be used to check on edits or changes, whilst Program is being streamed to Twitch. If the feed isn't displaying anything, please ping a tech staff member.
Live Switch
This is where the majority of the action takes place. If you have a Stream Deck or similar device, this works much the same way, as they are simply programmable buttons that perform certain actions. Whilst the timer is running, most scene switch buttons are disabled to avoid accidentally switching whilst a run is in progress. Whilst each button appears self-explanatory, there are a couple of extra actions taking place on each.
Start Run: The main "Start The Next Run" button, press this when everyone is ready to start. Upon pressing, OBS will:
- immediately unmute and output the Runner's Mic & Discord audio meaning any talking in the STREAMING ROOM channel will be heard on the stream.
- start a local recording on OBS
- after a one second delay, switch to the Game Layout scene that matches the Game Layout code in the run's details, and also unmute the Runner's Game Out Audio.
Intermission: To go to Intermission only after a run has ended. As you can probably work out, this does the opposite of the previous buttons. Upon pressing, OBS will:
- switch to the Intermission scene; during the transition, NodeCG will also automatically progress to the next run.
- set the OBS Preview to the scene the next runner will be using (assuming the Layout Code for the run is valid)
- take both the Runner's Mic and Game audio off air, so you are free to talk in the 🔊LIVE channel without it going to the stream; audio will still be unmuted so you can start preparing the next run
- stop the local recording
- switch the Runner Stream Source to the next runner, as per the number in the player's Stream code in the run details
Video from Run: Does the same as the Intermission button but instead switches to the Video scene. Do not use this button if you've already gone to Intermission.
Video from Intermission: This goes to the Video scene but without the audio changes, moving the run along or changing the Runner Stream Source. Use this if you've already gone to Intermission and then it's decided that a video should be played.
Opening: Goes to the Opening scene whilst stopping any local recording.
Closing: Goes to the Closing scene whilst stopping any local recording.
Tech Issue: If you have a tech issue and need to go to Intermission during a run, you should press the Tech Issue Start button (it's a good idea to let runners/hosts know you're doing this first, and pause the speedrun timer). This will go to Intermission and take the audio off air, but it won't stop the OBS recording. At this point, you can jump into the 🔊LIVE channel to talk to the host and runner without being heard on stream. Once the issue is over, press the Tech Issue Over button to continue the run - don't forget to unpause the timer as well.
Intermission (Scene Switch Only): Goes to Intermission but the scene switch is the only action that is performed. This is useful whenver you want to go to the Intermission scene without advancing the run player, such as from the Opening scene at the start of the marathon, or if you wanted to interrupt a video early.
When you click any button, every button will be disabled for a couple of seconds - this prevents double clicking, or performing too many actions at once. In addition, most buttons have some disable conditions. When a button is disabled, a message will appear on the button advising the reason:
OBS Disconnected
If OBS isn't connected to NodeCG, every button will be disabled. You should check the OBS Connection Panel to reconnect OBS, or talk to a staff member.
Timer Running
All but the Tech Issue buttons will be disabled whilst the nodecg-speedcontrol timer is running. This avoids accidentally switching scenes whilst a run is under way.
Invalid Layout Code
The Start Run button will be disabled if the Game Layout code in the current run is invalid (it doesn't match the name of a scene in OBS). If this is the case, check the current run details in the Run Editor and ensure the Game Layout code matches the correct OBS scene.
Current Scene: #
Every button has a condition where it will disable if a specific scene is active in OBS. This prevents you from transitioning to the same scene again, or prevents you from pressing buttons that might advance the run when you shouldn't. For example, the Start Run button is disabled if you're already on any Run scene.
Warning Message
This toggles a warning message that appears at the top of the game feed for each player. This is useful for warning viewers of flashing lights, disturbing content or any other moments you'd want to warn of. The drop down displays several pre-set messsages you'll be able to show. Simply select the appropriate message from the drop-down and when you next press the show warning button, that message will show.
The button turns green when the message is showing and the current state of the warning message will persist between runs and refreshing sources. Multiplayer runs will produce a button for each player, with the warning message only appearing over that player's feed. You are able to display different messages over each player - changing the dropdown option won't change any messages currently being displayed.
Twitch Control
This shows the information being sent to Twitch to update the Stream Title and Game Category, including tagging the runners in the Title. This should all be automated and should only be edited in case of an error. If your producer advises that you should run ads during an intermission, click the appropriate time on the panel to start running ads.
Timer
This controls the timer that is displayed on the stream. Whilst active, most of the other controls are disabled.
From left to right the buttons are:
Play/Pause: The runner or commentator will likely do a countdown and you will click this when they say go. Whilst the timer is running, this switches to Pause, which is only needed if there's an issue.
Reset: Only used if there is a false start or something happens that causes the runner to restart.
Stop: When the runner calls time, click stop.
Forfeit: For the setup we have, this does the same as Stop, so isn't used.
Undo: When you push stop, the timer continues in the background. If you or the runner make a mistake and press Stop too early, the Undo button will continue the timer at the correct current time.
During a race, each runner will have their own individual Stop, Forfeit and Undo buttons, used as each runner finishes.
After a run, when you transition to Intermission, the timer will automatically reset ready for the next run.
Remember: always take instructions to start/stop from the runner from what you see on NodeCG, not from the runner on Discord. This way the delay of their stream matches when you start and stop the timer.
This has some additional control for OBS and is likely your first port of call if there are any issues:
Preview/Program: Identical to the Preview/Program area on the Main Workspace.
Runner Stream Source: This is where the URL for the runner's stream is managed. Every runner will stream to a dummy Twitch channel and the key adds 1-4 to the end of that URL. The key is updated to the next runner automatically when the run updates, but if the runner's feed isn't showing on the preview during intermission, you can manually change to a different URL key here. Clicking the eye icon will open that Twitch stream in a separate browser window. The delay field is used to add delay to each runner's feed - this was explained earlier in the guide.
Scene Selection: A manual override for the Preview and Program scenes. Changing the program scene is automated and you should only change it here in an emergency. The preview scene will automatically update to the next runner's scene when you first go to intermission, and will switch to whatever was on the program scene when the scene changes. You likely won't need to change the preview scene manually, but it's useful to have just in case.
Output Status: This shows whether the stream is live and whether a recording is in session. If you're the first/last Tech of the day, you may be asked to Start/Stop the stream. Recording is automated elsewhere and should only be toggled in an emergency.
Live Audio Monitor: This shows and lets you control all of the outputs of the current scene. The display above shows what you'd see during the intermission.
During a run, the runner's game and mic come from their stream - they send their gameplay audio down one stereo channel and their mic down the other. This keeps them synced with their game and webcam.
The commentators and host are all captured via Discord. If the host ever needs to talk during the Intermission, everyone else will need to be quiet, or you'll need to mute them in the stream machine's Discord. Before the run starts you will need to check the stream machine's Discord to ensure the runner is muted, otherwise they'll be captured twice.
The buttons across the top do the following:
GREEN AUDIO: mutes/unmutes the source
RED "ON AIR": when red and enabled, this means this source is currently "On Air", meaning it can be heard on the stream. When grey and disabled, this source is currently "Off Air", meaning it can't be heard on stream, but it can still be heard by you on OBS. These are automatically toggled when using the Live Switch buttons to switch scenes, so outside of an emergency the only time you'll really need to use it is if you want to set Discord to "On Air" during intermission so the host can speak, or when changing the Game audio in a multiplayer run.
YELLOW "ON AIR": the Music and Video sources are set to a locked yellow "On Air" state. These sources can always be heard on stream, but they are not monitored by OBS. Remember, music plays through the “Opening”, “Closing”, and “Intermission” sources.
WHITE 0db: Resets the source's Gain filter to 0db.
Most sources have two faders, a volume fader on the left, and gain fader on the right. You should always balance audio with the volume fader first, and then add gain if it still isn't loud enough.
As a general rule of thumb for balancing:
gameplay and music should normally peak at the top of the green area, with only loud sound ever peaking into the yellow
the runner, host and commentators should normally peak at the top of the yellow area, with only loud moments peaking into the red
Runners and commentators will have already been audio-balanced by the setup volunteer so that their output levels are correct. Don't ask them to adjust any further unless you think there's an issue on their end. You need to ensure that the output levels here are balanced correctly - if the runner's audio is always balanced the same way, you likely won't need to change the levels here.
If you're doing tech for a multiplayer run, you'll only see Player 1's gameplay audio during Intermission, and you'll always start with Player 1's audio when the run starts. Once the run goes live, any additional players' Game audio should remain off air, but you can unmute it to balance it ready. Game audio can be swapped between runners if one player gets ahead in a race. It's advisable not to have multiple sets of game audio live at the same time.
The Run Editor is where the run details are entered that will show on stream. All of these details should already be prepared and shouldn't need any manual entry unless changes are required. To do this, click on the Edit Run button (third circular button under the details) which will open up the Edit Run panel. Do not use any of the other buttons under the run info. Make sure you double check with runners, comms and hosts that this information is correct before going live.
Game Details
Game is the name of the run that will shown on all graphics. Game should also be used to name events such as interviews, sleep/setup blocks.
Category is also shown on every graphic. If you've got a very long category, it's worth checking how it looks before going live.
Region isn't used by STUK and can be ignored - it doesn't matter if there's any information there.
Released can be used (you can also leave it blank) and should contain a four-digit year, unless the runner is running multiple games back-to-back.
Game (Twitch) should match Game unless the game's name isn't a registered Twitch category; in these cases you should manually enter this. This information is used to tell Twitch Control what category to set for the run.
System can be used (you can also leave it blank). Most systems are fine to have their full name displayed, but longer ones should be checked on the graphics to make sure they fit. For example, "Gameboy Advance" doesn't usually fit on the 3x2_1P layout, so you should use "GBA" instead.
Estimate must be used for any games, but can be ignored for interviews and setup blocks if you'd prefer the time for those to be included in the Setup Time.
Setup Time must be filled in, but can be set to 0:00:00 if desired.
Custom Fields
The bottom row of the game section are all custom fields that are specifically used in STUK's setup.
Layout Code must match the name of one of the OBS scenes - this information should be available in your tech schedule.
C# Name is used to display the names of any commentators on your game layouts. Leaving these fields empty will remove the associated commentator box on the graphic. Commentators should always be entered in number order - e.g. you shouldn't enter a name for C2 Name but then leave C1 Name blank.
C# Pronouns are shown under the commentator names and are always displayed in lowercase. You can leave them blank if commentators don't want pronouns displayed.
Host Name is used to display the name of the host on game layouts and the intermission. Leaving this field empty will remove the host box on those graphics - on game layouts the commentator boxes will adjust to fill the space left by the host.
Host Pronouns are shown under the host name and are always displayed in lowercase. You can leave them blank if the host doesn't want pronouns displayed.
Runners
The runner area is where you enter runner details. Each runner must be in a team, even if it is a solo run. If the run you're doing has different players on different screens (race or co-op run), each player must be on a different team. If the run is a relay and multiple players are using the same screen, you want to put them on the same team.
Relay is ticked when the run is a relay.
Team Name isn't displayed on any graphics so can be left blank. You can use the handle to the left of the team name to reorder the teams. You can use the - and + buttons to the right of the team name to remove the team, and add new players to the team.
Name is the name of the runner and cannot be blank. If Twitch is left blank, this name appears on the graphics without the Twitch logo next to it.
Twitch is the runner's Twitch username (not their display name). This field acts as the runner's name on the graphics and displays a Twitch logo next to the name.
YouTube and Country Code aren't used by STUK and can be ignored - it doesn't matter if there's any information there.
Pronouns are shown under the runner's name and are always displayed in lowercase. You can leave them blank if the runner doesn't want pronouns displayed.
Stream is the key for the runner's incoming stream - this information should be available in your tech schedule.
Cam determines whether the camera area on the layout should be displayed for the runner. Entering "no" (not case-sensitive) will remove the camera area. Any value, including leaving it blank, is considered as "yes".
The minus button next to the player deletes that player. The plus button below the final player adds a new team.
The other panels in the Runs tab shouldn't really be needed, though the Player Layout panel can be used to quickly swap race names around if the runners have set up in a different order than what has been entered. If you're on tech for a relay, a Staff member will help you through the Relay Control.