Графика ТекстураКиноЭнкодер

Я недавно модифицировал Графика TextureMovieEncoder чтобы создать запись того, что я отобразил на экране: два Sprite2ds, которые перекрываются. С использованием 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();
}

Я думаю, что проблема сводится к тому, что я не понимаю, как установить правильную проекцию на WindowSurface для VideoEncoder, В примере с графикой FullFrameRect используется, что проще, так как вы можете просто использовать единичную матрицу, чтобы растянуть данную текстуру до площади поверхности. Однако, поскольку я хочу создать эффект перекрытия, мне нужно было использовать Sprite2d. Является ли проблема общим EGLContext? Нужно ли создавать новый, чтобы я мог настроить область просмотра в соответствии с WindowSurface размер? Немного растерялся, куда идти отсюда.

1 ответ

Решение

Оказывается, функциональность кода выше была в порядке. Проблема заключалась во взаимодействии между TextureEncoder и вызывающим родителем.

Я инициализировал переменные-члены backTextureId а также frontTextureId после того, как prepareEncoder и поэтому записывал мусорные данные в вывод.

Другие вопросы по тегам