MediaPlayer no puede procesar en TextureView después de renderizar imágenes

Tengo un MediaPlayer que TextureView videos a un TextureView . Esto está funcionando.

Ahora, quiero mostrar una imagen fija en este TextureView durante un tiempo determinado, y luego obtener el MediaPlayer para renderizar un video al mismo TextureView .

Aquí está mi código para procesar el mapa de bits:

 Canvas canvas = mTextureView.lockCanvas(); canvas.drawBitmap(sourceBitmap, matrix, new Paint()); mTextureView.unlockCanvasAndPost(canvas); 

Después de esto, cualquier intento de reproducir vídeos produce la ERROR_INVALID_OPERATION de ERROR_INVALID_OPERATION (-38) desde el reproductor de vídeo.

Traté de comentar la llamada a drawBitmap , y el error todavía sucedió. Parece que el simple hecho de llamar a lockCanvas seguido de unlockCanvasAndPost resulta en que el TextureView sea ​​inadecuado para el uso de MediaPlayer .

¿Hay alguna manera que puedo restablecer el TextureView a un estado que permite al MediaPlayer para usarlo?

Estoy trabajando en Android 4.2.2.

No puedes hacer esto, debido a una limitación del marco de la aplicación de Android (como de Android 4.4 al menos).

SurfaceTexture que subyace al TextureView es un consumidor de búfer. El MediaPlayer es un ejemplo de un productor de buffer, Canvas es otro. Una vez que usted conecta a un productor, usted tiene que separarlo antes de que usted pueda atar un segundo productor.

El problema es que no hay manera de separar un productor de búfer basado en software (Canvas). Podría haber, pero no lo es. Así que una vez que dibujas con Canvas, estás atrapado. (Hay una nota a ese efecto aquí .)

Puede separar un productor de GLES. Por ejemplo, en una de las clases de reproductor de vídeo de Grafika puedes encontrar un método clearSurface () que borra la superficie a negro usando GLES. Tenga en cuenta que el contexto y la ventana EGL se crean y se liberan explícitamente dentro del ámbito del método. Puede expandir el método para mostrar una imagen.

He tenido problemas similares recientemente. Mi intención era mostrar la miniatura de vídeo directamente en TextureView y luego usar el mismo TextureView para reproducir vídeo, sin usar otro ImageView para mostrar la miniatura de vídeo.

Implementé el segundo enfoque en los comentarios de @fadden, uso EGL para dibujar miniatura de video en el mismo TextureView .

Además, también podemos usar dos texturas en GLSurfaceView para lograr el mismo objetivo. Una textura OES externa para reproducir vídeo continuo y otra textura 2D para mostrar la miniatura de vídeo.

La demostración completa se puede encontrar en este proyecto github EGLPoster .

Esperemos que sea útil para cualquiera que llegue aquí.

  • Phonegap: ¿Es posible reproducir varios videos simultáneamente en la misma página usando etiqueta de vídeo html5?
  • Reproducción de vídeo desde el directorio caché de la aplicación
  • Marcos omitidos. La aplicación puede estar haciendo demasiado trabajo en su hilo principal "error en android 4.3 nexus 7
  • Android Intent.ACTION_VIEW
  • ¿Cómo reproducir dos pistas de audio y video separadas en un solo reproductor sin crear ningún archivo de salida en android?
  • En Android, usando exoplayer, ¿cómo rellenar surfaceview con un video que no tiene la misma relación de aspecto con el dispositivo?
  • Grabar y reproducir vídeo en directo en android
  • Inserción de un vídeo en MediaStore
  • Obtener la URL de descarga para el vídeo de YouTube (Android / Java)
  • Transmisión de audio y vídeo desde Android a PC / web.
  • Cómo poner subtítulos en videos para móviles con Handheld.PlayFullScreenMovie en la unidad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.