Рендеринг растровых кадров на поверхность для кодирования

Моя цель - взять видеофайл M4V, декодировать сегмент видео в виде кадров PNG, изменить эти кадры и перекодировать обрезанное видео (также в M4V).

Рабочий процесс выглядит так:[Input Video] -> Export Frames -> Modify Frames -> Encode Frames -> [Output Video].

Для процесса декодирования, я ссылался наbigflake Примеры. С использованиемExtractMpegFramesTest пример кода, который я смог сгенерироватьBitmap кадры из.m4v файл и экспорт кадров в виде файлов PNG.

Сейчас я пытаюсь перекодировать процесс, используяEncodeAndMuxTest Пример в попытках создать другой набор классов для кодирования.

Проблема, с которой я сталкиваюсь, заключается в том, что пример кода генерирует необработанные кадры в OpenGL. У меня есть серияBitmaps что я хочу, чтобы закодировать / визуализировать вCodecInputSurface объект. В значительной степени обратное тому, что делает процесс декодирования.

Большинство примеров кода просто отлично, кажется, мне просто нужно изменитьgenerateSurfaceFrame() сделатьBitmap кSurface с OpenGL.

Вот код, который у меня есть до сих пор:

// 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);
}

Я чувствую, что должен быть в состоянии использоватьSTextureRender отExtractMpegFramesTest Пример для достижения аналогичного, но это просто не для меня.

Другая вещь - это производительность, которую я действительно пытаюсь получить для эффективного кодирования. Я буду кодировать 90-450 кадров видео (3-15 секунд при 30 кадрах в секунду), так что, надеюсь, это займет всего несколько секунд.

Ответы на вопрос(3)

Ваш ответ на вопрос