Renderizar cuadros de mapa de bits en superficie para codificar

Mi objetivo es tomar un archivo de video M4V, decodificar un segmento del video como cuadros PNG, modificar estos cuadros y volver a codificar el video recortado (también en M4V).

El flujo de trabajo es así:[Input Video] -> Export Frames -> Modify Frames -> Encode Frames -> [Output Video].

Para el proceso de decodificación, he estado haciendo referencia abigflake ejemplos Utilizando laExtractMpegFramesTest ejemplo de código que pude generarBitmap marcos de un.m4v archivar y exportar marcos como archivos PNG.

Ahora estoy intentando el proceso de recodificación, usando elEncodeAndMuxTest ejemplo en intentos de crear otro conjunto de clases para codificar.

El problema con el que me estoy encontrando es que el código de ejemplo parece generar marcos sin formato en OpenGL. Tengo una serie deBitmaps que quiero codificar / renderizar a laCodecInputSurface objeto. Prácticamente lo contrario de lo que hace el proceso de decodificación.

La mayoría del código de ejemplo está bien, parece que solo necesito modificargenerateSurfaceFrame() para representar elBitmap alSurface con OpenGL.

Aquí está el código que tengo hasta ahora:

// Member variables (see EncodeAndMuxTest example)
private MediaCodec encoder;
private CodeInputSurface inputSurface;
private MediaMuxer muxer;
private int trackIndex;
private boolean hasMuxerStarted;
private MediaCodec.BufferInfo bufferInfo;

// This is called for each frame to be rendered into the video file
private void encodeFrame(Bitmap bitmap)
{
    int textureId = 0;

    try
    {
        textureId = loadTexture(bitmap);

        // render the texture here?
    }
    finally
    {
        unloadTexture(textureId);
    }
}

// Loads a texture into OpenGL
private int loadTexture(Bitmap bitmap)
{
    final int[] textures = new int[1];
    GLES20.glGenTextures(1, textures, 0);

    int textureWidth = bitmap.getWidth();
    int textureHeight = bitmap.getHeight();

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
            GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
            GLES20.GL_CLAMP_TO_EDGE);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
            GLES20.GL_CLAMP_TO_EDGE);

    return textures[0];
}

// Unloads a texture from OpenGL
private void unloadTexture(int textureId)
{
    final int[] textures = new int[1];
    textures[0] = textureId;

    GLES20.glDeleteTextures(1, textures, 0);
}

Siento que debería poder usar elSTextureRender desde elExtractMpegFramesTest ejemplo para lograr similar, pero simplemente no está haciendo clic para mí.

Otra cosa es el rendimiento, que realmente estoy tratando de obtener una codificación eficiente. Codificaré 90-450 cuadros de video (3-15 segundos a 30 fps), por lo que espero que esto solo tome varios segundos.

Respuestas a la pregunta(3)

Su respuesta a la pregunta