This year saw a flurry of new virtual reality headsets aimed at delivering a 3D experience. Among these are the Oculus Rift, and Project Morpheus by Sony which are primarily aimed at giving an immersive 3d games experience. These are still in their testing phases, but headsets designed to deliver a true IMAX cinema experience are already around, like the Head-Mounted Display (also by Sony).
The current drawback of theses displays is that they are either not available yet (except as prototypes or development kits) or they are rather expensive (Sony’s head-mounted display costs at least £1000)
Stereoscopic video – how it works
Before we get to the core of our topic its worthwhile recapping the principles behind these devices. All the above devices work by sending to each eye separate images which they would respectively see if viewing the actual object in front of their field of vision.
The subtle difference in these two images is what gives the illusion of depth of field to your brain.
Stereoscopic vision and the IMAX experience
Note that as the object moves further away, the left and right images become the same. This is how we are able to reproduce the sensation of a large cinema screen using stereoscopic vision – even for 2D films: if each eye sees the same copy of the film, then the viewer will have the sensation of seeing a very large screen very far away – just like in a cinema
Putting it all together
step 1: the headset
So how do we get to use our smartphones give us the IMAX experience on the cheap?
The first thing that is required is of course … your smartphone, and a cheap VR headset which contain a lens for each eye and uses your smartphone as the screen itself. The idea was launched by google itself in their recent conference by presenting a makeshift headset made with cardboard, a couple of lenses and an NFC tag that can be programmed to control the phone without accessing it directly.
Other smartphone VR headsets have come out since, and given their simple construction (a plastic case and a couple of lenses), can be found at around £30 including shipping.
Step 2: install the client apps
OK – so how do we get to stream your films stored on your PLEX server to your new IMAX capable device? You will need a media player app which will render TWO identical images of your movie side by side. Unfortunately the PLEX client app does not (yet?) have an option to do this, so instead we will use the DLNA feature built into the PLEX server to deliver a video stream to your android device. There are a few steps you need to follow in order to get this working:
1) install a DLNA client on your phone from the google play store. I suggest using BubbleUPnP
2) install the Side-By-Side Video Player, also available on google play store.
Step 3: configure the DLNA on your PLEX server and get it to transcode your movies on the fly.
Firstly you must ensure the DLNA option is activated in your PLEX server (under options->server->DLNA, tick the “DLNA enabled” box).
You should now already be able to select and play SOME (but not all) of your plex movies from BubbleUPnP (make sure you select the Side-By-Side Video Player as the rendered when asked)
HOWEVER this will probably not work with most of your movies, as I am guessing many of them will be encoded in a container that the Side-By-Side Video Player app does not parse correctly. In particular you will find that either the video does not work at all, or the video works, but you get no sound because the audio in your media file is a DTS stream, which again the Side-By-Side Video Player cannot parse.
The solution to this is to instruct the PLEX DLNA server to transcode videos into a format that the video engine inbuilt into android (called “stagefright”) can parse correctly. This is the underlying media engine used by many video apps in android, like Side-By-Side, and, of course the “Gallery” app available as standard on android.
The transcoding of the DLNA server is governed by a set of XML files located in the directory plexmediaserver/Resources/Profiles (at least on my freenas box – this could be different on other machines. see this post for details https://forums.plex….-dlna-devices/)
This directory contains a set of xml files describing the “DLNA client profiles” that the plex server should know about, plus a “catch all” one called Generic.xml which tells plex what transcoding (if any) to do in case the DLNA profile for this client device is not present in this directory.
As standard, this file contains no instructions:
<?xml version="1.0" encoding="utf-8"?> <Client name="Generic" />
which means that by default the PLEX server will deliver the media stream without any transcoding.
The easiest way to do this is to change the Generic.xml to the following
<?xml version="1.0" encoding="utf-8"?> <Client name="Generic"> <!-- Author: Plex Inc. --> <TranscodeTargets> <VideoProfile protocol="hls" container="mpegts" codec="h264" audioCodec="aac" context="streaming"> <Setting name="VideoEncodeFlags" value="-x264opts cabac=0" /> <Setting name="SubtitleSize" value="100" /> </VideoProfile> <VideoProfile protocol="dash" container="mp4" codec="h264" audioCodec="aac" context="streaming"> <Setting name="VideoEncodeFlags" value="-x264opts cabac=0" /> </VideoProfile> <VideoProfile container="mpegts" codec="h264" audioCodec="aac" context="all"> <Setting name="VideoEncodeFlags" value="-x264opts cabac=0" /> </VideoProfile> <MusicProfile container="mp3" codec="mp3" /> <PhotoProfile container="jpeg" /> </TranscodeTargets> <DirectPlayProfiles> <VideoProfile container="mp4" codec="h264,mpeg4" audioCodec="aac" /> <MusicProfile container="mp4" codec="aac" /> <MusicProfile container="mp3" codec="mp3" /> <MusicProfile container="flac" codec="flac" /> <MusicProfile container="ogg" codec="vorbis" /> <PhotoProfile container="jpeg,gif,bmp,png" /> </DirectPlayProfiles> <ContainerProfiles> <VideoContainer name="mp4"> <Limitations> <Match name="part.optimizedForStreaming" value="1" /> </Limitations> </VideoContainer> </ContainerProfiles> <CodecProfiles> <VideoCodec name="*"> <Limitations> <UpperBound name="video.width" value="1920" /> <UpperBound name="video.height" value="1080" /> <NotMatch name="video.anamorphic" value="1" isRequired="false" /> <NotMatch name="video.hasScalingMatrix" value="1" isRequired="false" /> <UpperBound name="video.bitDepth" value="8" isRequired="false" /> </Limitations> </VideoCodec> <VideoAudioCodec name="aac"> <Limitations> <UpperBound name="audio.channels" value="2" /> </Limitations> </VideoAudioCodec> <MusicCodec name="aac"> <Limitations> <UpperBound name="audio.channels" value="2" /> </Limitations> </MusicCodec> <MusicCodec name="mp3"> <Limitations> <UpperBound name="audio.bitrate" value="320" /> <UpperBound name="audio.channels" value="2" /> </Limitations> </MusicCodec> </CodecProfiles> </Client>
which among other things instructs the plex DLNA server to transcode your media to mpegts/h264/aac(stereo) which “stagefright” understands. Apply these changes to Generic.xml and restart the plex server. And voila! you should be able to enjoy all your movies and TV shows on your system with your google cardboard!