Low latency point-to-point game streamer & player; best suited for 8-bit computer emulators. Can also capture locally and record streams.
Simple Stream uses ffmpeg
to stream a window as low latency MPEG2-TS
(H.246/AAC) via either SRT, TCP or UDP. Audio is sourced from all desktop audio
(excluding microphones) or just the audio of emulators Simple Stream is aware
of.
The SRT, TCP and UDP streams created are intended for a remote observer to watch or be included in an OBS Studio scene via Media Source.
Video can be encoded using libx264
, h264_nvenc
and h264_vaapi
. libx264
and h264_nvenc
are recommended as they are both tuned for low latency.
Simple Stream is currently "aware" of the following emulators, which means it knows how to crop out menus and status areas to optimise the stream and also how to automatically route just their audio.
- Caprice32 - Amstrad CPC Emulator
- Fuse - the Free Unix Spectrum Emulator
- VICE - the Versatile Commodore Emulator
In order to stream point-to-point the receiving party must configure NAT on
their router to allow the appropriate port (4864 by default) to be allowed
through. When streaming via TCP (the default), play-stream.sh
must be started
by the receiving party before the streamer starts stream.sh
.
Fred wants to stream game play to his friend Barny.
- Barny configures NAT on his router to accept TCP/UDP on port 4864 and routes that to his PC.
- Barny runs
./play-stream.sh -ip 24.65.43.257
, where 24.65.43.257 is his routers Internet facing IP address. - Barny tells Fred he is ready to receive and his IP address.
- Fred runs
./stream.sh -ip 24.65.43.257
- When prompted Fred clicks on the window of the game he wants to stream.
- Fred is now streaming to Barny.
- Barny will see a window of Fred's game appear.
- When Barny closes the stream it will automatically disconnect Fred's stream.
Simple Stream is a shell script that uses the following awesome software.
bc
coreutils
grep
ffmpeg
(snap preferred since it enables h264_nvenc and h264_vaapi)nvidia-settings
(optional; required for reliable capture when using nvidia drivers)nvidia-utils-xyx
(optional; required for h264_nvenc)mpv
(optional)pulseaudio-utils
scrot
sed
vainfo
(optional; required for h264_vaapi)x11-utils
Run install.sh
included in this repository.
The scripts in Simple Stream try and do the right thing by default, but if you need to tweak their behaviour this is how to do it.
stream.sh
- Streams the selected window and loopback audio (MPEG2-TS).capture.sh
- Captures the selected window and loopback audio (Matroska).
Usage
stream [--abitrate 96k] [--acodec mp2] [--asamplerate 44100] [--channels 1] [--colspace bt601]
[--ffmpeg /snap/bin/obs-studio.ffmpeg] [--fps 60] [--ip 192.168.0.1] [--mouse] [--pixfmt nv12] [--port 4864] [--protocol srt|tcp|udp]
[--signal PAL] [--stream-options '?fifo_size=10240'] [--vaapi-device /dev/dri/renderD128]
[--vbitrate 640000] [--vcodec libx264] [--vsync auto|passthrough|cfr|vfr|drop] [--help]
You can also pass optional parameters
--abitrate : Set audio codec bitrate for the stream in kbits/sec.
--acodec : Set audio codec for the stream. [aac|mp2|mp3]
--asamplerate : Set audio sample rate for the stream.
--channels : Set audio channels [1|2].
--colspace : Set color space. [bt601|bt709]
--ffmpeg : Set the full path to ffmpeg.
--fps : Set framerate to stream at.
--ip : Set the IP address to stream to.
--mouse : Enable capture of mouse cursor; disabled by default.
--pixfmt : Set the pixel format [nv12|yuv420p]
--port : Set the tcp/udp port to stream to.
--protocol : Set the protocol to stream over. [tcp|udp]
--signal : Set video signal. [PAL|NTSC]
--steam-options : Set tcp/udp stream options; such as '?fifo_size=10240'.
--vaapi-device : Set the full path to the VA-API device; such as /dev/dri/renderD128
--vbitrate : Set video codec bitrate for the stream in bits/sec.
--vcodec : Set video codec for the stream. [libx264|h264_nvenc|h264_vaapi]
--vsync : Set vsync method in the video encoder; 'auto' by default.
--help : This help.
play-stream.sh
- Plays a SRT, TCP or UDP stream usingffplay
record-stream.sh
- Records a SRT, TCP or UDP stream usingffmpeg
.
Usage
play-stream [--ip 192.168.0.1] [--player [ffplay|mpv] [--port 4864] [--protocol srt|tcp|udp] [--help]
You can also pass optional parameters
--ip : Set the IP address to play from.
--player : Set the player. [ffplay|mpv]
--port : Set the tcp/udp port to connect to.
--protocol : Set the protocol to play over. [srt|tcp|udp]
--help : This help.