我指的是如何将相机的预览帧直接编码为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);
在我的渲染循环中,我跟随法登的尖端…对于每一帧,我执行以下操作:
首先,我使用awaitnewimage()等待新图像到达surfacetexture
然后我将gltextureview的上下文设置为当前并在其上渲染帧
之后,我将编码器上下文设置为当前并在其上呈现帧。
看起来像这样:
mFrameWatcher.awaitNewImage();
mSurfaceTexture.updateTexImage();
_textureView.getEGLManager().makeCurrent();
_textureView.requestRender();
mInputSurface.makeCurrent();
mInputSurface.requestRender();
当我用android 4.3在nexus4上测试它时,这个方法运行得很好。
但是,由于我在android 4.4上安装了新的nexus 5,编码器每秒只能从surfacetexture获得2个不同的帧…但这两帧是反复绘制的…所以他对同一帧进行了15次编码。尽管这些帧以每秒30帧的速度正确地渲染到我的gltextureview。
我首先认为这可能是Nexus5的问题-所以我更新了另一个Nexus4到Android 4.4…但现在在Nexus4上也是一样。
我玩了一会儿,最后我终于解决了这个问题,当我切换它们时,分离并重新将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毫秒窥视一次,这可以更好地用于渲染。我在这里做什么/理解什么不对吗?为什么它在Nexus4和4.3上工作得像个符咒,而不需要重新连接SurfaceTexture?
最佳答案
看来这实际上是与this question相同的问题。我在这里放了一些细节;简而言之,您应该能够通过取消绑定和重新绑定纹理来修复它,这基本上就是您使用笨拙的附加/分离序列所做的。
在我的代码中,我可以通过更改以下内容来修复它:
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共享2个EGLContexts-Android 4.4上的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20396515/