@VioletKnight
Computer vision R&D

Android MediaPlayer — как сделать рендер видеофайла в текстуру поверх фоновой текстуры с камеры?

Всем привет, делаю простое приложение: в работающей AR-сессии детектится объект (Vuforia User Defined Target), к нему прикрепляется поверхность, в которую должно рендериться внешнее видео. С детектированием всё в порядке, но вот рендерится кадр с камеры, вместо кадра из видеофайла. В принципе, от Vuforia тут похоже не особо что зависит, поэтому вопрос можно абстрагировать от неё.

Вот код инициализации медиаплеера:
videoPlayer = MediaPlayer()
        videoPlayer.setSurface(mRenderer?.planeSurface)
        videoPlayer.isLooping = true
        val afd: AssetFileDescriptor
        try {
            afd = assets.openFd("test.mp4")
            videoPlayer.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
            videoPlayer.prepare()
            videoPlayer.start()
        } catch (e: IOException) {
            e.printStackTrace()
        }


Вот код инициализации текстуры:
GLES20.glGenTextures(1, planeSurfaceTextureId, 0)
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, planeSurfaceTextureId[0])
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE)
        GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE)
        planeSurfaceTexture = SurfaceTexture(planeSurfaceTextureId[0])
        planeSurfaceTexture.setOnFrameAvailableListener(mActivity)
        planeSurface = Surface(planeSurfaceTexture)


Вот собственно рендернг поверхности с кадром:
planeSurfaceTexture.updateTexImage()
        GLES20.glActiveTexture(GLES20.GL_TEXTURE1)
        GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, planeSurfaceTextureId[0])
        GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, modelViewProjection, 0)
        GLES20.glUniform1i(texSampler2DHandle, 0)
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, contentPlane.numObjectIndex, GLES20.GL_UNSIGNED_SHORT, contentPlane.meshIndices)
        GLES20.glDisableVertexAttribArray(vertexHandle)
        GLES20.glDisableVertexAttribArray(textureCoordHandle)


Если нужно, могу в принципе весь код показать.
В андроиде я новичок, возможно какая-то тупая ошибка, помогите разобраться пожалуйста :) Возможно тут вообще без GLES можно обойтись.

Заранее спасибо!
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы