我正在尝试使用 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/