2015-09-04 25 views
6

Sono un nuovo uomo in quest'area. Sto cercando di cambiare un program in github per riprodurre i video per il cartone ora.Come creare un semplice riproduttore video VR con Google CardBoard Android SDK e Rajawali

Ho modificato il MyRenderer utilizzando 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; 
} 
} 

ho salvato il mio breve video come test.mp4 nella cartella grezzo, tuttavia, dopo comincio la mia app le due parti sono vuoti, e il suono del video sia in riproduzione.

Ho bisogno di aiuto. Grazie mille!

+0

si può provare la mia risposta http: // stackoverflow.com/questions/32391282/how-to-use-rajawalivr-or-rajawali-to-play-a-360-video –

risposta

5

Ho ottenuto un video a 360 con tracciamento della testa in un pannello di carena che funziona in questo modo.

Estendere la classe utilizzando RajawaliVRRenderer

successivo utilizzo il seguente 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(); 
} 

Dopo l'inizio della scena che si desidera aggiornare il videoTexture su ogni rendering, in modo da aggiungere:

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

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

E ultimo ma non meno importante si desidera aggiornare il venuto ra per il movimento di monitoraggio per il cartone come questo:

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

Inoltre, per passare alcuni altri ascoltatori con ansia il cartone SDK avrete bisogno di queste funzioni:

@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

Grazie mille! Hai mostrato una soluzione così dettagliata. L'ho implementato con [link] (http://stackoverflow.com/questions/32391282/how-to-use-rajawalivr-or-rajawali-to-play-a-360-video) prima. La tua risposta dovrebbe anche essere molto utile per me. – Dobbie

Problemi correlati