2014-11-11 1 views
0

Я недавно модифицировал Grafika's TextureMovieEncoder, чтобы создать запись того, что я отобразил на экране: два Sprite2ds, которые перекрываются. Используя пример CameraCaptureActivity в качестве контрольной точки, я фактически портировал то, что я создал для моего потока рендеринга, в TextureMovieEncoder, но на выходе есть зубчатые линии по экрану. Я думаю, я понимаю, что это неправильно, но я не знаю, как это исправить:Grafika 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. В примере Grafika используется FullFrameRect, что проще, поскольку вы можете просто использовать матрицу идентификации, чтобы растянуть заданную текстуру до поверхности. Однако, поскольку я хочу создать перекрывающий эффект, мне нужно было использовать Sprite2d. Является ли проблема общим EGLContext? Нужно ли создавать новый, чтобы я мог установить видовое окно в соответствие с размером WindowSurface? Немного потеряно, куда идти отсюда.

+0

Во многих случаях деятельность «непрерывного захвата» является лучшей отправной точкой, поскольку она позволяет избежать вызванной GLSurfaceView гимнастики; в частности, он использует один контекст EGL. В любом случае контексты EGL разделяют текстуры и другие полезные свойства, но не область просмотра или какое-либо из состояний чертежа, поэтому все, что настраивается независимо. Вы видите плохой вывод только на экране, только на видео или в обоих? Активность «текстура с камеры» показывает подачу видео (от камеры) в Sprite2d, а не в FullFrameRect. – fadden

+0

Эй, fadden. Спасибо за разъяснения. Я вижу вывод обоих, но видео перепутано с псевдонимом. Я попробовал установить окно просмотра, а затем с помощью ортогональной установки, чтобы настроить матрицу проецирования, но это не сработало (видео все еще псевдонимы ... но по-другому). 'GLES20.glViewport (0, 0, width, height);' 'Matrix.orthoM (mDisplayProjectionMatrix, 0, 0, width, 0, height, -1, 1);' – kungfoo

+0

Также. Если я изменю весь чертеж, чтобы использовать FullFrameRect вместо Sprite2d, выходное видео появляется без наложения псевдонимов; однако, без правильного масштабирования/позиционирования. – kungfoo

ответ

0

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

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