如何使用 Google CardBoard Android SDK 和 Rajawali 制作一个简单的 VR 视频播放器

2023-12-23

我是这些领域的新人。我正在尝试改变一个program https://github.com/ejeinc/RajawaliCardboardExample现在在 github 中播放 Cardboard 视频。

我使用 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 在原始文件夹中,但是,在我启动我的应用程序后,两侧都是空白的,并且视频的声音实际上正在播放。

我需要一些帮助。非常感谢!


我在纸板中获得了带有头部跟踪功能的 360 度视频,就像这样工作。

使用扩展你的课程RajawaliVR渲染器 https://github.com/Rajawali/RajawaliVR

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

启动场景后,您希望在每次渲染时更新视频纹理,因此添加:

@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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Google CardBoard Android SDK 和 Rajawali 制作一个简单的 VR 视频播放器 的相关文章

  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • TypedArray 的 getResourceId 方法

    我正在阅读有关的文档获取资源Id https developer android com reference android content res TypedArray html getResourceId int 20int 方法 它说
  • v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()

    运行我的 recyclerview 列表片段时出现此错误 java lang NullPointerException Attempt to invoke virtual method java lang Object android su
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 如何在 Android 中使用 Assets 中预加载的 SQLite 数据库

    我想用preloaded database在我的应用程序中意味着尝试在安装 apk 时获取数据库 以便可以使用已保存在其中的数据 我复制了 成分 db 文件位于资产文件夹中 并使用以下代码 但这会出现错误 从资源文件复制数据库时出现问题 我
  • Firebase 数据库快速入门处理计数的方式安全吗?

    我想为文章点赞创建一个增量字段 我指的是这个链接 https firebase google com docs database android save data save data as transactions https fireb
  • 将正确的上下文传递给 greendao 的 OpenHelper 构造函数

    如果我理解正确的话 在使用数据库时 我必须执行以下操作 DaoMaster OpenHelper helper new DaoMaster OpenHelper this test db null Override public void
  • FileNotFoundException:/存储/模拟/0/Android

    我尝试这个文件写入器 读取器代码段进行测试 File file new File Environment getExternalStorageDirectory LM lm lisdat 01 txt FileOutputStream ou
  • 如何从一个代码库创建多个 Android 应用

    我有一个 Android 代码库 它使用带有设置的 API 来获取多个应用程序的不同数据 所有应用程序都使用相同的代码库 但进行一两个设计调整 那么如何重用主代码库而不必每次都复制整个 Android 项目呢 iPhone 在同一个项目中使
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 尝试在模拟器上安装第二个 flutter 应用程序时出错

    我创建了一个简单的 flutter 应用程序并在 android 模拟器上运行它 效果还不错 现在我创建了另一个 当我尝试在模拟器上运行它时 我得到 Error ADB exited with exit code 1 adb failed
  • finish() 完成活动但它仍然在后台

    我有一个关于 android studio 中活动的 finish 方法的问题 我有这个简单的代码 public class MainActivity extends AppCompatActivity Override protected
  • 如何在进入新活动之前终止线程和处理程序

    大家好 在我尝试清理处理程序时 这段代码可能有点混乱 因为我一直在尝试追踪崩溃发生的位置 我有一个对话框活动 显示密码输入 进度条由线程和处理程序动画显示 似乎当我试图查看进度条是否完成并尝试终止线程时 当我尝试进入新活动时 我这样做的方式
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