arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
105 lines (80 loc) • 5.73 kB
Markdown
Twitch.tv is one of the more popular [RTMP](https://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol "wikipedia:Real Time Messaging Protocol") based streaming services offered. As [Steam](/index.php/Steam "Steam") has a Linux client available, some people may be in search of solutions to stream their games or Linux desktop. The info included here should serve as a list of such solutions.
## Contents
* [1 Twitch streaming Guidelines](#Twitch_streaming_Guidelines)
* [2 GUI solutions](#GUI_solutions)
* [3 Ffmpeg solutions](#Ffmpeg_solutions)
* [3.1 .bashrc script method](#.bashrc_script_method)
## Twitch streaming Guidelines
*From* [Twitch.tv support](http://help.twitch.tv/customer/portal/articles/1253460-broadcast-requirements):
**Video Requirements**
* Codec: H.264 (x264)
* Mode: Strict CBR
* Keyframe Interval: 2 seconds
**Audio Requirements**
* Codec: AAC-LC or MP3, Stereo or Mono
* Maximum bit rate: 160 kbps (AAC), 128 kbps (MP3)
* Sampling frequency: any (AAC), 44.1 KHz (MP3)
**Other Requirements**
Not listed on their page is a requirement of the [Y'UV420p pixel format](https://en.wikipedia.org/wiki/YUV#Y.27UV420p_.28and_Y.27V12_or_YV12.29_to_RGB888_conversion "wikipedia:YUV"), as Y'UV444 is not widely supported just yet.
## GUI solutions
* Open Broadcaster Software ([obs-studio](https://www.archlinux.org/packages/?name=obs-studio)) is a popularly used streaming program that is now available in the community repo. Alpha Linux builds ([obs-studio-git](https://aur.archlinux.org/packages/obs-studio-git/) from the [AUR](/index.php/AUR "AUR")) are also available for compiling & testing.
* Castawesome ([castawesome](https://aur.archlinux.org/packages/castawesome/) from the [AUR](/index.php/AUR "AUR")) is a Gtk3 frontend for ffmpeg streaming with builtin Twitch.tv support.
* SimpleScreenRecorder ([lib32-simplescreenrecorder](https://www.archlinux.org/packages/?name=lib32-simplescreenrecorder) from the [official repositories](/index.php/Official_repositories "Official repositories")) can be configured to stream to twitch.
* For this to work:
* The container needs to be set to FLV
* RTMP URL needs to be put in the 'save as' field
* make sure 'separeate file per segment' is unchecked
* video codec set to libx264 (NOT H.264)
* set bitrate to reasonable value, such as 2000 kbps
* in the custom option field, enter `preset=fast,minrate=2000,maxrate=2000,bufsize=2000,keyint=60`
* Note: The value of 'minrate', 'maxrate' and 'bufsize' should be equal to the bit rate
## Ffmpeg solutions
These solutions revolve around making use of the [FFmpeg](/index.php/FFmpeg "FFmpeg") package:
### .bashrc script method
One method of streaming to twitch using FFMPEG makes use of a simple script that is placed in a user's ~/.bashrc file. this script supports streaming of both desktop and OpenGL elements.
* Depending on your internet upload speed, you may need to modify the Ffmpeg parameters. use the breakdown list for reference.
The script can be used by typing
```
streaming streamkeyhere
```
into a terminal. While it is running, use **pavucontrol** to edit sound sources. The .bashrc script is as follows:
```
streaming() {
INRES="1920x1080" # input resolution
OUTRES="1920x1080" # output resolution
FPS="15" # target FPS
GOP="30" # i-frame interval, should be double of FPS,
GOPMIN="15" # min i-frame interval, should be equal to fps,
THREADS="2" # max 6
CBR="1000k" # constant bitrate (should be between 1000k - 3000k)
QUALITY="ultrafast" # one of the many FFMPEG preset
AUDIO_RATE="44100"
STREAM_KEY="$1" # use the terminal command Streaming streamkeyhere to stream your video to twitch or justin
SERVER="live-fra" # twitch server in frankfurt, see [http://bashtech.net/twitch/ingest.php](http://bashtech.net/twitch/ingest.php) for list
ffmpeg -f x11grab -s "$INRES" -r "$FPS" -i :0.0 -f alsa -i pulse -f flv -ac 2 -ar $AUDIO_RATE \
-vcodec libx264 -g $GOP -keyint_min $GOPMIN -b:v $CBR -minrate $CBR -maxrate $CBR -pix_fmt yuv420p\
-s $OUTRES -preset $QUALITY -tune film -acodec libmp3lame -threads $THREADS -strict normal \
-bufsize $CBR "rtmp://$SERVER.twitch.tv/app/$STREAM_KEY"
}
```
<caption>**Ffmpeg Parameter breakdown**</caption>
| Parameter | Description |
| ffmpeg | The converter |
| -f x11grab | -f forces input to be from x11grab |
| -s $INRES | -s sets a specific image size, relying on the variable $INRES |
| -r $FPS | -r sets framerate to be the value equal to $FPS |
| -i :0.0 | -i gets input, in this case its pulling in screen :0.0 from x11\. Can be adjusted, e.g. -i :0.0+500,100 to start at screenpos 500/100 |
| -b:v $CBR | -b:v specifies that the video bitrate is to be changed. the value of the bitrate is set by $CBR |
| -ab 96k | -ab sets audio bitrate to 96k. **-b:a** is the alternate form of this command |
| -f alsa | forces input(?) to be from alsa |
| -ac 2 | sets audio channels to 2 |
| -i pulse | gets input from pulse |
| -vcodec libx264 | sets video codec to libx264 |
| -crf 23 | sets the ffmpeg constant rate factor to 23 |
| -preset "$QUAL" | sets the preset compression quality and speed |
| -s "1280x720" | specifies size of image to be 720p |
| -acodec libmp3lame | sets audio codec to use libmp3lame |
| -ar 44100 | sets audio rate to 44100 hz |
| -threads 0 | sets cpu threads to start, 0 autostarts threads based on cpu cores |
| -pix_fmt yuv420p | sets pixel format to Y'UV420p. Otherwise by default Y'UV444 is used and is incompatible with twitch |
| -f flv "$URL" | forces format to flv, and outputs to the twitch RTMP url |