wimpysworld / stream-sprout

Restream a video source to multiple destinations such as Twitch, YouTube, Owncast and Peertube ๐Ÿ“ก
Apache License 2.0
51 stars 6 forks source link
ffmpeg hacktoberfest kick livestream meld-studio multi-stream obs-studio owncast peertube restream rtmp rtmp-server rtmp-stream simulcast streamlabs trovo twitch youtube
Stream Sprout # Stream Sprout **Restream a video source to multiple destinations such as Twitch, YouTube, Owncast and Peertube** **Made with ๐Ÿ’ for Tux (Linux) & Apple (macOS)**

 Discord   Mastodon   Twitter   LinkedIn 

Introduction

Stream Sprout ๐ŸŒฑ is a simple, self-contained, and easy-to-use solution for streaming to multiple destinations such as Twitch, YouTube, Owncast and Peertube ๐Ÿ“ก

Stream Sprout

It uses FFmpeg to receive the video stream from OBS Studio (or any encoder that can produce RTMP) and then restreams it to multiple destinations. This provides similar functionality as services like Restream.io and Livepush.io but without the need to pay ๐Ÿ’ธ for a third-party service or run something like nginx with the RTMP module.

Stream Sprout is configured with a simple YAML file and designed to be run on the same computer as your OBS Studio instance (it can be run remotely, with appropriate security measures, and does not require root privileges.

There is no transcoding or processing of the video stream ๐ŸŽž๏ธ The stream is received and then restreamed to the destinations you configure without modification. Optionally you can also archive the stream to disk ๐Ÿ’พ

While the restreaming process is lightweight, your bandwidth requirements will increase with each destination you add. ๐Ÿ“ˆ Ensure you have sufficient bandwidth to support the number of destinations you intend to stream to โคด๏ธ

Stream Sprout is developed on Linux ๐Ÿง and should work on macOS ๐Ÿ or any other platform that supports bash and ffmpeg ๐Ÿ‘๏ธ

Get Started

Installation

Debian

macOS

Install the Stream Sprout requirements using brew:

brew install bash ffmpeg

Now clone the project:

git clone https://github.com/wimpysworld/stream-sprout.git
cd stream-sprout

Nix & NixOS

FlakeHub

Stable releases of Stream Sprout are published to FlakeHub for Nix users โ„๏ธ See the flake on FlakeHub for more details:

Snap

stream-sprout

For Linux distributions that support snap packages, Stream Sprout is available from the Snap Store ๐Ÿ›๏ธ

sudo snap install stream-sprout

Ubuntu

Docker & Podman

Pull the container

The Stream Sprout container image is available from the GitHub Container Registry for amd64 and arm64. To pull the latest container image:

docker pull ghcr.io/wimpysworld/stream-sprout:latest-alpine

Or if you want a specific version:

docker pull ghcr.io/wimpysworld/stream-sprout:0.1.5-alpine

Run the container

The stream-sprout.yaml configuration file will be on the host computer so you need mount a volume to access it from the container.

If you have already pulled the container image, you can run Stream Sprout with:

docker run -p 1935:1935 -it -v $PWD:/data stream-sprout --config /data/stream-sprout.yaml

If you have not pulled or built the container image, you can run Stream Sprout with:

docker run -p 1935:1935 -it -v $PWD:/data ghcr.io/wimpysworld/stream-sprout:alpine-latest --config /data/stream-sprout.yaml

Build the container

Build the Stream Sprout container image:

docker build -t stream-sprout .

From source

You need to have FFmpeg on your system.

git clone https://github.com/wimpysworld/stream-sprout.git
cd stream-sprout

Configure Stream Sprout

Copy the example Stream Sprout configuration and edit it to suit your needs ๐Ÿ“

You can specify the configuration file to use with the --config <path> option. If you don't specify a configuration file, Stream Sprout will look for a configuration file in the following locations, in this order:

Server

Here's an example configuration for the Stream Sprout server: section.

server:
  ip: 127.0.0.1
  port: 1935
  app: sprout
  key: create your key with uuidgen here
  archive_stream: false
  archive_path: ~/Streams

The server: section is used to configure the RTMP server that Stream Sprout creates.

The IP address, port, app name and key are composed to create the RTMP URL that you will use in OBS Studio. For example, rtmp://ip:port/app/key.

๐Ÿšจ FFMPEG WILL ACCEPT ANY RTMP STREAM ON THE CORRECT PORT ๐Ÿšจ

FFmpeg does not currently enforce app or key paths for its incoming RTMP server. Regardless of the app or key you set in the Stream Sprout YAML FFmpeg will accept any incoming stream on the correct port

โš ๏ธ Do not expose the Stream Sprout RTMP server to the public internet without additional security measures โš ๏ธ

Archive streams

If archive_stream: is true Stream Sprout will archive the stream to disk in the directory specified by archive_path:. If archive_path: is not accessible, Stream Sprout will fallback to using the current working directory.

Services

services: are arbitrarily named. Just create an entry for each RTMP destination you want to stream to. The example configuration includes entries for Trovo, Twitch, and YouTube but any RTMP destination can be added.

services:
  my-rtmp-destination:
    enabled: true
    rtmp_server: "rtmp://rtmp.example.com/live/"
    key: "my_super_secret_stream_key"

Twitch

Here's an example configuration for Twitch.

services:
  twitch:
    enabled: true
    rtmp_server: "rtmp://live.twitch.tv/app/"
    key: "your_twitch_stream_key"

Ingest servers

The example configuration uses the primary Twitch ingest endpoint, which is rtmp://live.twitch.tv/app/. If you want to optimize your stream latency, you can use a Twitch ingest endpoint closer to your location. A short list of recommended endpoints, based on your whereabouts, is available from Recommended Ingest Endpoints For You.

You can find a complete list of Twitch ingest endpoints from https://twitchstatus.com/.

Testing

If you want to test streaming to Twitch without going live, you can use the ?bandwidthtest=true query parameter.

Add ?bandwidthtest=true to the end of your Twitch stream key, this will enable bandwidth testing, which you can monitor using https://inspector.twitch.tv/, and the stream will not go live on your channel.

YouTube

Here's an example configuration for YouTube.

services:
  youtube:
    enabled: true
    rtmp_server: "rtmp://a.rtmp.youtube.com/live2/"
    key: "your_youtube_stream_key"

Configure OBS Studio

OBS Studio Stream Settings

Limitations

References

These are some of the references used to create this project: