In my last Sidenote post, I discussed the hardware I use for livestreaming to Twitch, and made some alternative recommendations to cut cost from the silliness I have on my desk.
In this post, we’re going to discuss the other side of the technology equation for a stream – software and settings. In some ways, despite my love of the hardware side of things, the software and settings you use can be more important and allow lower-end hardware to deliver bigger performance for your stream.
First, the eternal question: what streaming software package do I use?
Streaming Software: OBS Studio
This one is actually relatively easy. OBS Studio is free and open-source, and enjoy broad support with Nvidia working with the team directly to provide optimizations and large, feature-laden updates roll out fairly regularly. Of the popular packages, I’ve used both OBS and XSplit, and the differences are pretty minimal, all told. XSplit requires payment for use outside of very basic setups, and doesn’t handle streams meaningfully better or simpler to justify the price. Likewise, there are project forks of OBS that cost money for add-on features which can still be used easily for free, like Streamlabs OBS, which just tries to integrate the Streamlabs kits for stream features while also giving you an integrated marketplace for stream assets like transitions, lower-third graphics, and frames. I wanted control over the visual identity of my channel more than a package sold via Streamlabs could offer, and the performance characteristics of Streamlabs OBS seem by most reports to be somewhat iffy, especially since core OBS Studio is more focused on performance enhancements and has major contributions from Nvidia and more to integrate new features sooner.
Transition, Branding, and Bumper Graphics: Blender, Adobe After Effects, and Adobe Premiere, with Work By Me!
My stream identity kit is something I’m actually relatively proud of. I custom made a handful of graphics for my Twitch channel, including a 3D-rendered channel name animation with custom lighting and effects (done in Blender), video built on the animation from Blender in Adobe Premiere, and a custom slow-scrolling backdrop and stinger transition both built in After Effects. The price was right (nothing more than an Adobe CS subscription) and the time spent working on the projects was a fun learning experience that didn’t take too long!
OBS Studio has a lot of power to customize stream quality, especially on powerful hardware with newer options available. As I hinted at in Part 1, having an RTX 3080 card in my system opens access to the full, modern NVENC. On the software side for all NVENC cards, the “new” NVENC introduced in 2018 has a feature called “zero copy” which makes it far more efficient and less system-demanding. In the past, NVENC would copy frame data to main system memory and then NVENC would have to copy it back to encode for your stream or recording. This was a software level tweak, so all capable NVENC-equipped cards benefit from this, which does all the memory work locally and no longer requires the encoder to fetch frame data from elsewhere in the system. This improves quality without improving performance. The new hardware logic for NVENC, used in all Turing graphics cards (GTX 1600 and RTX 2000 series) except the original GTX 1650, on the other hand, improves quality by using new encoding logic that works more efficiently with the bitrates provided, squeezing in more detail and offering better tuning options to really get your visuals looking great.
Because the newer NVENC scores very high in quality testing, almost as good as higher X.264 encoding, I decided to use it.
My settings in OBS for streaming, then are:
Encoder: Nvidia NVENC H.264 (new): explained above.
Canvas and Output Resolution: 1920×1080: Twitch doesn’t play nice with 1440p at native pixel height, and so I run everything at 1080p. Leaving the canvas resolution at 1080p keeps everything from being rescaled a second time from canvas to actual stream, which saves some encoding power and keeps things looking sharp, as my preview is generally indicative of how good the stream will look, minus encoding artifacts. For framerate, I run 60 FPS. My system can keep up with it in most games and the stream looks pretty good there with smooth motion!
Rate Control: CBR: Streaming just works/looks better with a constant bit rate, and Twitch recommends this as well.
Bitrate: 6000 kbps: My PC is beefy, but my internet is almost more so, as a near-symmetrical 500 Mbps up and down. At its slowest, my upload is just over 100 Mbps, so 6 Mbps streaming is never really a pain point. With 320 kbps audio, my average stream upload bandwidth is at 6320 kbps, which has yet to get me in any trouble with Twitch or cause drops or other weird issues.
Keyframe Interval: 2: This one I saw in an EposVox video and the visual quality is good without any sync or distortion, so I’ve left it alone at his recommendation.
Preset: Max Quality: With an RTX 3080, a fast CPU, and good GPU cooling, this feels about right. Because my gameplay is 3440×1440 being scaled down, this helps keep small details like text or the general texture fidelity in a game like FFXIV looking smooth and correct.
Look Ahead: Unchecked: Setting B-frames to 2 has worked fine for me, so having a setting to dynamically adjust it seems unnecessary for me personally.
Psycho Visual Tuning: Checked: This one is about the only setting in the new NVENC that will push outside of the encoder to use actual graphical horsepower, since it has to leverage the CUDA cores of the GPU to calculate how it can enhance the visual quality of its output. If you struggle to maintain playable framerates in your games, this might be best left off, but if you aren’t hitting a GPU bottleneck, the extra bit of quality makes things look a slight bit better.
Max B-frames: 2: This one was also a recommendation I saw multiple times and just left at 2. If you use slower motion content, 4 can work, but I’ve found two works pretty well across the board, so no need to reinvent the wheel. Because a steady 2 works fine for me, this also led to the earlier Look Ahead being off.
Audio Settings: This one is both easier and harder to setup, because much of it depends on your hardware chain and system. For me, I stream my audio at 48 KHz, 320 kbps, using a small noise gate on my microphone to not activate until around -37 dB. This works for me because I have a solid XLR interface and dynamic mic with high gain, so 48 KHz and 320 kbps gives me the highest possible quality, while the noise gate filters self-talk and breathing sounds without doing anything to the actual audio – as long as it peaks above -37 dB, my mic is active in OBS and picked up.
Advanced Settings for Video: I use the standard Direct3D 11 renderer for video, with Color Format set to NV12 and Color Space at 709, with range set to Partial. I do this because my camera uses Partial range, and the consoles I’ve connected for capture are also built around Partial range. This results in accurate color reproduction across the board with no weird issues. I’ve also set the color space and range for all my input devices in OBS directly so everything runs smoothly and correctly without any weird color conversions happening. The output is maybe a little lightened up for my tastes, but it isn’t bad at all!
The only other setting I manually configured is for Twitch specifically. I used TwitchTest to find the highest scoring datacenter for my connection and have it set there. There might be some gain to letting it auto-select in the event of a bad day at the datacenter or some sort of connection issues on the route to the datacenter, but generally, this has worked great for me.
Overall, it ends up giving me pretty good streams with high quality, low amounts of artifacting or excess blur, and clean output that looks excellent!
In my final Sidenote on streaming, I’ll discuss a less-good side for me – developing on-stream as a performer and what kind of things I’ve been doing to keep myself engaged and (hopefully) engaging.