Title: Streaming to Twitch using OpenBSD
Author: Solène
Date: 06 July 2019
Tags: openbsd gaming
Description: 

### Introduction

If you ever wanted to make a twitch stream from your OpenBSD system,
this is
now possible, thanks to OpenBSD developer thfr@ who made a wrapper
named
**fauxstream** using ffmpeg with relevant parameters.

[GitHub repository: fauxstream](https://github.com/rfht/fauxstream)

The setup is quite easy, it only requires a few steps and searching on
Twitch
website two informations, hopefully, to ease the process, I found the
links for
you.

You will need to make an account on twitch, get your api key (a long
string of
characters) which **should stay secret** because it allow anyone having
it to
stream on your account.


### Preparation steps

1. Register / connect on twitch
2. Get your Stream API key at
   https://www.twitch.tv/YOUR_USERNAME/dashboard/settings (from this
page you
   can also choose if twitch should automatically saves streams as
videos for
   14 days)
3. [Choose your nearest server from this
page](https://stream.twitch.tv/ingests/)
4. Add in your shell environnement a variable
TWITCH=rtmp://SERVER_FROM_STEP_3/YOUR_API_KEY
5. Get fauxstream with `cvs -d anoncvs@anoncvs.thfr.info:/cvs checkout
-P projects/fauxstream/`
6. `chmod u+x fauxstream/fauxstream`
7. [Allow recording of the
microphone](https://www.openbsd.org/faq/faq13.html#recordaudio)
8. [Allow recording of the output
sound](https://www.openbsd.org/faq/faq13.html#recordmon)

Once you have all the pieces, start a new shell and check the $TWITCH
variable
is correctly set, it should looks like
*rtmp://live-ams.twitch.tv/app/live_2738723987238_jiozjeoizaeiazheizahe
zah*
(this is not a real api key).


### Using fauxstream

**fauxstream** script comes with a README.md file containing some
useful
informations, you can also check the usage

View usage:

    $ ./fauxstream


### Starting a stream

When you start a stream, **take care your API key isn't displayed on
the
stream**! I redirect stderr to **/dev/null** so all the output
containing the
key is not displayed.

Here is the settings I use to stream:

    $ ./fauxstream -m -vmic 5.0 -vmon 0.2 -r 1920x1080 -f 20 -b 4000
$TWITCH 2> /dev/null

If you choose a smaller resolution than your screen, imagine a square
of that
resolution starting at the top left corner of your screen, the content
of this
square will be streamed.

I recommend **bwm-ng** package (I wrote a ports of the week article
about it)
to view your realtime bandwidth usage, if you see the bandwidth reach a
fixed
number this mean you reached your bandwidth limit and the stream is
certainly
not working correctly, you should lower resolution, fps or bitrate.

I recommend doing a few tries before you want to stream, to be sure
it's ok.
Note that the flag `-a` may be be required in case of audio/video
desynchronization, there is no magic value so you should guess and try.


### Adding webcam

I found an easy trick to add webcam on top of a video game.

    $ mpv --no-config --video-sync=display-vdrop --framedrop=vo --ontop
av://v4l2:/dev/video1

The trick is to use mpv to display your webcam video on your screen and
use the
flag to make it stay on top of any other window (this won't work with
cwm(1)
window manager). Then you can resize it and place it where you want.
What you
see is what get streamed.

The others mpv flags are to reduce lag between the webcam video stream
and the
display, mpv slowly get a delay and after 10 minutes, your webcam will
be
lagging by like 10 seconds and will be totally out of sync between the
action
and your face.

Don't forget to use chown to change the ownership of your video device
to your
user, by default only root has access to video devices. This is reset
upon
reboot.


### Viewing a stream

For less overhead, people can watch a stream using `mpv` software, I
think this
will require `youtube-dl` package too.

Example to view me streaming:

    $ mpv https://www.twitch.tv/seriphyde

This would also work with a recorded video:

    $ mpv https://www.twitch.tv/videos/447271018