2015-09-04 49 views
6

我是這些領域的新人。我正在嘗試在github中更改program以播放硬紙板視頻。如何通過Google CardBoard Android SDK和Rajawali製作簡單的VR視頻播放器

我使用StreamingTexture修改了MyRenderer。

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

我救了我的短視頻作爲test.mp4在原始文件夾,但是,當我開始我的應用程序,雙方都是空白,而視頻的聲音確實正在播放。

我需要一些幫助。非常感謝你!

+0

你可以試試我的答案的http:// stackoverflow.com/questions/32391282/how-to-use-rajawalivr-or-rajawali-to-play-a-360-video –

回答

5

我在這樣的Carboard中獲得了帶有頭部跟蹤的360視頻。

擴展使用RajawaliVRRenderer

下次使用以下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(); 
} 

啓動現場後要更新videoTexture上每一個渲染,所以加:

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

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

最後但並非最不重要的你想更新來RA的運動跟蹤的紙板像這樣:

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

此外,爲了直傳其他一些聽衆給carboard SDK,你需要這些功能:

@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

非常感謝!你已經展示了這樣一個詳細的解決方案。我已經使用[link](http://stackoverflow.com/questions/32391282/how-to-use-rajawalivr-or-rajawali-to-play-a-360-video)來實現它。你的回答對我也應該很有幫助。 – Dobbie

相關問題