Адаптация Grafika RecordFBOActivity для работы с Android GPUImage

У меня есть приложение, которое использует Android-порт GPUImage в качестве OpenGL Renderer и диспетчера нескольких фильтров.

В настоящее время в нем нет реализации видео, поэтому я пытаюсь адаптировать RecordFBOActivity из репозитория Google grafika для работы с архитектурой GPUImage.

Базовый класс GPUImage управляет GLContext и GLSurfaceView, а класс GPUImageRenderer реализует класс Renderer.

Это класс, в котором я пытаюсь адаптировать RenderThread из RecordFBOActivity графика. Есть несколько проблем.

Во-первых, в методе preparegl() я передаю SurfaceTexture вместо Surface, поскольку GPUImage вообще не использует SurfaceHolder (я думаю, что могу его реализовать, но стараюсь не слишком сильно менять базовый код, так как Я хотел бы отодвинуть мою реализацию к вышеупомянутому репо). Я знаю, что WindowSurface.java имеет перегруженный метод для создания WindowSurface как из SurfaceTexture, так и из Surface, но если я делаю это, mSurface iVar всегда равен нулю, так как у меня никогда нет поверхности для передачи ему, что вызывает NPE в методе записи makeCurrent().

Во-вторых,GPUImage присоединяется к GLSurfaceView, а не к SurfaceView, как в примере с графикой, поэтому я немного сомневаюсь, есть ли какие-либо несоответствия низкого уровня, которые могут вызывать у меня конфликты...

В-третьих, и я думаю, что это главная проблема, по крайней мере на данный момент, в том, что я не могу совместить предварительный просмотркамеры с помощью GPUImage с WindowSurface графика. Если я закомментирую метод prepareGl(), setUpSurfaceTexture() из GPUImage устанавливает текстуру предварительного просмотра камеры из SurfaceTexture, которая создается glGenTextures(), и предварительный просмотр работает нормально, а также присоединяется к цепочке рендеринга фильтра., Тем не менее, если я пытаюсь вызвать метод prepareGL() и передать точно такой же SurfaceTexture в конструктор mWindowSurface, сервис камеры умирает, и я получаю ошибку EGL_BAD_SURFACE.

Длинный вопрос, с несколькими движущимися частями, я знаю... Буду пытаться редактировать / обновлять, поскольку я могу прояснить проблемы и подходы к себе. Но был бы рад, если у кого-то есть мысли / допросы... особенно @fadden:D

1 ответ

Я также пытался достичь того же и пытался сделать то, что предложил Фадден. Пытался интегрировать CameraSurfaceRenderer функциональность для GPUImageRenderer, Предварительный просмотр в порядке, но запись - это просто видео с черными рамками. EGL14.eglGetCurrentContext() возвращается null для следующего вызова, и я думаю, что если новый контекст создан, он не будет таким же, как GPUImage должно быть

mVideoEncoder.startRecording(new TextureMovieEncoder.EncoderConfig(
                                    mOutputFile, 640, 480, 1000000, EGL14.eglGetCurrentContext()));

@Jesses.co.tt вы смогли этого добиться?

(поскольку я не могу добавить комментарий, он добавляется как ответ).

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