mirror of
https://github.com/LizardByte/Sunshine.git
synced 2024-12-29 12:16:08 +00:00
Self-hosted game stream host for Moonlight.
cppdockergame-streamgame-streaminggame-streaming-servergeforce-experiencehomebrew-pkgmoonlightpacman-pkgpythonremote-desktopreplicator-release-notificationsrtdwinget-pkg
assets | ||
moonlight-common-c@cfeb0ffd90 | ||
Simple-Web-Server@f37a41d48b | ||
sunshine | ||
tools | ||
ViGEmClient@52682b59c4 | ||
.gitignore | ||
.gitmodules | ||
appveyor.yml | ||
CMakeLists.txt | ||
FindFFmpeg.cmake | ||
gen-deb.in | ||
LICENSE | ||
README.md | ||
sunshine.service.in | ||
toolchain-mingw64.cmake |
Introduction
Sunshine is a Gamestream host for Moonlight
Building
Linux
Requirements:
Ubuntu 20.04:
sudo apt install cmake libssl-dev libavdevice-dev libboost-thread-dev libboost-filesystem-dev libboost-log-dev libpulse-dev libopus-dev libxtst-dev libx11-dev libxfixes-dev libevdev-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev
Compilation:
git clone https://github.com/loki-47-6F-64/sunshine.git --recurse-submodules
cd sunshine && mkdir build && cd build
cmake ..
make
: It is suggested to use the-j C#
flags with this command,C#
being the number of cores your PC has
Setup:
sunshine needs access to uinput to create mouse and gamepad events:
-
Add user to group 'input': "usermod -a -G input username
-
Create a file: "/etc/udev/rules.d/85-sunshine-input.rules"
-
The contents of the file is as follows: KERNEL=="uinput", GROUP="input", mode="0660"
-
assets/sunshine.conf is an example configuration file. Modify it as you see fit and use it by running: "sunshine path/to/sunshine.conf"
-
path/to/build/dir/sunshine.service is used to start sunshine in the background:
cp sunshine.service $HOME/.config/systemd/user/
- Modify $HOME/.config/systemd/user/sunshine.conf to point to the sunshine executable
systemctl --user start sunshine
-
assets/apps.json is an example of a list of applications that are started just before running a stream
Trouleshooting:
* If you get "Could not create Sunshine Gamepad: Permission Denied", ensure you are part of the group "input":
* groups
* If Sunshine sends audio from the microphone instead of the speaker, try the following steps:
* pacmd list-sources | grep "name:"
* Copy the name to the configuration option "audio_sink"
* restart sunshine
Windows 10
Requirements:
mingw-w64-x86_64-openssl mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-opus mingw-w64-x86_64-x265 mingw-w64-x86_64-boost git yasm nasm diffutils make
Compilation:
git clone https://github.com/loki-47-6F-64/sunshine.git --recursive
cd sunshine && mkdir build && cd build
cmake -G"Unix Makefiles" ..
make
Setup:
- OPTIONAL Gamepad support: Download and run 'ViGEmBus_Setup_1.16.116.exe' from [https://github.com/ViGEm/ViGEmBus/releases]
Common
Usage:
- run "sunshine path/to/sunshine.conf"
- In Moonlight: Add PC manually
- When Moonlight request you insert the correct pin on sunshine, either:
- Type in the URL bar of your browser:
xxx.xxx.xxx.xxx:47989/pin/####
wget xxx.xxx.xxx.xxx:47989/pin/####
- The x's are the IP of your instance,
####
is the pin
- The x's are the IP of your instance,
- Type in the URL bar of your browser:
- Click on one of the Applications listed
- Have fun :)
Note:
- The Windows key is not passed through by Moonlight, therefore Sunshine maps Right-Alt key to the Windows key
- If you set Video Bitrate to 0.5Mb/s:
- Sunshine will use CRF or QP to controll the quality of the stream. (See example configuration file for more details)
- This is less CPU intensive and it has lower average bandwith requirements compared to manually setting bitrate to acceptable quality
- However, it has higher peak bitrates, forcing Sunshine to drop entire frames when streaming 1080P due to their size.
- When this happens, the video portion of the stream appears to be frozen.
- This is rare enough that using this for the desktop environment is tolerable (in my opinion), however for gaming not so much.
Credits:
- Simple-Web-Server
- Moonlight
- Looking-Glass (For showing me how to properly capture frames on Windows, saving me a lot of time :)
Application List:
- You can use Environment variables in place of values
- $(HOME) will be replaced by the value of $HOME
-
will be replaced by $ -->
- env: Adds or overwrites Environment variables for the commands/applications run by Sunshine.
- "Variable name":"Variable value"
- apps: The list of applications
- Example:
{ "name":"An App", "cmd":"command to open app", "prep-cmd":[ { "do":"somecommand", "undo":"undothatcommand" } ] }
- name: Self explanatory
- output : The file where the output of the command is stored
- If it is not specified, the output is ignored
- prep-cmd: A list of commands to be run before/after the application
- If any of the prep-commands fail, starting the application is aborted
- do: Run before the application
- If it fails, all 'undo' commands of the previously succeeded 'do' commands are run
- undo : Run after the application has terminated
- This should not fail considering it is supposed to undo the 'do' commands.
- If it fails, Sunshine is terminated
- cmd : The main application
- If not specified, a processs is started that sleeps indefinitely
- When an application is started, if there is an application already running, it will be terminated.
- When the application has been shutdown, the stream shuts down as well.
- In addition to the apps listed, one app "Desktop" is hardcoded into Sunshine. It does not start an application, instead it simply starts a stream.
Linux
{
"env":{
"DISPLAY":":0",
"DRI_PRIME":"1",
"XAUTHORITY":"$(HOME)/.Xauthority",
"PATH":"$(PATH):$(HOME)/.local/bin"
},
"apps":[
{
"name":"Low Res Desktop",
"prep-cmd":[
{ "do":"xrandr --output HDMI-1 --mode 1920x1080", "undo":"xrandr --output HDMI-1 --mode 1920x1200" }
]
},
{
"name":"Steam BigPicture",
"output":"steam.txt",
"cmd":"steam -bigpicture",
"prep-cmd":[]
}
]
}
Windows
{
"env":{
"PATH":"$(PATH);C:\\Program Files (x86)\\Steam"
},
"apps":[
{
"name":"Steam BigPicture",
"output":"steam.txt",
"prep-cmd":[
{"do":"steam \"steam://open/bigpicture\""}
]
}
]
}