java - Android(Java 不是 C/C++)插件可以改变统一纹理吗?

标签 java android unity3d android-mediaplayer

我正在尝试使用 Android 插件来解决 Unity 在移动设备上不支持视频纹理这一事实。为此,我获取将用于视频的纹理 ID(由 Texture2D.GetNativeTextureID() 提供),然后将其传递给 Java 插件。

插件然后按照标准的 MediaPlayer 实现将视频播放到表面纹理中,该表面纹理已分配了上述纹理 ID。

当我调用 MediaPlayer.Start() 方法时,LogCat 的输出就像媒体播放器正常工作/如所希望的那样,但是应用程序中的纹理永远不会改变。我从 monobehaviour 脚本的 OnPreRender() 方法调用插件(甚至初始化它),同时确保也调用 GL.InvalidateState()

下面看一下相关代码:

构造函数:

public VideoPlayer(String _path, Context _cont) {
    m_MediaPlayer = new MediaPlayer();
    try {
        Uri uri = Uri.parse(_path);
        m_MediaPlayer.setDataSource(_cont, uri);
        m_MediaPlayer.setOnPreparedListener(this);
    }
    catch (IOException e) {
        Log.e(TAG, "Error setting data source: " + e.getMessage());
    }
}

表面纹理准备:

public void PrepareVideo(int _texPtr) {
    try {
        m_SurfTex = new SurfaceTexture(_texPtr);
        m_SurfTex.setOnFrameAvailableListener(this);
        Log.i(TAG, "Surface Texture ready");
        Surface surface = new Surface(m_SurfTex);
        m_MediaPlayer.setSurface(surface);
        Log.i(TAG, "Surface Ready");
        surface.release();
        m_Ready = true;
        m_MediaPlayer.prepare();
    }
    catch (IOException | IllegalStateException e) {
        Log.e(TAG, "Error preparing player: " + e.getMessage());
        m_Ready = false;
    }
}

我想知道这种类型的过程是否可以通过我当前的设置实现,还是必须考虑使用 NDK 来编写一些东西?具体来说,表面纹理可以改变 Unity 中生成的纹理吗?

最佳答案

您是否尝试过在统一渲染线程中创建表面纹理,例如通过在扩展的 UnityPlayer 中覆盖 runglthreadsjobs?这将确保它绑定(bind)到正确的 glcontext AFAIK。

我尝试过共享上下文,但由于文档稀少且 unity 相当封闭,因此无法正常工作。

在 unity 4.2 中显然更容易。

关于java - Android(Java 不是 C/C++)插件可以改变统一纹理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806718/

相关文章:

java - Android 将数据从 Activity 类传递到类

java - 在 Java 中接受文件路径和 URL

java - 在 Java 中从 Locale 创建 Locale.LanguageRange 的标准方法

android - 为什么由于注释而无法在 onCreate() 中添加方法?

java - Libgdx 近战攻击碰撞检测

android - 如何一步步使用ndk-stack?

java - 用逗号分隔BigInteger结果

c# - 如何检测 UI 和 GameObjects 上的点击/触摸事件

c# - 在 Unity 中设置 transform.up 时会发生什么

c# - 如何在 ios unity 后台运行代码