Рендеринг растровых кадров на поверхность для кодирования
Моя цель - взять видеофайл 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 кадрах в секунду), так что, надеюсь, это займет всего несколько секунд.