如何使用 Google CardBoard Android SDK 和 Rajawali 制作简单的 VR 视频播放器
Posted
技术标签:
【中文标题】如何使用 Google CardBoard Android SDK 和 Rajawali 制作简单的 VR 视频播放器【英文标题】:How to make a simple VR video player by Google CardBoard Android SDK and Rajawali 【发布时间】:2015-11-30 05:47:20 【问题描述】:我是这些领域的新人。我正在尝试更改 github 中的 program 以现在播放纸板视频。
我使用 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,但是,在我启动我的应用程序后,两侧是空白的,并且实际上正在播放视频的声音。
我需要一些帮助。非常感谢!
【问题讨论】:
你可以试试我的回答***.com/questions/32391282/… 【参考方案1】:我在这样工作的纸板中获得了带有头部跟踪功能的 360 度全景视频。
使用RajawaliVRRenderer 扩展您的课程
public class YoureVideoClass extends 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();
最后但并非最不重要的一点是,您要更新相机以跟踪纸板的运动,如下所示:
@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);
【讨论】:
非常感谢!您给出了如此详细的解决方案。我之前用link 实现了它。你的回答应该对我也很有帮助。以上是关于如何使用 Google CardBoard Android SDK 和 Rajawali 制作简单的 VR 视频播放器的主要内容,如果未能解决你的问题,请参考以下文章
Sphere 未在 Unity 中为 Google Cardboard 渲染
Google Cardboard - Cardboard VR 套件是不是有 iPhone / iOS 入门项目?
错误膨胀类 com.google.vrtoolkit.cardboard.CardboardView 崩溃应用程序