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
.
- Android: cambia entre la cámara frontal y posterior mientras graba un vídeo
- ¿Puedo evitar el reproductor de vídeo en pantalla completa nativo con HTML5 en iPhone o Android?
- Cómo seleccionar el video de la galería en el teléfono?
- Exo player DASH Ejemplo de streaming
- Cómo reproducir vídeos de YouTube en WebView en Amazon Fire TV?
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.
- Android, ¿cómo puedo eliminar los controles de VideoView?
- Reproducción automática de video como facebook, Android
- SetVideoSize () se bloquea con altas resoluciones
- Cómo obtener vídeos en GridView desde ** SDCard / carpeta / subcarpeta "
- Error de MediaPlayer de Android (1, -2147483648) CFContent MP4 Video
- Vídeo HTML5 Muestra una pantalla negra en carga
- Reproducir video local en la vista web
- No se muestra el video web de Android HoneyComb
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í.