This is a true (fun) story that evolved in the last 10 days. I hope it will be both useful and entertaining for everyone who wants to convert their in-person events into remote meetups on Twitch.
I'm a software engineer and AWS developer advocate based in Italy, and in the last few weeks I've been working from home because of COVID-19. I've been co-organizing the serverless meetup in Milan since 2016 with a great team of four co-organizers.
Last week we started experimenting with Twitch as our platform of choice for live-streaming our upcoming meetups and give our virtual attendees a chance to communicate and share doubts & ideas in the live chat. We already knew we should use OBS to handle the stream, personalize scenes, etc. - but didn't have much experience with it, so we ran a few tests.
Very naively, I tried to live-stream from my own laptop (MacBook) using OBS. Since OBS can't use any optimized encoder for live-streaming on MacOS, I almost killed my laptop after only 8 minutes.
So it was pretty clear that we also needed some kind of "special hardware". We asked around and were recommended to run OBS on a PC (Windows) with better CPU performance and ideally a GPU as well.
Because we wanted to allow multiple concurrent speakers, we understood pretty soon that we needed some sort of video call "bridge" and then we could simply stream that into Twitch. So I quickly set up a room on Amazon Chime.
Our co-organizer Simone live-streamed a Chime call from his office desktop PC (Windows) using OBS to capture the video stream from Chime. It worked quite well, both video and audio were streamed successfully as I shared my screen (PowerPoint + local IDE). Though, since we were simply screencasting a Chime call (not a native video feed), the scene was pretty basic and the resulting video quality was too low to clearly see small text & code.
So we were lost for a few hours, but another friend from Italy (thanks Gianluca!) told me that there was another option: since 2018, Skype supports the NDI protocol, which allows you to feed the Skype video/audio streams directly into OBS as a native source and hopefully achieve better quality. This sounded promising so we decided to test it too.
Simone and I created a new Skype room, installed the NDI Plugin for OBS and ran another test from his office PC. It took a while to configure OBS correctly, but ultimately it worked pretty well and thanks to NDI the video quality was much better!
But then the COVID-19 situation here in Italy escalated even more and overnight we found out that we were stuck at home for at least 3-4 weeks, which meant Simone couldn't reach his office and we were suddenly without a streaming PC 😱
This is the part of the story where my personal aversion for hardware and my job title become very useful: WE COULD USE THE CLOUD 💡☁️💡
All we needed was a DaaS (Desktop as a Service) alternative to Simone's PC, so I decided to give Amazon Workspaces a try!
Amazon Workspaces is a DaaS solution offered by AWS since 2014. It allows you to spin up Windows or Linux instances in the cloud and connect via browser or using a desktop client, which is available for MacOS, Windows, and Linux. There are multiple bundles you can choose from depending on your performance requirements. Also, there is no up-front commitment and you can choose either the monthly or hourly billing option. For remote meetups, the hourly option (plus a much smaller monthly fee) is great because 3-4 hours per month should be more than enough for a couple of events.
We knew that our performance requirements were quite high, so we started with a Windows PowerPro bundle — 8 vCPU, 32 GiB Memory for $7.25/month + $1.49/hour. This way, our first online meetup would cost us less than $10 and we were happy with that.
The first test with Amazon Workspaces went better than expected, we managed to quickly install all the software on the cloud instance and launch a test stream in less than 30min. Unfortunately, the lack of GPU and Video Memory in the PowerPro bundle resulted in high frame loss and very high CPU usage, corresponding to lagging audio and video.
We needed a more powerful bundle.
The two most powerful bundles are Graphics and GraphicsPro (full list here):
Graphics comes with 8 vCPU, 15 GiB Memory, 1 GPU, 4 GiB Video Memory - for $22/month + $1.75/hour
GraphicsPro comes with 16 vCPU, 122 GiB Memory, 1 GPU, 8 GiB Video Memory — for $66/month + $11.62/hour
We were quite confident that a Graphics instance would be enough and still allow us to keep the monthly cost below $30 (wrt $80+/month for the GraphicsPro instance). So we decided to give the Graphics instance a try.
We ran the next test on Amazon Workspaces Graphics with the very same configuration and it worked great! No frame loss on Twitch, very good video and audio quality, and fairly low CPU usage on the instance.
At this point we had only 24 hours to run a few additional tests before going live with our first online meetup on Thursday, Mar 12th at 6.30 PM CET.
So we did run a few more tests with multiple speakers sharing both audio and video, as well as their screen with flawless take-over, a few backup scenes on OBS, some background noice reduction filters, and we were ready.
On Mar 12th we hosted two great speakers and welcomed more than 170 unique viewers during the stream of 1 hour and 42 minutes, with a peak of 109 concurrent viewers 🎉 (recording here, in Italian 🇮🇹)
Thanks to the built-in Twitch chat we could also take live questions and host a quick Q&A at the end of the meetup, with the supports of both co-organizers and speakers.
Furthermore, as meetup organizers we loved this setup because our attendees didn't have to install any software or browser extensions. In fact, they didn't even have to sign up on Twitch to watch the stream.
Last but not least, nobody depended on any special hardware which means we can organize as many events as we want, wherever we are in the world — as long as at least one of us can start the broadcast via the Workspaces client and connect to the video call to introduce the speakers.
This is the final setup we used, with 2 co-organizers and 2 speakers connected to the bridge, plus one additional co-organizer connected to Workspaces to change scenes under the hood, and a fourth co-organizer helping with the Twitch chat moderation. You don't really need 4 people, but I'd say it really helps if you have at least 2.
Here's a shortlist of technical steps you can follow:
- Create an AWS Account
- Install the Workspaces client on your local machine
- Spin up the Workspaces instance — it will take a few minutes
- Install OBS (32 bits), the OBS NDI plugin, and Skype on the Workspaces instance
- Enable NDI in the Skype client 👉 Settings - Calling - Advanced - Allow NDI usage (video instructions here)
- Configure OBS with scenes including audio & video from NDI source — this also takes a while but it's much easier if you do it during a video call so you can quickly see the audio/video preview in OBS
- Create a Twitch account
- Fetch the Twitch stream key from your account's settings, and configure it in OBS
We also have a few lessons learned to share, so I recommend reading the tips & tricks section below before starting with your own setup.
The story above is a quick summary of the various steps which led us to the final solution. The list below contains some tips so you can achieve the same faster and without much frustration:
- You may need to request a service limit increase in your AWS account to be able to spin up 1 Graphics instance on Amazon Workspaces
- If you are using a Linux machine locally, you'll need to enable the Workspaces Linux client in your AWS Console (it's just a checkbox)
- It looks like the OBS NDI plugin is incompatible with OBS 64bit, so make sure you've installed the 32bit version if nothing works
- It's much easier if you have an independent Skype profile running on Workspaces (you can't join a call twice with the same profile)
- Remember to mute the Workspaces machine in the bridge and also in OBS
- If your speakers don't have a professional microphone, you can enable the OBS noise reduction filter (see instructions here)
- If you are the only speaker, running everything on your laptop (Skype + Workspaces + PowerPoint + ...) might slow down the whole thing and eventually crash your laptop (true story!) — that's why we'd recommend at least two people/laptops
- The NDI plugin for OBS can use the "current speaker" webcam as audio/video source, so you don't have to prepare one scene per speaker and manually switch every time a new speaker starts talking
- You can use a service like restream.io to stream to Twitch, Periscope, and YouTube concurrently
- After the first meetup we have also tested in-browser solutions such as LightStream Studio and StreamYard - these tools come with an easier in-browser setup, but we realized they don't really work for us because we want to have more control over the overall scenes/audio/video setup
To speed things up even more, you may want to reuse and adapt our OBS profile and scene collection. You can find both here.
The zip file contains two important artifacts:
- a folder named "Serverless Meetup" — this is the OBS profile that you can import (
Profile > Import) and then select from the same
- a JSON file named "serverless-meetup-obs-preset.json" — this is the OBS scene collection that you can import (
Scene collection > Import) and then select from the same
We've been pretty happy with this setup and we have collected a lot of positive feedback from our online attendees. We'll keep using this setup for our next serverless meetups online and maybe try to virtually meet even more often now that we have a cloud-based and easy-to-share setup.
I personally hope this article will help many meetup organizers to keep their groups active and motivated during these challenging times. We don't have to sacrifice our communities only because we can't meet in person.
If you're curious about details I haven't mentioned in this article or if you have other ideas to share please feel free to reach out to me on Twitter or drop a comment below.