Detener interminable búfer de vídeo html5 en cordova webview en dispositivos Samsung

Estoy construyendo una aplicación móvil multiplataforma usando Cordova (PhoneGap 3.0.0-0.14.4), con Android como una de las plataformas de destino. Una parte importante (pero no única) de la funcionalidad de la aplicación es reproducir vídeo. He elegido la etiqueta html5 <video> como el método preferido para implementar el reproductor de video. Los videos están alojados en Vimeo. La aplicación se implementa como un solo documento html, donde la navegación se logra alterando el contenido mediante javascript.

La etiqueta de video que he usado se parece a:

 <video autoplay controls id="videotag"> <source id="videosrc" src="http://player.vimeo.com/external/..."/> Din apparat stöder inte denna video. </video> 

Conseguir que el video sea jugable funcionó fuera de la caja simplemente añadiendo la etiqueta de vídeo al html. En un HTC One mini (Android 4.3) esta solución funcionó sin problemas. En un Samsung Galaxy S4 mini (Android 4.2.2), el video también se reproduce, pero ocurre otro problema: El video está siendo almacenado en búfer por un componente MediaPlayer, y este almacenamiento en búfer no se detiene nunca. El registro se rellena con los siguientes mensajes, repetidos indefinidamente:

 01-25 13:45:36.698: V/MediaPlayer(2814): message received msg=3, ext1=34, ext2=0 01-25 13:45:36.698: V/MediaPlayer(2814): buffering 34 01-25 13:45:36.698: V/MediaPlayer(2814): callback application 01-25 13:45:36.698: V/MediaPlayer(2814): back from callback 

Este almacenamiento en búfer continúa incluso después de detener la reproducción, la etiqueta de vídeo se elimina y el usuario sale (suspende) la aplicación. Suspender la aplicación no detiene el almacenamiento en búfer, pero la eliminación de la aplicación sí. El búfer tampoco se detiene cuando alcanza el 100%, pero en su lugar se mantiene aparentemente indefinidamente. No hay sonido en el fondo, pero la conexión a Internet se mantiene abierta, la batería se descarga y el dispositivo se calienta . Este es un error para nosotros, ya que no estamos dispuestos a publicar una aplicación que cause sobrecalentamiento.

Síntomas similares al problema detectado también fueron reportados por un probador beta en un Samsung Galaxy S3. El problema puede estar limitado a Samsung, ya que no se produce en un dispositivo HTC.

Parece que el componente MediaPlayer no recibe un mensaje para detener el almacenamiento en búfer aunque el vídeo ya no sea necesario.

He intentado lo siguiente, sin éxito:

  • He eliminado completamente la etiqueta de vídeo del DOM cuando he terminado de ver.
  • He utilizado javascript para detener la reproducción mediante la llamada de pausa () en el elemento de vídeo antes de la eliminación.
  • Después de HTML5 Video: Forzar el aborto de la memoria intermedia He intentado usar javscript para borrar las urls de src dentro de la etiqueta de video, seguido de llamar a load () en la etiqueta de video.
  • Sobre la base de un comentario sobre la pregunta anterior, he intentado colocar la etiqueta de vídeo dentro de un iframe, que se elimina del DOM cuando se hace la observación.
  • He intentado combinar todo lo anterior.
  • He intentado tener la etiqueta video en una página separada, que se navega lejos de. Esto es una salida del modelo de una sola página con js utilizado de otra manera.
  • He intentado usar el reproductor de Vimeo a través de oEmbed, en lugar de usar una etiqueta de vídeo html5 directamente.

Eso agota los trucos independientes de la plataforma que he podido encontrar. Hay algunos enfoques basados ​​en el código nativo de Android

  • Stop Android MediaPlayer lanzado automáticamente por la página web dentro de WebView da una solución potencial, pero de acuerdo con un comentario de la pregunta autor, la solución aceptada sólo se detiene el audio de jugar, pero no mata el MediaPlayer.
  • Android WebView Reproducción de vídeo HTML5 / h.264 / mp4, Cómo llegar a MediaPlayer parece ser un problema similar, pero con una webvista personalizada en lugar de Córdoba. No sé cómo tratar de aplicar esto a Córdoba.

