gpt4 book ai didi

android - SurfaceTexture updateTexImage to shared 2 EGLContexts - Android 4.4 上的问题

转载 作者:搜寻专家 更新时间:2023-11-01 08:01:45 25 4
gpt4 key购买 nike

我指的是如何将相机的预览帧直接编码为 mp4 文件的优秀示例: http://bigflake.com/mediacodec/CameraToMpegTest.java.txt

我采用了代码的方式,我也想在屏幕上呈现预览图像。因此我得到了类似 GLTextureView 的东西,它有自己的 EGLContext。当我为编码器渲染创建 EGLContext 时,此上下文随后用作共享 EGLContext:

mEGLContext = EGL14.eglCreateContext(mEGLDisplay, configs[0], sharedContext == null ? EGL14.EGL_NO_CONTEXT : sharedContext,
attrib_list, 0);

在我的渲染循环中,我遵循了 fadden 的提示...对于每一帧我都执行以下操作:

  1. 首先,我使用 awaitNewImage() 等待新图像到达 SurfaceTexture
  2. 然后我将 GLTextureView 的上下文设置为当前上下文并在其上渲染框架
  3. 之后,我将编码器上下文设置为当前上下文并在其上渲染帧

这看起来像这样:

mFrameWatcher.awaitNewImage();
mSurfaceTexture.updateTexImage();
_textureView.getEGLManager().makeCurrent();
_textureView.requestRender();
mInputSurface.makeCurrent();
mInputSurface.requestRender();

虽然我只在装有 Android 4.3 的 Nexus 4 上对其进行了测试,但效果很好。

但是,由于我得到了带有 Android 4.4 的新 Nexus 5,编码器每秒只能从 SurfaceTexture 获得 2 个不同的帧......但是这 2 个帧被重复绘制......所以他对同一帧进行了 15 次编码。尽管帧以每秒 30 个不同的帧正确呈现到我的 GLTextureView。我首先认为这可能是 Nexus 5 的问题 - 所以我将另一个 Nexus 4 更新为 Android 4.4...但现在 Nexus 4 上也是一样。

我试了一下 - 最后我解决了这个问题,方法是在我切换 SurfaceTexture 时将它们分离并重新附加到不同的上下文。这看起来像这样:

mFrameWatcher.awaitNewImage();
mSurfaceTexture.updateTexImage();
_textureView.getEGLManager().makeCurrent();
_textureView.requestRender();
mSurfaceTexture.detachFromGLContext();
mInputSurface.makeCurrent();
mSurfaceTexture.attachToGLContext(_textureViewRenderer.getTextureId());
mInputSurface.requestRender();
mSurfaceTexture.detachFromGLContext();
_textureView.getEGLManager().makeCurrent();
mSurfaceTexture.attachToGLContext(_textureViewRenderer.getTextureId());

我现在的问题是:这是执行此操作的正确方法吗?老实说,我认为当我使用共享上下文时,不需要重新附加 SurfaceTexture。重新连接也需要相当长的时间......每帧 3-6 毫秒,12 毫秒,可以更好地用于渲染。我在这里做/理解错了吗?为什么它在 Nexus 4 4.3 上工作得很好,而无需重新连接 SurfaceTexture?

最佳答案

看来这实际上是与 this question 相同的问题.我在那里放了一些细节;简而言之,您应该能够通过取消绑定(bind)和重新绑定(bind)纹理来修复它,这实际上就是您在处理笨拙的附加/分离序列时所做的。

在我的代码中,我可以通过更改以下内容来修复它:

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);

为此:

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID);

在我的纹理渲染器中。我稍后会更新 bigflake 示例。

关于android - SurfaceTexture updateTexImage to shared 2 EGLContexts - Android 4.4 上的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20396515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com