2015-09-04 13 views
6

Ich bin ein neuer Mann in diesem Bereich. Ich versuche, eine program in Github zu ändern, um jetzt Video für Pappe abzuspielen.So erstellen Sie einen einfachen VR-Video-Player von Google Cardboard Android SDK und Rajawali

Ich modifizierte den MyRenderer mit 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; 
} 
} 

gespeichert Ich mein kurzes Video test.mp4 im rohen Ordner aber nachdem ich die beiden Seiten meine app starte leer sind, und das Sound des Videos abgespielt werden tatsächlich.

Ich brauche etwas Hilfe. Vielen Dank!

+0

Sie können meine Antwort http versuchen: // stackoverflow.com/questions/32391282/how-to-use-raajawalivr-or-rajawali-to-play-a-360-video –

Antwort

5

Ich bekam 360 Video mit Head Tracking in einer so arbeitenden Carboard.

Erweitern Sie Ihre Klasse mit RajawaliVRRenderer

nächsten Verwendung der folgenden 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(); 
} 

Nach der Szene Initiieren Sie die videoTexture aktualisieren möchten auf jeden machen, so addieren:

@Override 
public void onRender(long elapsedRealTime, double deltaTime) { 
    super.onRender(elapsedRealTime, deltaTime); 

    if (videoTexture != null) { 
     // update texture from video content 
     videoTexture.update(); 
    } 
} 

Und last but not least wollen Sie das Update kommen ra für Bewegungsverfolgung für den Karton wie folgt aus:

@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); 
} 

, auch einige andere Zuhörer weitergeben uns auf die carboard sdk Sie diese Funktionen benötigen:

@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); 
} 
+0

Vielen Dank! Sie haben eine so detaillierte Lösung gezeigt. Ich habe es zuvor mit [link] (http://stackoverflow.com/questions/32391282/how-to-use-raajawalivr-or-rajawali-to-play-a-360-video) implementiert. Ihre Antwort sollte mir auch sehr hilfreich sein. – Dobbie

Verwandte Themen