将位图渲染到MediaCodec表面的OpenGL示例

时间:2017-08-11 02:34:27

标签: android opengl-es surfaceview android-bitmap mediacodec

我正在寻找一个关于如何将位图渲染到MediaCodec提供的表面的示例,以便我可以编码然后将它们复制到mp4视频中。

我看到的最近熟知的例子是EncodeAndMuxTest。不幸的是,由于我有限的OpenGL知识,我无法将示例转换为使用位图而不是当前生成的原始OpenGL帧。这是示例的帧生成方法。

private void generateSurfaceFrame(int frameIndex) {

    frameIndex %= 8;
    int startX, startY;
    if (frameIndex < 4) {
        // (0,0) is bottom-left in GL
        startX = frameIndex * (mWidth / 4);
        startY = mHeight / 2;
    } else {
        startX = (7 - frameIndex) * (mWidth / 4);
        startY = 0;
    }

    GLES20.glClearColor(TEST_R0 / 255.0f, TEST_G0 / 255.0f, TEST_B0 / 255.0f, 1.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

    GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
    GLES20.glScissor(startX, startY, mWidth / 4, mHeight / 2);
    GLES20.glClearColor(TEST_R1 / 255.0f, TEST_G1 / 255.0f, TEST_B1 / 255.0f, 1.0f);
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
}

有人可以告诉我如何修改它来代替渲染位图或指向我这样做的例子吗?我假设这是我需要做的所有事情才能让位图呈现到表面(但我可能错了)。

编辑:这是我替换generateSurfaceFrame的方法,到目前为止还没有为编码器表面创建任何输入:

private int generatebitmapframe()
{
    final int[] textureHandle = new int[1];

    try {

        int id = _context.getResources().getIdentifier("drawable/other", null, _context.getPackageName());

        // Temporary create a bitmap
        Bitmap bmp = BitmapFactory.decodeResource(_context.getResources(), id);

        GLES20.glGenTextures(1, textureHandle, 0);

        if (textureHandle[0] != 0)
        {
            // Bind to the texture in OpenGL
            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);

            // Set filtering
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);

            // Load the bitmap into the bound texture.
            GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);
        }

        if (textureHandle[0] == 0)
        {
            throw new RuntimeException("Error loading texture.");
        }

        //Utils.testSavebitmap(bmp, new File(OUTPUT_DIR, "testers.bmp").getAbsolutePath());
    }
    catch (Exception e) { e.printStackTrace(); }

    return textureHandle[0];
}

0 个答案:

没有答案