I’ve written a lot about the hardware & gear I use for streaming, and now let’s talk about the software side.
There are a few thousand words in here. Don’t think that you have to tackle all of this just to get started streaming, dear reader. I’ve been working on my streaming setup for months now, and I’m just trying to save you some time if you really wanna take the streaming thing seriously. Most of you aren’t going to need this post in any way, shape, or form – but then you might find it kinda interesting to see what happens behind the scenes. It’s surprisingly hard work to make live webcasts seem so fun, casual, and off-the-cuff!
The point of all the work we’re about to do is simple: make live webcasts as fun and dynamic as in-person sessions. Let’s get started.
OBS Studio is like Azure Data Studio for streaming.
You know how you’re really familiar with SQL Server Management Studio, and you know how to use it to connect to SQL Server and get your job done? And you know how you’re kinda-sorta vaguely aware that Azure Data Studio is the new hotness, and it runs on Windows & Macs, and it connects to all kinds of databases, not just SQL Server?
Yeah, that’s kinda like OBS Studio.
OBS is a cross-platform application that connects to a lot of different streaming back ends (Twitch, FaceBook, YouTube, Mixer, etc) and can even be used for screen-sharing apps like Zoom, GoToMeeting, and WebEx. Because you’re just now getting started with streaming, you’re gonna wanna use a cross-platform, multi-service tool to make your life easier because over the next couple/few years, you’re probably going to see different streaming services come and go. You wanna use one tool that works with all of ’em. I’ll talk more about the back end specifics later on in the post.
OBS is where you do your stream “development” – where you lay out different scenes, each of which is a collection of components. For example, here’s my live scene during a recent stream:
There are 3 components here:
- My SQL Server VM as the background
- My main camera at the bottom right, with a chroma key (green screen) effect so that my background disappears, and I can pretend to be a SQL Server weatherman, gesturing at specific things on query plans
- The live chat messages come up as toast popups above my head, and disappear automatically after 15 seconds
You can design all this stuff yourself, but it’s easier to just go buy overlays from companies like Own3d.tv, NerdOrDie, or Visuals By Impulse. To learn how scenes & overlays work, check out the Stream Senpai playlist by Alpha Gaming with Harris Heller, which has all kinds of good tutorial videos, some of which talk about scenes & overlays.
And I say “scenes” plural, because you’re going to want more than one overlay/scene. You probably wouldn’t watch a TV show that used a single fixed camera angle for an hour straight, and likewise, it’s difficult to focus on a streamer who uses exactly the same screen display for an hour straight. You wanna mix things up with some variety. My main live scene is pictured above, but as another example, here’s a chat scene:
Here, the viewer gets a different experience: there’s a different camera angle showing my office and San Diego in the background, and a big chunk of the screen is dedicated just to the chat. I switch to this scene when I want to have a longer discussion with the viewers about a topic, and where we don’t need to have the demo up onscreen.
I started streaming using a free theme, but I decided I wanted something that was more “me.” After streaming for a few weeks, I made notes of what I wanted in my scenes and what I didn’t, and then hired a designer to make a custom set of scene overlays to match the company branding. I’ve written about my custom theme & scenes over here.
An Elgato Stream Deck helps you switch between scenes easier.
To switch between scenes, you can use system-wide hotkeys (configurable in OBS), or configure buttons on an Elgato Stream Deck to send those same hotkeys. I use the right side keys for this so that I can memorize where each scene is at, and touch ’em with confidence with one hand without looking at the Stream Deck. Just makes transitions look a little more seamless.
The Stream Deck can even stack multiple actions up for each button press. When I switch from camera 1 to camera 2, I want the lights in my room to change as well. My background lights are plugged into Wemo Mini outlets, and the WSwitch app lets me use hotkeys to turn groups of lights on & off.
For example, when I hit the “Starting” button, it turns on all my office lights, switches to the Starting scene in OBS, tells OBS to start recording, and opens Pretzel, the music app I use for stream-safe music.
When I hit the buttons for other scenes, like the Cam2 scene above, it triggers other hotkeys, like telling WSwitch to turn on just the appropriate lighting for that scene. It sounds like overkill, but I stream anywhere between 5AM and 2PM Pacific, and during that time, lighting in my office changes a lot. I need to make sure lights aren’t pointing directly at the live camera, but I also need to make sure the green screen behind me is evenly lit. Erika got pretty frustrated with my continued purchase & exchanges of different pieces of lighting gear and light stands to get the combination just right, without having the lights be too visible to the viewers, hahaha.
The Stream Deck also helps a lot with viewer engagement and interactivity. I’ve customized the left side’s keys to do a variety of sound effects to help reinforce the concepts that I’m teaching – from cheers to jeers. I use these a lot, so I’ve arranged the first two columns so that I can access ’em by feel. They’re arranged from happy at the top to angry at the bottom. Since I use ’em so often, each key calls a random sound with a similar emotional feel: for example, the “Laughter” button triggers one of a dozen different crowd sounds so that it doesn’t sound the same every time.
When you’re using sounds online, you wanna be careful to honor the original sound producer’s copyright. I use royalty-free sounds purchased from Pond5.com, Sound-Ideas.com, and Storyblocks. Music presents a similar challenge: if you’re going to stream to public services like YouTube, make sure you don’t play copyrighted music during your stream. Streaming services will automatically mute your audio during the recordings if you violate copyright laws. I use the $5/mo Pretzel service with stream-safe music, but you might not like their mostly-electronic-dance-music stuff. I happen to love it.
While we’re looking at my Stream Deck, shout out to the free Stream Deck icons from Visuals By Impulse. Lots of beautiful button sets with nice themes.
Now that we’ve got all these fancy scenes set up, the next step is to stream ’em out so folks can see ’em.
Don’t stream directly to Twitch or YouTube:
stream to Restream.io.
OBS is like the Azure Data Studio of streaming: it’s a free client app, but it also requires a server to connect to. In the database world, that’d be SQL Server. In the streaming world, OBS connects to a lot of different back ends: Twitch, YouTube, Facebook, and more.
If you’re doing this to help as many people as possible, then you need to reach ’em where they are. If you don’t already have a big following, then you need to just get your work out to as many places as possible simultaneously. You know how it is: you probably spend your day in just one, maybe two social network sites, and you rarely keep multiple tabs open with all of ’em at the same time. If you stream to multiple services simultaneously, you stand a better chance of catching people no matter what service they use.
OBS kinda-sorta supports the ability to stream to multiple services at the same time, but it’s going to require a lot of bandwidth on your end. Instead of configuring OBS to broadcast directly to Twitch, you have OBS send your stream to Restream.io up in the cloud. Then, you configure Restream to relay your stream on to other providers, including Twitch, YouTube, Facebook, and others if you’re so inclined. As of this writing, you can probably get away with the freakin’ free plan for individuals, which completely blows me away. (I’m using a paid plan.)
Restream gives you metrics to show how many people were watching on each media. Here’s last Saturday’s stream:
I get the majority of my viewers on Twitch and YouTube, with only a small portion on Facebook and Mixer. I’m pushing video to LinkedIn, but they haven’t approved me to their private beta program for livestreaming yet, so I’m shouting into the void on that one. (If anybody knows how to get me into that program, holla – I’ve already submitted an application.)
Restream.io Chat centralizes the discussion, too.
Restream Chat centralizes your viewers’ live comments from Twitch, YouTube, Facebook, and even Discord all at the same time, in one stream, and you can overlay that stream onto your live broadcast! Everybody can see the comments/questions/chat from everybody else, and it all has one consistent look/feel.
This is especially important when you’re just getting started because frankly, you just won’t have a lot of watchers. When anyone on any service says something in chat, and it shows up onscreen, that triggers other folks on any service to jump in and start responding too. That’s interactivity. You want that, or else your stream feels like tumbleweed. As a presenter, there are few things as frustrating as doing a great job, but feeling like nobody’s listening or giving feedback.
First, install the Restream chat client on your local machine, log in, and then you see all the chat in one window while you’re broadcasting.
Next, you want your viewers to see what’s happening, too. In the Restream chat client, go into Settings, Embed in Stream. You can customize how your chat comments will appear onscreen for your viewers, with lots of themes available for different game styles. I went with the default (because it’s the least game-y), but for me, two settings are important:
- Chat Background Opacity = 0% – because I want the chats to appear to float in midair on the screen, and not take up space permanently.
- Hide messages after 15 seconds – because I want them to disappear quickly after I mention ’em. I want as much screen real estate available as possible for my demos and presentation slides.
Then copy the embed URL, go to OBS, and add a new browser source, and paste in the URL for the Restream chat embed. Here are the official instructions. The result makes your recordings look fantastic.
Once your chat messages are up onscreen, you can encourage interactivity so much more. You can ask fast off-the-cuff questions like, “Where’s everybody at in the world today?” or “If you’ve encountered a problem like this, say yes in the chat” or “I’m about to solve this one of two ways: would you rather watch me use technique A, or technique B? Let me know in chat.” Next thing you know, your live webcasts feel just as interactive as your in-person presentations – or frankly, for me, they feel even MORE interactive. Many people are much more comfortable typing something into a chat window than they are raising their hand in a large group of people and asking a question out loud.
In theory, you could use this for private training classes.
When you join meetings with conventional apps like Zoom, WebEx, and GoToMeeting, you would normally share your desktop directly. However, if you want to leverage OBS itself to handle your screen transitions, jumping from app to app, and even popup notifications for things like chat messages, you theoretically could.
To do that, fire up OBS, right-click on the preview window, and tell it where to send the preview of your stream:
In my case, my second monitor is a small, cheap 1080p monitor (and quite good-looking, too, I might add), and that’s where I output my preview. It shows my current live scene, like me floating over my desktop. Here’s the key: when you share a monitor with apps like Zoom, share that monitor. Presto, you don’t have to share your camera separately – this second monitor has a beautifully produced feed.
The problem, though, is that I’ve had wildly unpredictable latency. In small meetings, it’s worked great – my onscreen video and my microphone audio have been beautifully in-sync. However, when I’ve tried it in larger meetings, like GroupBy last week, the audio & video were way out of sync. To fix that, I would have to try tuning the audio & video delay every time I’m in a meeting – and I just don’t want to bother with that. Instead, for private class streaming, I’ve abandoned Zoom/GoToMeeting/WebEx for something different.
But instead, for private stuff, check out Mux.
Initially, I was only going to use OBS for free public streams, but…wow, did I fall in love with it. The multiple camera angles, the scene transitions, the built-in high-definition recording – my public webcasts were so gorgeous and lively, but my GoToWebinar classes felt so lame in comparison. I had to figure out a way to use OBS for my training classes.
The problem is that Twitch, YouTube, and Facebook are all about public streams. They don’t charge you money because they make money off your viewers, either by charging them subscription fees or showing them ads. That’s great for public classes, but if you want to run private training classes and charge money for them directly, you’re gonna need a different solution.
You could set up private Zoom/GoToWebinar/WebEx meetings, and charge for access for those. The screen-sharing approach I described earlier would work okay. I just wasn’t a wild fan of how most of those worked, especially in the way they handled viewer data. I wanted something that would be more GDPR-friendly down the road – I’m still not to the point where I’m comfortable selling to the EU, but I’m getting a lot closer.
I wanted a streaming video provider that would let me embed videos inside BrentOzar.com instead. I‘ve written about the WordPress plugins I use to sell training classes. I’m really happy with that infrastructure – it works great. I just wanted a video feed that I could embed directly in BrentOzar.com, and control access to that live training page based on whatever I’m teaching that day, and the memberships that the logged-in viewer has. If they’ve bought the course, let them see the video, that kind of thing. I tried Vimeo (since I’m already using them for the class recordings), but I was really disappointed with the 30-40 second latency the viewers were getting.
There are open source streaming platforms that you can download and run yourself in VMs, but…I wanted something really easy, with someone else managing the infrastructure. I didn’t mind paying extra to have someone else deal with the headaches. I don’t wanna learn how streaming servers work.
Enter Mux.com. They do streaming-as-a-service for developers who are building things that leverage online video. They have an API where you can create a stream, and then get back a URL that you can embed in your own site. They even offer a low-latency streaming option, and they seem to be hard at work building something with even lower latency.
For an 8-hour stream, Mux costs about $34, plus $0.63 per attendee. A 30-attendee class is about $52. Their pricing page has a nice calculator on it – just make sure you use the Live Streaming part.
It’s super-easy to create a stream on your Mux dashboard – click on this to watch it animate:
In that gif, I’m creating a new live stream, and you see me copy/paste in one line. By default, Mux streams aren’t low-latency: your viewers see things about 30 seconds after they actually happen. For a live training class, I want faster feedback than that because my attendees often ask questions about what I’m doing, so I add the reduced_latency = true parameter, which brings it down to around 10-15 seconds. Reduced latency isn’t the default because reduced-latency streams have a big disadvantage: if you get disconnected from the stream (or if you end it temporarily), you can’t pick back up. Reduced latency streams just end right there.
In that gif, I need to copy two things from Mux. First, I need the stream key, which I paste into OBS along with the Mux server name. I do wish that OBS would let me store multiple profiles, like one set of servers for my public webcasts and one set for the private ones, but I can deal with this.
Second, I copy Mux’s playback URL, and then I open BrentOzar.com. I’ve got the FV Flowplayer Video Player plugin installed, and it plays streams from Mux with zero configuration. I’m not going to go into detail on my e-commerce, subscription, and membership configuration – we’re hitting the edge of what it makes sense to publish publicly given the low number of people who will be leveraging that part – but hopefully this gets you close enough where you can figure out the rest if you wanna sell your own live classes.
Whew. The setup is a lot of work.
I’m three thousand words into this, and between the hardware & software, the evaluations & decisions & configurations & testing, I’ve probably got 100 hours into my streaming setup. I’m still very, very much a n00b compared to streaming pros.
Hopefully though, armed with what I’ve shared in this post, I can get you a real leg up on a much quicker on-ramp to a brilliant online presentation experience. The whole reason I do this – blog and present – is to share the stuff I’ve learned along the way to help you have an easier time getting started than I did. Sharing what I’ve learned about streaming is no different.
I definitely don’t think of streaming as a direct income source – if I did, I’d be screwed. In my last 30 days of spotty streaming, I’ve earned about $77 on Twitch, most of which comes from subscriptions. (I spent more than that on a single light stand!) Professional streamers have to work a lot harder at this, streaming more content on a more regular basis, and taking specific streaming actions to trigger people to spend money, like buy sounds or cheer.
I do view streaming as an indirect revenue source, though: I regularly plug my training classes on there, and I sell sponsorships which produce the ads you see on the stream & blog from time to time. (I’m taking a month off third party ads during May to promote my new Fundamentals of Parameter Sniffing and Mastering Parameter Sniffing training classes instead – you’ll see the third party sponsorships kick back in in two weeks.)
For me, streaming is a better way of giving back to the community and raising awareness about my personal brand – the same thing I used to travel to local user groups and SQL Saturdays to do. Those in-person events aren’t happening again anytime soon – California won’t allow conferences until there’s a vaccination or a treatment – so I figure I might as well get good at this streaming thing.
I miss y’all, and I can’t wait to see you safely at in-person events again. In the meantime, I’ve tried to make my online training be the next best thing, and I hope y’all enjoy the work that I put into it. It ain’t easy – but I think the results are pretty freakin’ awesome.
Get out there and make.