I am a new man in these area. I am trying to change a program in github to play video for cardboard now.
I modified the MyRenderer by 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 raw folder, however , after I start my app the two sides are blank, and the video's sound is actually playing.
I need some help. Thank you very much!
I got 360 video with head tracking in a carboard working like this.
Extend your class using RajawaliVRRenderer
public class YoureVideoClass extends RajawaliVRRenderer {
next 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 initiating the scene you want to update the videoTexture on every 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();
}
}
And last but not least you want to update the camera for movement tracking for the cardboard like this:
@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);
}
Also, to pass some other listeners forward to the carboard sdk you will need these 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);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With