A few weeks ago I decided I wanted to setup some proper livestreaming for myself. I didn’t have anything particular in mind with what I wanted to stream or who to, I just wanted the ability do so without fear of censorship, tracking or adverts.
This is part one of a three part series:
My ultimate end goal was to create something that kinda formed a hybrid between Twitch and Discord, both of which are impressive in their own right. As such this let me pull up a wishlist of requirements to set myself in this process:
- Viewable online without installing anything
- No account required, although optionally available
- Simple text based chat
- Chat moderation
- Input access control
- Near realtime latency
- Good(enough) frame rate (>25fps will do)
- Good(enough) resolution (720p is fine for what I do)
- Possibility of multiple streams simultaneously
- Minimum of on the wire encrypted with possibility of E2EE
- Ability to scale (hilariously ambitious)
Existing self-hosted options
aka lets go window shopping
Whilst there are quite a few options out there already for doing this in the self-hosted space, all of them had one issue or another which I didn’t like. Primarily this almost always boiled down to latency, realtime streaming is quite hard, especially with a reasonable quality.
I’ll briefly talk about each option first then I’ll do a feature matrix to compare them all.
The very first platform I tried was one I was already familiar with, Jitsi. I’ll admit, I love Jitsi and I already run my own Jitsi server so trying it out wasn’t a problem, jump on a call, get a friend or two to join, stream game. Results were almost immediate and somewhat as expected, good latency, poor quality/framerate, definitely video call oriented.
Whilst Jitsi is capable of having access controls on it, setting up Prosody to do this whilst maintaining the ability for anybody to use it was a pain I didn’t even venture into.
Next came Owncast which was also super easy to setup in Docker. Pull a few containers, mount a few volumes, forward a few ports and add to my existing reverse proxy, job done.
I actually ran this for a few months and did a few streams on it, overall I was quite impressed. Playing around with the settings you could upload chunks to an S3 compatible service then stream through a CDN for near limitless scalability, although the chat was entirely ephemeral and even without proxying the files it still had a good 15s latency.
Peertube v3 brought basic livestreaming, and later releases added chat, P2P video playing and is generally just awesome software. Unfortunately I almost immediately ran into the same problem with latency that I did with Owncast, and it was super clunky to get a stream going. The chat was also pretty poor, with next to no moderation facilities. It did have direct recording which was nice, but if I’m going to record it I tend to do that locally anyway.
One thing Peertube really had going for it than non of the others did was ActivityPub sharing of when you went live. Viewers could subscribe to this and their home instance would notify them whenever I started streaming.
As nice as Peertube is, and despite it still running after my experiments, I decided it wasn’t for live streaming and relegated it just to video sharing duty.
Next up in part 2 we’ll look at some new technologies used to build Ghost Live.