How to make a simple VR video player using the Google CardBoard Android SDK and Rajawali

I am a new person in this field. I am trying to change a program on github to now play video for cardboard.

I changed MyRenderer using StreamingTexture.

public class MyRenderer extends RajawaliCardboardRenderer { public MyRenderer(Context context) { super(context); } private MediaPlayer mMediaPlayer; private StreamingTexture streamingTexture; @Override protected void initScene() { mMediaPlayer = MediaPlayer.create(this.getContext(), R.raw.test); streamingTexture = new StreamingTexture("video", mMediaPlayer); Sphere sphere = createPhotoSphereWithTexture(streamingTexture); getCurrentScene().addChild(sphere); getCurrentCamera().setPosition(Vector3.ZERO); getCurrentCamera().setFieldOfView(75); } private static Sphere createPhotoSphereWithTexture(ATexture texture) { Material material = new Material(); material.setColor(0); try { material.addTexture(texture); } catch (ATexture.TextureException e) { throw new RuntimeException(e); } Sphere sphere = new Sphere(50, 64, 32); sphere.setScaleX(-1); sphere.setMaterial(material); return sphere; } } 

I saved my short video as test.mp4 in the source folder, however, after I started my application, both sides are empty and the video actually plays.

I need help. Thank you very much!

+6
source share
1 answer

I got 360 head tracking videos in a cardboard machine that works like this.

Extend your class using RajawaliVRRenderer

 public class YoureVideoClass extends RajawaliVRRenderer { 

then use the following initScene ():

  @Override public void initScene() { // setup sphere Sphere sphere = new Sphere(1, 100, 100); sphere.setPosition(0, 0, 0); // invert the sphere normals // factor "1" is two small and result in rendering glitches sphere.setScaleX(100); sphere.setScaleY(100); sphere.setScaleZ(-100); //initiate MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setLooping(true); try { Uri videoUrl = Uri.parse("android.resource://" + getContext().getPackageName() + "/" + R.raw.test); mediaPlayer.setDataSource(getContext(),Uri.parse(videoUrl)); mediaPlayer.prepareAsync(); //prepare the player (asynchronous) mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); //start the player only when it is prepared } }); } catch (IOException e) { e.printStackTrace(); } // create texture from media player video videoTexture = new StreamingTexture("video", mediaPlayer); // set material with video texture Material material = new Material(); material.setColorInfluence(0f); try { material.addTexture(videoTexture); } catch (ATexture.TextureException e){ throw new RuntimeException(e); } sphere.setMaterial(material); // add sphere to scene getCurrentScene().addChild(sphere); super.initScene(); } 

After starting the scene, you want to update the video text on each render, so add:

 @Override public void onRender(long elapsedRealTime, double deltaTime) { super.onRender(elapsedRealTime, deltaTime); if (videoTexture != null) { // update texture from video content videoTexture.update(); } } 

Last but not least, you want to update your camera to track movement for cardboard as follows:

 @Override public void onDrawEye(Eye eye) { // Rajawali camera org.rajawali3d.cameras.Camera currentCamera = getCurrentCamera(); // cardboard field of view FieldOfView fov = eye.getFov(); // update Rajawali camera from cardboard sdk currentCamera.updatePerspective(fov.getLeft(), fov.getRight(), fov.getBottom(), fov.getTop()); eyeMatrix.setAll(eye.getEyeView()); // orientation eyeOrientation.fromMatrix(eyeMatrix); currentCamera.setOrientation(eyeOrientation); // position eyePosition = eyeMatrix.getTranslation().inverse(); currentCamera.setPosition(eyePosition); // render with Rajawali super.onRenderFrame(null); } 

In addition, in order to transfer some other listeners to sdk cardboard, you will need the following functions:

 @Override public void onSurfaceChanged(int width, int height) { // tell Rajawali that cardboard sdk detected a size change super.onRenderSurfaceSizeChanged(null, width, height); } @Override public void onSurfaceCreated(EGLConfig eglConfig) { // pass opengl config to Rajawali super.onRenderSurfaceCreated(eglConfig, null, -1, -1); } @Override public void onRenderSurfaceDestroyed(SurfaceTexture surface) { super.onRenderSurfaceDestroyed(surface); } 
+5
source

All Articles