Often when I find myself playing a game in VR and I wish I could share the
experience with friends.
Whether that be through [Twitch](https://twitch.tv/DJRThree) or via a Discord
VOIP channel, I really want to show just how cool playing games in VR is. Plus,
streaming to a Discord channel gives you the same experience Oculus intended
with their phone app for streaming content to family members, just better and
over the Internet. I almost always play PCVR games on my Quest using the Oculus
Link, so this tutorial / walkthrough / FAQ will focus on how I set up OBS to
capture, record and stream PCVR video and audio for first-person shooters. The
walkthrough is transferable to many other games, but FPS games present a
pain-point for VR streamers, most notably that many games default to a dominant
left-eye view as opposed to a dominant right-eye view with no option to change!
I'll show you how to fix these issues and record beautiful gameplay in VR!
Capturing a game of Stride with correct ADS
First, I assume you have the Oculus software on your PC. I know it's shitty
software and it works maybe half the time but you need it to play Link games
so... no way around it!
Next you're going to open a window which will mirror your Oculus headset's view.
You'll need to press `CTRL+R` and type `C:\Program
Files\Oculus\Support\oculus-diagnostics\OculusMirror.exe` and click run.
Obviously if your Oculus install path is different from this tune the command
accordingly. Now a window should be opened which displays a rectilinear view of
everything being fed into your Oculus headset. There are a number of parameters
you can specify to this command which will modify the displayed window. These
are:
```
--LeftEyeOnly Display left eye image in rectilinear view
--RightEyeOnly Display right eye image in rectilinear view
--RectilinearBothEyes Display both eye images in rectilinear view
--SymmetricFov Force rectilinear output to symmetric FOV
--DisableTimewarp Disable timewarp to avoid black pull-in
--FovTanAngleMultiplier [x y] Override all render FOVs (prefer < 2)
--DisableFovStencil Force disable FOV Stencil for all apps
--NativeResolution Lock window size to 1:1 resolution (rectilinear or post-distortion except in fullscreen)
--FullScreen [resolutionScale] Fullscreen on main monitor. Ignores 'Size'. Smaller scale values can help performance.
--PostDistortion Display both eye images corrected for lens distortion and timewarp.
--IncludeGuardian Show Guardian boundary layer
--IncludeNotifications Show Oculus notifications
--IncludeSystemGui Show Oculus System GUI.
--Size [width height] Set window size using width & height
--Screenshot [filename] Save a PNG screenshot using file name
--FlashFrameDrops Flash on Oculus Compositor frame drops.
```
... you can also adjust these by playing around with them in the window's
"Settings" tab, though I prefer to create a batch script with these parameters
for consistency's sake.
For FPS games you should adjust the command to use either `--LeftEyeOnly` or
`--RightEyeOnly` depending on your dominant eye. This way your screen capture
will look more cohesive when you aim down sights. For example, when I play
Onward or Contractors VR I set this to `--RightEyeOnly` because I close my left
eye when I aim down sights. This helps viewers to understand where you are
aiming, and is necessary for many FPS as some games do not have an option to
change the dominant eye like you can with the mirror (tragic!)
Shooting people in Onward featuring accurate ADS
### Watching your Twitch Chat in VR with XSOverlay
Interacting with your streaming audience is a key ingredient for a successful
stream. To ensure I can read my chat while I'm in VR I use a software called
[XSOverlay](https://store.steampowered.com/app/1173510/XSOverlay/). It allows me
to pin windows to my hands or to the virtual world, letting me see a few
selected windows on my desktop at a time. I use Twitch's pop-out chat feature to
break out the chat window so I can capture and render that using XSOverlay
without much other clutter; I also often put the activity feed next to it so I
can monitor incoming follows, subs, and raids.
Twitch's Popout Chat feature is very handy for this
One feature I use often in XSOverlay is the "auto-hide" feature. This makes it
so the selected window is invisible when I am not looking directly at my wrist,
which is a big help in FPS games where the window could otherwise obscure my
viewport. You can choose which settings to toggle for each window by going into
the window's settings in XSOverlay by hovering over it.
Checking chat / activity / clock using XSOverlay
Finally you can use capture / streaming software like OBS to record this
mirrored window and add chat overlays to your final product. I prefer to keep
clutter to a minimum (especially for FPS), which means adding a rolling chatbox
(messages disappear after 15 seconds) and adding alerts for important events in
a small corner of the screen. For other games which expose rich textual data
you could add text overlays which aggregate this real-time data (e.g. kills /
deaths, score etc.) though I don't know of many games other than [BeatSaber with
HTTP Status](https://github.com/opl-/beatsaber-http-status) which do this.
### OBS Settings
If you have an NVIDIA card I'd recommend using NVENC as the encoder, as
this frees your CPU from needing to perform the heavy-lifting demanded by
encoding a stream at 60 fps in a decent resolution. Though this is a very good
place to start you will definitely need to tweak many more settings to get the
encoding quality *just right*.
Below are the settings I use for OBS; adjust these values according to your
computer's capacity. For the record, these settings produce the best quality I
can eek out of my GTX1070. Also, keep in mind that you will be sending this
video through your ISP, so ensure your uplink can keep up with around 5Mbps for
the below settings, otherwise adjust the bitrate until it fits within your
uplink capacity.
Encoder
NVENC
Resolution
1536 x 864 (16:9)
Framerate
60 fps
Bitrate
5000kbps (constant bitrate)
Downscale filter
Lanczos (36 samples)
You may need to toggle advanced settings to see all these prompts in the OBS
dialogue box. *Note*: 1536 x 864 is still a 16:9 aspect ratio (which is an ideal
ratio for streaming) but the lower resolution here is necessary for high motion
content which may be at-risk for artifacting. With rapid head movements in VR,
I'd highly recommend streaming at a similar resolution, as the encoding
deadlines coupled with a high resolution may result in blocky artifacts in the
final product.
Capture from my stream of Onward
### FAQ / Problems and Solutions
Q: When I listen back to my stream, the audio from the Quest sounds "crackly"...
why?
A: Oculus Link was in beta until very recently. If you have not upgraded the
Link software then I'd recommend doing so, this has fixed a number of bugs I've
encountered such as crackling audio, microphone issues, etc. etc.
Q: How can I overlay chat on top of my Twitch stream?
A: [Streamlabs widgets](https://streamlabs.com/widgets) captured via an OBS
browser source.