Android: dibuja el video de YouTube en SurfaceTexture
Estoy intentando dibujar un WebView en SurfaceTexture así que puedo hacerlo en OpenGL.
Hasta ahora, he jugado con éxito el video de youtube en WebView de la manera estándar:
- Luchando con el fragmento de la ayuda del jugador de Youtube
- Integración de youtube para fragmentar
- ¿Por qué mi youtube en webview reproduce sólo sonido?
- Obtener el título del video de YouTube
- YouTubePlayerSupportFragment en una aplicación de una sola actividad con cambio de orientación
... webView.getSettings().setJavaScriptEnabled(true); if (Build.VERSION.SDK_INT < 8) { webView.getSettings().setPluginsEnabled(true); } else { webView.getSettings().setPluginState(WebSettings.PluginState.ON); } webView.setWebChromeClient(new WebChromeClient() { }); webView.setWebViewClient(new WebViewClient()); ...
También se activa la aceleración de hardware:
<application android:hardwareAccelerated="true" ...
Y también con éxito el renderizado de WebView en OpenGL (excepto la reproducción del video) basado en este tutorial: http://anuraagsridhar.wordpress.com/2013/03/13/rendering-an-android-webview-or-for-that- Matter-any-android-vista-directamente-a-opengl /
Inicialización adicional del WebView (por lo que siempre es "retrato" y se ajusta a la textura):
Point p = new Point(); activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p); webView.setLayoutParams(new ViewGroup.LayoutParams(px, py)); surfaceTexture.setDefaultBufferSize(px, py);
Overriden método onDraw del WebView:
@Override public void onDraw(Canvas c) { try { Point p = new Point(); activity.getWindow().getWindowManager().getDefaultDisplay().getSize(p); Canvas canvas = surfaceTexture.lockCanvas(new Rect(0,0,px,py)); canvas.save(); canvas.translate(-scrollL, -scrollT); super.onDraw(canvas); canvas.restore(); surfaceTexture.unlockCanvasAndPost(canvas); } catch (Surface.OutOfResourcesException e) { throw new RuntimeException(e); } }
Al intentar reproducir video de YouTube en la visualización de la web prestada utilizando el truco anterior, el rectángulo de vídeo es negro (sin embargo, se puede oír el sonido). Sospecho que la aceleración de hardware no funciona en la textura de la superficie.
Así que la pregunta es: ¿Hay alguna manera de reproducir un video de youtube en la textura de OpenGL?
- Cargando video de Youtube a través de i-frame en android webview
- Inicialización del reproductor de YouTube en Fragmento
- reproducir archivo de vídeo de youtube en android
- Cómo obtener el ID de video de YouTube, incluidos los parámetros
- Utiliza el iframe api (youtube) con Cordova para android
- Acceso no configurado. Utiliza la Consola de desarrolladores de Google para activar la API de tu proyecto para la lista de búsqueda de YouTube.
- Reproductor multimedia con YouTube?
- ¿Cómo detener el video de YouTube en la vista web de Android?
El problema es esto: el video se está dibujando a una ventana separada que está detrás de la ventana de la jerarquía de la vista y no es fácilmente accesible para ser dibujado en su SurfaceTexture
. Para complicar el asunto, el WebView
habrá posicionado y dimensionado la ventana de vídeo sin importar que se dibuje a un Canvas
distinto del que se mostraría en la pantalla. Además, el video está siendo renderizado en código nativo, y no sería capaz de dibujar a un Canvas
lo suficientemente rápido como para mantenerse de todos modos (esa es la idea detrás de dar al vídeo una ventana separada).
Cualquier solución satisfactoria requeriría casi necesariamente el uso de las API privadas para obtener acceso a la ventana de vídeo en código nativo. Dependiendo de cómo planea utilizar su SurfaceTexture
, puede encontrar una solución que implique la interceptación de URLs en un WebViewClient
, despojando cualquier etiqueta de vídeo antes de renderizarla y colocando el video en un SurfaceView
o TextureView
bajo su control. A continuación, puede ponerlo donde debería estar en relación con el lugar donde ha dibujado SurfaceTexture
, pero eso limita su uso de SurfaceTexture
a billboard. Sin embargo, ese tipo de hack se pondría muy feo muy rápidamente.
Puesto simplemente, no veo una manera limpia de hacer esto. Es una buena idea, pero no es factible con la API pública.
- Dibujar en un lienzo con demora – "hacer onDraw () reducir la velocidad"
- Tomando fotos cada 66 milisegundos en el teléfono Android para el análisis de color (monitor de ritmo cardíaco)