Skip to content
This repository has been archived by the owner on Mar 31, 2023. It is now read-only.

luludotdev/frameshift

Repository files navigation

Warning

The FTL protocol is deprecated and going to be removed from OBS in the future, in favour of WebRTC output. As such, this FTL-based version of Frameshift is also deprecated and no more updates will be made, and no support will be given.

The WebRTC successor to Frameshift will not be released under an open-source model.


🚀 Frameshift

Ingest and Viewing stack for deploying Mixer's FTL streaming protocol.

🌠 Why?

The Frameshift stack is designed for low-latency streaming for small scale systems. An example of this would be aggregating multiple remote camera perspectives in broadcasting software such as OBS to be restreamed out to the public. This allows for near-realtime multi-camera setups running over a local network, or even via the internet.

By using Mixer's FTL protocol for ingest and WebRTC for display, we can achieve sub-second latency on good connections, allowing for maximum interactivity on your broadcasts.

❓ Usage

The Frameshift stack is deployed using Docker, as such you are expected to have a good working knowledge of both Docker and Docker Compose. It can also be deployed using Kubernetes, but no samples are provided for that.

Both web client and ingest server are available as Docker Images. A sample Docker Compose file has been provided to help you get started. Please note that this is just an example, and not intended to be used verbatim.

You are expected to reverse proxy both the ingest server and the web client to the same hostname. A sample Caddyfile has been provided to show what needs proxying and where. Note that Caddy is not required, just recommended. You are free to use any HTTP reverse proxy instead. In addition to this, you will need to open the required ports that aren't being proxied via HTTP, as these are used for ingest and playback.

🎥 Ingest Server

The ingest server is Glimesh's Janus FTL Plugin. Automatic Docker builds are provided for convenience sake. It must be configured to operate using the REST Service Connection mode, see the sample Compose file for the required environment variables.

For an explanation of what each environment variable does and their accepted values, please refer to their repo.

🖥️ Web Client

The web client is written in TypeScript using Next.js. It serves a dual purpose as both a web-based stream player, as well as a backend for the ingest server.

Viewing Streams

To view an active stream, navigate to /live/[channelID] on your hosted server.

You can set the ingest server URL using the FTL_CLIENT_INGEST_SERVER environment variable on the server or using the ?serverURI= query param in the browser.

Ingest Backend

The ingest server is configured to communicate via an HTTP REST API to coordinate incoming streams and handle authentication etc. The web client serves this, and can be configured via environment variables. Again, refer to the sample Compose file for a list of variables and their uses.

📡 Streaming to a Frameshift Instance

See the dedicated docs page.

🤔 What's with the name?

The Frame-Shift Drive is a fictional device from the Elite Dangerous universe which propels ships to faster-than-light speeds. I also think the name just sounds cool and fits with the theme of the project.