Android 格拉菲卡纹理编码器

Android 格拉菲卡纹理编码器,android,opengl-es,android-camera,surfaceholder,Android,Opengl Es,Android Camera,Surfaceholder,我最近一直在修改Grafika的TextureMovieEncoder,以创建我在屏幕上显示的内容的录制:两个重叠的Sprite2D。使用CameraCaptureActivity示例作为参考点,我有效地将为渲染线程创建的内容移植到TextureMovieEncoder中,但输出是整个屏幕上的锯齿线。我想我知道出了什么问题,但我不知道如何解决: 一些代码: private void prepareEncoder(EGLContext sharedContext, int width, int h

我最近一直在修改Grafika的TextureMovieEncoder,以创建我在屏幕上显示的内容的录制:两个重叠的Sprite2D。使用CameraCaptureActivity示例作为参考点,我有效地将为渲染线程创建的内容移植到TextureMovieEncoder中,但输出是整个屏幕上的锯齿线。我想我知道出了什么问题,但我不知道如何解决:

一些代码:

private void prepareEncoder(EGLContext sharedContext, int width, int height, int bitRate,
        File outputFile) {
    try {
        mVideoEncoder = new VideoEncoderCore(width, height, bitRate, outputFile);
    } catch (IOException ioe) {
        throw new RuntimeException(ioe);
    }
    mEglCore = new EglCore(sharedContext, EglCore.FLAG_RECORDABLE);
    mInputWindowSurface = new WindowSurface(mEglCore, mVideoEncoder.getInputSurface(), true);
    mInputWindowSurface.makeCurrent();

    textureProgram = new Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT);

    backgroundDrawable = new Drawable2d(Drawable2d.Prefab.RECTANGLE);
    backgroundRect = new Sprite2d(backgroundDrawable);
    frontDrawable = new Drawable2d(Drawable2d.Prefab.RECTANGLE);
    frontRect = new Sprite2d(frontDrawable);

    backgroundRect.setTexture(backTextureId);
    frontRect.setTexture(frontTextureId);

    updateGeometry();
}

private void handleFrameAvailable(Transform transform, long timestampNanos) {
    if (VERBOSE) Log.d(TAG, "handleFrameAvailable tr=" + transform);
    mVideoEncoder.drainEncoder(false);

    backgroundRect.draw(textureProgram, transform.movieMatrix);
    frontRect.draw(textureProgram, transform.cameraMatrix);

    mInputWindowSurface.setPresentationTime(timestampNanos);
    mInputWindowSurface.swapBuffers();
}

我认为问题在于我不了解如何为视频编码器在窗口表面建立正确的投影。在Grafika示例中,使用了FullFrameRect,这更容易,因为您可以只使用标识矩阵将给定纹理拉伸到曲面区域。但是,因为我想创建重叠效果,所以需要使用Sprite2d。问题是共享的EGLContext吗?我是否需要创建一个新的视口,以便将视口设置为与窗口曲面大小匹配?有点迷失了方向。

原来上面代码的功能还不错。问题是TextureEncoder和调用父级之间的交互


我在prepareEncoder之后初始化成员变量backTextureId和frontTextureId,因此它将垃圾数据记录到输出中

在许多方面,连续捕捉活动是一个更好的起点,因为它避免了GLSURFACHEVIEW诱导的体操;特别是,它使用单个EGL上下文。在任何情况下,EGL上下文共享纹理和其他好东西,但不共享视口或任何绘图状态,因此所有这些都可以独立配置。您是否仅在屏幕上、仅在视频上或两者中看到不良输出?“来自摄影机的纹理”活动显示将摄影机的视频馈送到Sprite2d而不是FullFrameRect。嘿,fadden。谢谢你的澄清。我看到了两者的输出,但视频被混叠搞得一团糟。我尝试设置视口,然后使用orthM设置投影矩阵,但没有成功视频仍然有锯齿…但不同。GLES20.glViewport0,0,宽度,高度;Matrix.orthoMmDisplayProjectionMatrix,0,0,宽度,0,高度,-1,1;而且如果我将所有图形更改为使用FullFrameRect而不是Sprite2d,则输出视频显示时不会出现锯齿;但是,如果没有正确的缩放/定位,这似乎很好。这是几何体的问题还是纹理的问题?i、 e.您是否看到位置和大小正确的形状,但渲染到其上的视频纹理混乱?比照硬件定标器练习器,它在平面阴影和纹理形状之间切换。嘿,法登,你用这个钱是对的。问题在于Sprite2d的初始化。我传递纹理ID太早或太晚。在线程旋转之前以及录音开始之后。因此,它只是拉错了纹理