12 ms·
Show HN: Lightspeed – subsecond, open source, self hosted stream from OBS
- GRVYDEV 6y agoWelcome to Project Lightspeed. This is a project that allows anyone to easily deploy their own sub-second latency live-streaming server. In its current state you can stream from OBS [1] and watch that stream back from any desktop browser. This has been a super fun project which has taught me more than any other project I have done. It uses Rust, Go and React and can be deployed fairly easily on a very lightweight server. For example, I have been doing my test streams on a $5 Digital Ocean droplet and the CPU usage is at around 20%. Granted not a lot of people are watching however it is more lightweight than a solution such as Janus. The point of this project is twofold. First I wanted to learn more about WebRTC and real-time communication in general. Second, I wanted to provide a platform where people can setup their own little live-stream environment. Maybe you just want a place where you and some friends can hang out or you are sick of the main-stream platforms. Anyhow as of writing this post it is v0.1.0 and considered an MVP release. In the coming months I (and hopefully some of you :)) will be adding more features and trying to flesh this out into as much of a full featured platform as possible. Feel free to take a look at the repo and let me know what you all think :) [1] Open Broadcast Software (OBS): https://obsproject.com/ https://obsproject.com/
- 12things 6y agoA very interesting project, can you elaborate more on how it is getting sub second latency and why youtube/twitch seem to have more than a few seconds of delay.
- GRVYDEV 6y agoYouTube and twitch use RTMP which operates over TCP. This means that each time we send a packet we need to ensure that it’s been received which adds latency overhead. Lightspeed uses the FTL protocol which operates over udp thus reducing the latency overhead
- samstave 6y agoSo assuming you have packet loss - you just get a paused/blank stream until the flow continues? How does it handle any network issues. Would it ever be possible to route two stream via different paths to the client and let the client just accept the first packet from either and drop the other in order to add some redundancy to delivery?
- GRVYDEV 6y agoThis wouldn’t actually solve anything since WebRTC can handle packet loss. The loss is going to be coming from OBS -> Server which unfortunately there isn’t much I can do about that since it uses UDP
- samstave 6y agoAh thanks. A diagram of the setup on your page would be helpful...
- midasuni 6y agoMultiple streams is BAU with RTP - using smpte-2022-7, or most of the time just firing the packet different times on different routing tables. Sometimes network paths die. This could be a dodgy router in a third party network that drops streams for 150ms at a time, or a bgp recalculation that knocks it out for maybe a minute or so. In both cases you need to have multiple routes to keep your latency low.
- imtringued 6y agoHTTP video streams are split into segments and those segments are delivered whole. Larger segments are easier to cache and scale to bigger number of viewers. The other factor is that youtube and twitch spend more CPU time on compression to achieve lower bitrates.
- simlevesque 6y agoCould it be possible to use WebRTC to have listeners become seeders/repeaters so you could have more listener without impacting too much your own CPU ? Something like AceStream.
- GRVYDEV 6y agoYup! You could develop a web of WebRTC relays
- ghostie_plz 6y agoThanks for sharing! I was actually just looking for something like this earlier today, can't wait to try it out.
- GRVYDEV 6y agoI can’t wait for you to try it out haha!
- rlyshw 6y agoThis project is pretty cool, I’ll tinker around with it tomorrow. As an aside, I’ve noticed you’re building out your own stream protocol stack (FTL/LightSpeed). What’s the reasoning there? Seems slightly inconvenient to have to “hack” OBS to make the output stream work. Will FTL support be merged into OBS in the future? If you’re just trying to avoid the latency of RTMP then I might suggest considering the existing SRT protocol[1]. It’s been open source for a while and is well-established(native support in OBS core and optional in FFMPEG). Seems to already solve a lot of the transport-level stuff that you’re working on with FTL. [1] Secure Reliable Transport: https://github.com/Haivision/srt https://github.com/Haivision/srt
- GRVYDEV 6y agoSo FTL is supported by OBS and was used by Mixer. I’m interested to move to SRT in the future since you’re correct, FTL support will be going away eventually
- GRVYDEV 6y agoAlso the work required to adapt what I have to SRT is non trivial and I would rather have something that works right now and then build in SRT support in the future
- GRVYDEV 6y agoAlso, you’re not “hacking” obs. oBS is compiled with the FTL sdk you just have to tell it to use it.
- oblio 6y agoReally cool! You say you use Rust and Go. Why both? I imagine Rust for super performance sensitive stuff and Go for the rest, for faster development?
- codetrotter 6y agoThis was going to be my question too basically. Hoping to see OP answer this and in particular what I would like to see them comment on is how they divide their codebase between these two languages. Which parts are being implemented in which of those languages and why. Personally a huge proponent of Rust.
- rektide 6y agoI think it was a matter of what libraries were available where. Namely, Lightspeed-webrtc uses the extremely popular & robust Go library Pion[1] for webrtc. It's a little over 500 lines. The Rust Lightspeed-ingest[2] server is also ~500 lines of code, and primarily handshakes the FTL protocol used to communicate with OBS. There is a Pion port to rust[3] that is in progress. I am not sure the state of this work. Pion is used quite extensively by many many projects; I'm not sure if the rust webrtc-rs port has any notable users yet. As I began by saying, I expect the trustability & extensiveness of Pion is what lead to lightspeed-webrtc being written in Go. [1] https://pion.ly/ https://pion.ly/ [2] https://github.com/GRVYDEV/Lightspeed-ingest https://github.com/GRVYDEV/Lightspeed-ingest [3] https://github.com/webrtc-rs/webrtc https://github.com/webrtc-rs/webrtc
- morsch 6y agoAwesome! I was looking for something like this when trying to play a local multiplayer game via the Internet in an early lockdown. There are, or were, no good turnkey solutions for this. Twitch and Youtube have 5-10s latency, which is often not good enough. Mixer promised (and presumably delivered) ~1s latency using the FTL protocol you use, but they had a wait list of a couple of days or weeks, and of course now, they don't exist anymore. Even Steam Play Together, ostensibly built for this purpose, wasn't low latency enough in my limited experience (this really surprised me, so maybe I'm doing it wrong). The easiest solution, use the share desktop function of whatever video conference tool, almost works, but they universally seemed reduce the frame rate, which is ok for presentations but unsuitable for games (also, no audio). My solution was to output OBS to a virtual webcam device and use Jitsi Meet. A bit roundabout, but it worked wonderfully. Ideally, I'd forgo the DO droplet, and just run everything locally. 20% of a small droplet is even less of a modern desktop computer's CPU. Which leaves upload bandwidth for broadcast, which depends on your connection and how many people you need to be able to stream to.
- ossopite 6y agoI've played local multiplayer games over parsec (https://parsec.app/ https://parsec.app/), it works great and is pretty much turnkey
- morsch 6y agoYes, I forgot about Parsec, that's a good suggestion. I remember trying it, and not getting it to do what I want, unfortunately I don't remember why. I think I was stuck in the "Arcade", when all I wanted was to share my desktop or one window. It certainly looks like exactly what I was looking for.
- Warchamp7 6y agoArcade is like a quick match menu for finding a game to play. You can share any screen or desktop from the main app and have friends connect
- 6y ago
- justaj 6y agoThanks for making this project possible. Have you tried streaming via Tor? Is it possible to achieve streaming via Tor even if subsecond delay can't be achieved?
- dodgepong 6y agoYou should know the OBS team plans on deprecating FTL since Mixer was the only major player who ever used it, not to mention the fact that the server side of the tech is closed. The FTL implementation in OBS is buggy, and keeping it maintained is not worth the effort for a non-standard transport protocol.
- GRVYDEV 6y agoYes I am aware however there is a new service called Glimesh that is utilizing FTL so I dont think it is going to disappear tomorrow. Also I have implemented the server side so it does not matter that it is closed.
- dodgepong 6y agoSure, but Glimesh are going to be looking at moving away from FTL themselves. See the discussion on this PR: https://github.com/obsproject/obs-studio/pull/3834 https://github.com/obsproject/obs-studio/pull/3834
- GRVYDEV 6y agoYup I have spoken to them about that as well however that move wont be for a while
- dodgepong 6y agoWell, I think it's possible FTL will be gone from OBS by the end of 2021 so I guess they need to figure out what they are doing sooner rather than later. There will probably be a post about it on the OBS Github soon.
- captn3m0 6y agoAny way to push non-OBS content to Lightspeed? I've been trying to run a sub-second latency game-livestream (ala twitch plays), and I'd rather run it on a headless server without OBS.
- xd1936 6y agoIt should work, as long as you're sending it to the server over FTL[1], which is a pretty new and uncommon protocol developed by the now-defunct Mixer. 1. https://github.com/mixer/ftl-sdk https://github.com/mixer/ftl-sdk
- naikrovek 6y agoIt's kind of amazing how active that GitHub org is given that Mixer is gone...
- rektide 6y agoThe ingress components is interesting to me. It takes the OBS stream, via the FTL protocol, & converts it into something for WebRTC to use, yes? What drove you to use FTL protocol for ingestion? Did you consider alternatives like RTMP, which I believe OBS also supports? I hand't heard of FTL before. Apparently it was a protocol used in Microsoft's now-defunct game-streaming service, Mixer. I found some discussion of the various streaming protocols here[1], which included some description of FTL. I guess it comes down to latency. That would still have left SRT on the table, yes? Great project. Such a key area of connectivity for us all. So glad you did this. Thanks. [1] https://restream.io/blog/streaming-protocols/ https://restream.io/blog/streaming-protocols/
- GRVYDEV 6y agoI went with FTL instead of RTMP for the sake of latency. Also FTL gives me a stream of RTP packets which can go directly into WebRTC meaning I have to do 0 processing of the packets where as with RTMP I would have to convert them into RTP packets. Also SRT is interesting however it is wildly complicated and does not use RTP meaning I would have to figure out how it works and then convert whatever it gives me into RTP packets for WebRTC
- deleted 6y ago[deleted]
- fireattack 6y agoDemo link doesn't work.
- GRVYDEV 6y agoAs of right now there isn’t a demo. I need to determine the most cost effective way to stream 24/7 then I will put one up
- 29athrowaway 6y agoWhat about a recording of a demo on YouTube?
- GRVYDEV 6y agoI’ll get on that first thing tomorrow!
- samstave 6y agoOBS runs on windows as well, this only runs on Linux? Can I run this in a VM of Linux easily - and have all deps there, including OBS? (I dont know anything about OBS just yet - I just looked at it and DL'd it now... Incidentally - I met the the producer of the podcast "moneypot" on the plane a few days ago and we talked a ton - I asked about how would one get into podcasting/streaming if they havent yet - and she mentioned some great resources - I cant recall them off the top of my head - Ill have to ping her and get them again - but this is something I am going to look into learning during this pandowntime. If you have resources to point at - that would be appreciated. THanks for this though.
- laumars 6y agoThe idea is OBS runs broadcaster side and thus what send the stream. Lightspeed runs server side (like YouTube, Twitch, Facebook, etc). Your viewers then connect to that server running Lightspeed rather than your home machine broadcasting the stream.
- Tepix 6y agoRelated: a fork of OBS Studio with WebRTC support https://github.com/CoSMoSoftware/OBS-studio-webrtc https://github.com/CoSMoSoftware/OBS-studio-webrtc
- campbellmorgan 6y agoFor anybody thinking about contributing this, this is sadly as close to not open source as open source gets. I tried to contribute to this, but it's impossible to build without the webrtc binary and the docs are deliberately opaque about going about building your own version of the binary. You are encouraged to pay the (almost sole) contributor of this repo for his build of webrtc. For this reason it's not really surprising that this version is both quite out of sync with the mainline OBS and also has only one or two contributors. Fortunately, for me, most plugins built with the mainline OBS do work with this. I get that the maintainer has put a lot of work into this and wants to try and monetize some part which is hard when OBS is GPL, but depending on a binary which is nigh-on impossible to build and then charging for it on your website just feels a bit of a shitty way to do it.
- orliesaurus 6y agoVery cool - mind showcasing/telling us some use-cases? I'm thinking... if you pair this with a tool to control input (mouse/keyboard) you could have a ligth-fast (pun intended) VNC server with HD resolution?
- GRVYDEV 6y agoWow that is a use case that I haven’t considered haha! That sounds awesome! This was made with the intent to be used as a traditional live stream server similar to Twitch or YouTube but honestly it can be used for whatever your heart desires :)
- gzer0 6y agoHmm, how would you go about doing that though? Would that not require admin/highest level privileges?
- matsemann 6y agoVery cool! If you want casual people to use this, I would look into simplifying the setup. Either by providing compiled binaries instead of having to set up go, rust etc oneself. Or by containerizing something.
- te_chris 6y agoCould this mix multiple obs streams from different origins? My friends and I put on a NYE stream party but it was actually a massive faff finding something that could mix multiple remote streams into one. Would love to be able to self host something to do it A simple switch is fine in this case, no overlays or anything
- corobo 6y agoObs-ndi. Output all the sources you need over NDI. Use them as sources in OBS.
- naikrovek 6y agoNDI is exactly right. It was designed for that.
- te_chris 6y agoIs there some easy to run server software for this? Looks interesting but seems to only run on obs desktop?
- corobo 6y agoDo you mean on the broadcast side? Personally I'm using another instance of OBS to broadcast a few scenes as individual streams from my Linux workstation and my MacBook (right click scene or source -> add filter -> NDI Broadcast) I've seen these apps on iOS though Broadcast the camera: https://apps.apple.com/us/app/ndi-hx-camera/id1477266080 https://apps.apple.com/us/app/ndi-hx-camera/id1477266080 Broadcast the screen: https://apps.apple.com/us/app/ndi-hx-capture/id1501247823 https://apps.apple.com/us/app/ndi-hx-capture/id1501247823 I'm sure Android etc have similar. NDI is (more closely related to?) a protocol rather than a program though, there's bound to be something that speaks it for what you need
- woodrowbarlow 6y agoi've dabbled in OBS' code and actually this should be possible. you might need to modify the "Media Source" element to add the GUI controls for FTL-specific stuff, but all the protocol support seems to already be in there and the actual media transport is RTP, which is already supported because the Media Source supports RTMP streams. you'd have each of your different origins stream to their own private FTL paths, then in your OBS you'd create media sources from each of those paths then push your final, mixed stream to the public FTL path.
- 867-5309 6y agoOBS: Open Broadcaster Software
- j1elo 6y agoAbout the choice of license (MIT): could you share your considerations about it? (if any) It's a topic I'm interested in. Mainly to see examples (and learn from them) about when people prefer lax licenses on the style of "do what you want with this, including a closed-source proprietary business" (MIT, Apache) which has allowed in the past that big Co's. benefit from it without giving back (lots of cases in HN), vs. strong copyleft "do what you want except closed-source proprietary stuff" style (generally speaking, the GPL family -- EDIT: I know that this, being mainly a server-side thing, would be more affected by AGPL than by GPL. Bear with me.). If there are no business / commercialization intentions in the foreseeable future, would it make sense to use a GPL license (one of them) to build a strong open-source community? Or it doesn't matter in practice? (i.e. it doesn't really affect the chances of building a good and strong developer community)
- GRVYDEV 6y agoWould I like a strong open source community? Absolutely, could you fork this and make money off of it right now? No not even close. Maybe in the future I would consider a different license but at the end of the day if you take this and make it profitable good for you :) my goal wasn’t to make money
- naikrovek 6y agoI am also pro-MIT. For me, "freedom" doesn't mean "restricting what users can do." GPL restricts what users can do, and thus restricts freedom in my eyes. Not sure why anyone would care but it seemed like a good time to explain my thoughts on that while agreeing with you. This kind of thing has been needed for some time, so thank you for creating it.
- Brian_K_White 6y agoMIT freedom is like the freedom to enslave. Restricting the freedom to use your work to restrict others' freedom, is not nearly so onerous or hypocritical as GPL bemoaners try to characterize it. I feel absolutely zero sympathy for the argument.
- xmodem 6y agoThis is awesome and I'm going to try to set it up. Is it possible for a viewer of the stream to send it to a Chromecast?
- xeyownt 6y agoBugs: "I am very from perfect". Pun intended? ;-)
- GRVYDEV 6y agoOof! I'll stick to development I guess grammar isn't my strong suit haha!
- 2Gkashmiri 6y agocan this tech be adopted in things like peertube?
- cfjgvjh 6y agoThis looks fantastic! We usually use Discord's share screen feature, but having more options are always nice, and I assume I can up the resolution/bitrate as I need since it's based on an OBS stream.
- GRVYDEV 6y agoYeah! The bitrate shouldn't exceed 8k though and remember the more bitrate you use the more bandwidth the server will use which can mean incurring costs with some providers.
- xd1936 6y agoThis is fantastic! I needed this yesterday evening while trying to bring a remote family member into a Jackbox game, with no account or software needed on their end. Great project!
- lawl 6y agoThis is awesome! I wanted to make something like this too after Mixer shut down and I didn't have good options anymore to stream low latency gameplay to friends. But I was too lazy to do it properly. I ended up with this hack: https://i.imgur.com/jDeMxly.png https://i.imgur.com/jDeMxly.png Redirect the "Record" button of obs to make ffmpeg output to an http endpoint, which is a small server that just forwards any bytes it receives to connected consumers. They can then play it back with ffplay -fflags nobuffer -flags low_delay -framedrop -strict experimental https://stream.server/lawl I've found that most of the latency is actually coming from the player. I.e. VLC has way more latency, even if you tell it to not buffer. TCP is a bit of an issue since ffplay doesn't speed up playback when it falls behind, but it mostly works and you can just restart ffplay if you fall behind too far. When it works (good network conditions) it also achieves sub second latency. Will definitely have to give this a try over my hack.
- thedmstdmstdmst 6y agoWhat do you use for your small server for forwarding bytes?
- lawl 6y agohttps://pastebin.com/iywLhh8Y https://pastebin.com/iywLhh8Y Don't expect much. I threw this entire thing together as quickly and lazily as possible.
- thedmstdmstdmst 6y agothank you so much for replying
- jedberg 6y agoThis looks really cool! Maybe we'll switch over our weekly Jackbox games to this. What is the relationship between viewers and CPU load? I assume it is not linear? And does it do any sort of bandwidth optimization or is the outbound bandwidth stream size times number of users? In other words, how many viewers do you think a single DO droplet could handle?
- polishdude20 6y agoAny reason you used go and rust rather than node?