Estoy buscando cualquier solución al problema que permite que el video se reproduzca sin causar sobrecalentamiento. Esto debería ser un problema que otras personas han tenido que resolver, así que espero que haya un plugin cordova que ya resuelve el problema. ¿Hay tal plugin? Si no lo hay, ¿es posible implementar alguno de los dos enfoques nativos de Android mencionados anteriormente en Córdoba y resolverían el problema?

Una posible solución sería matar la aplicación cada vez que se suspenda. Esto es feo y no de acuerdo con las directrices de Android. ¿Cuál es la manera menos fea de lograr esto?

One Solution collect form web for “Detener interminable búfer de vídeo html5 en cordova webview en dispositivos Samsung”

Después de luchar por más de un día en algo similar, he encontrado que puede bloquear el MediaPlayer dentro de un WebView mediante el envío de la WebView a una página con una etiqueta de vídeo HTML5 con una url de vídeo mal. El siguiente ejemplo es una actividad principal con una etiqueta de vídeo válida. Si presiona reproducir, el MediaPlayer se hará cargo y comenzará a correr para siempre … PERO cuando haga clic en atrás o en casa y salga de la aplicación, la onPause() se dispara y el WebView es redirigido a una página con una url de video mal y dijo Para reproducir automáticamente. Intentar jugar bloquea el MediaPlayer y voila! El MediaPlayer ya no existe.

 package com.test.webviewtest; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = new WebView(this); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient()); String html = "<video width=\"320\" height=\"240\" controls>" + "<source src=\"http://www.w3schools.com/html/movie.mp4\" " + "type=\"video/mp4\"></video>"; webView.loadData(html, "text/html", null); setContentView(webView); } @Override protected void onPause(){ super.onPause(); // attempt to kill the MediaPlayer here... webView.getSettings().setJavaScriptEnabled(true); webView.setWebViewClient(new WebViewClient(){ @Override public void onPageStarted(WebView view, String url, Bitmap favicon){ String js = "javascript:document.getElementsByTagName('video')[0].play();"; webView.loadUrl(js); } }); String html = "<video width=\"320\" height=\"240\" controls>" + "<source src=\"http://www.w3schools.com/html/" + "NOT_A_MOVIE.mp4" + "\" type=\"video/mp4\"></video>"; webView.loadData(html, "text/html", null); } } 

Tenga en cuenta los registros:

 02-26 13:19:13.010 220-25370/? V/MediaPlayerService﹕ [607] notify (0x43a3aeb8, 100, 1, -1004) 02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ message received msg=100, ext1=1, ext2=-1004 02-26 13:19:13.010 25262-25274/com.test.webviewtest E/MediaPlayer﹕ error (1, -1004) 02-26 13:19:13.010 25262-25274/com.test.webviewtest V/MediaPlayer﹕ callback application 02-26 13:19:13.020 25262-25274/com.test.webviewtest V/MediaPlayer﹕ back from callback 02-26 13:19:13.020 25262-25262/com.test.webviewtest E/MediaPlayer﹕ Error (1,-1004) 

Y luego el silencio dichoso de no más registros de MediaPlayer

Ver Android WebView HTML5 Video Spawns MediaPlayer que vive para siempre en Samsung S4 [Hacked respuesta encontrada] para más discusión.

  • Implementar onShowCustomView en Android 3.1 lanza excepciones en HTML5VideoFullScreen
  • Detectar si el cliente permite la reproducción de medios en línea para vídeo HTML5
  • Se bloquea el video HTML 5 al ir a pantalla completa
  • El video se reproduce solo una vez en la vista Web de Android
  • Video HTML5 - búsqueda precisa en dispositivos Android?
  • Android HTML5 video - funciona al hacer clic en play, pero no video.play ()
  • Reproducción de video HTML5 en pantalla completa en la vista web de Android
  • Cómo reproducir video en Android Web view usando html5
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.