2012-08-13 12 views
6

Estoy intentando crear un reproductor de video fuera de línea que descargue contenido de video de mi sitio para verlo luego sin conexión a través de un elemento de video HTML5. El siguiente código funciona bien en Chrome para el escritorio, pero no en el móvil (teléfono inteligente Nexus S, tableta Nexus 7, 4.1, ya que solo funciona con Chrome, que se requiere para la API del sistema de archivos). Estoy usando la API del sistema de archivos que es compatible con Chrome tanto en el escritorio como en el móvil.Reproducción de videos desde el sistema de archivos Chrome no funciona en Android

He confirmado que está almacenando correctamente el archivo en el dispositivo móvil y puedo recuperar el archivo correctamente, pero por alguna razón después de recuperar el video del sistema local Chrome no quiere reproducir el video. Esto es cierto ya sea que esté usando el elemento de video html5 o si estoy navegando directamente a la URL del sistema de archivos. Cuando uso el elemento de video html5, devuelve el error media_err_not_supported. He confirmado que el dispositivo puede reproducir el video si navego directamente a él en mi servidor (sin almacenarlo primero usando la API del sistema de archivos), por lo que el problema no es un problema de códec o de formato de video. También estoy usando el tipo de mime de video/mp4 en ambos casos.

Nuevamente, esto funciona en el escritorio, pero no en el móvil. ¿Algunas ideas?

Este es el código que estamos utilizando:

<!DOCTYPE html > 
<html> 
    <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"> </script> 
     <script type="text/javascript"> 
      var _fs; 
      var filename = "test3.mp4"; 
      var diskSpaceRequired = 10 * 1024 * 1024; 
      $(document).ready(function() { 
       window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; 
       function onInitFs(fs) { 
        _fs = fs; 
        getVideo(fs); 
       } 

       if (!!window.requestFileSystem) { 

        window.webkitStorageInfo.requestQuota(
         window.webkitStorageInfo.PERSISTENT, 
         diskSpaceRequired, // amount of bytes you need 
         function() { }, 
         function() {} 
        ); 
        window.requestFileSystem(window.PERSISTENT, diskSpaceRequired, onInitFs, function() { alert('error'); }); 
       } else { 
        alert('not supported'); 
       } 

       $("#play").on('click', playVideo); 
       $("#ourVideo").on('error', function(e) { console.log('ERROR!!!', e, arguments); 
        console.log($("#ourVideo")[0].error); 
       }); 
      }); 

      function playVideo() { 
       _fs.root.getFile(filename, {}, function (fileEntry) { 
        $("#ourVideo").attr('src', fileEntry.toURL()); 
        fileEntry.file(function (file) { 
         var reader = new FileReader(); 
         reader.onloadend = function (e) { 
         $("#ourVideo").get(0).play(); 
         }; 
         reader.readAsText(file); 
        }, errorHandler); 

       }, errorHandler); 
      } 

      function getVideo(fs) { 
       fs.root.getFile(filename, { create: true }, function (fileEntry) { 
        fileEntry.createWriter(function (fileWriter) { 
         fetchResource(fileWriter); 
        }, errorHandler); 

       }, errorHandler); 
      } 

      function errorHandler(e) { 
       console.log('error', e); 
      } 

      function fetchResource(fileWriter) { 
       console.log('fetchresource'); 
       var xhr = new XMLHttpRequest(); 
       xhr.responseType = "arraybuffer"; 
       xhr.open("GET", "http://mydomain.com/trailer.mp4", true); 

       xhr.onload = function(e) { 
        if (this.status == 200) { 
         var bb = new WebKitBlobBuilder(); 
         bb.append(this.response); 

         var blob = bb.getBlob("video\/mp4"); 
         fileWriter.write(blob); 
        } else { 
         console.log(this.status); 
        } 
       }; 
       xhr.send(); 
      }    

     </script> 
     <title>foo</title> 
    </head> 
    <body> 


     <input type="button" value="Play Video" id="play"/> 
      <video id="ourVideo" controls=""> 
       <source id="vidSource" type="video/mp4"/> 
      </video> 

    </body> 
</html> 
+0

¿Cuál es el ruta completa al archivo una vez que se ha descargado? ¿Definitivamente ha podido reproducir el archivo * that *, a diferencia de una copia descargada por separado en otro lugar? –

+0

Cuando se realiza la llamada a fileEntry.toURL() en el código anterior, se devuelve una URL como esta: filesystem: midominio.com/persistent/test3.mp4. Y, sí, si navego directamente a la URL que está descargando desde (midominio.com/trailer.mp4 en el ejemplo anterior) reproduce el video muy bien. –

+0

Vea si puede reproducir el video. Sáquelo del dispositivo y reprodúzcalo o reprodúzcalo desde un reproductor de películas en el dispositivo. –

Respuesta

0

El problema parece que su cromo androide coudn't el acceso al sistema de archivos para android correctamente, para que pueda utilizar el servidor para acceder a Android nanoHttpd archivos locales en el dispositivo o sdcard. for NanoHttpd server utilizar esta una clase en su aplicación y pasar la ubicación del archivo de medios de comunicación como http://localhost:8081/sdcard/(your_media_location).mp4

u obtener nanoHttpd de https://gist.github.com/1893396

creo que esto es más preciso para acceder a archivos sdcard que llamar directamente para ellos


intentarlo parte el cambio del hTML para

</head> 
<body> 


    <input type="button" value="Play Video" id="play"/> 
     <video id="ourVideo" controls="">     
      <source src="video1.mp4" type= "video/mp4"> 
      <source src="video1.ogv" type= "video/ogg"> 
     </video> 

</body> 

puede convertir su MP4 a ogv usando http://video.online-convert.com/convert-to-ogg y poner ogv archivo en la misma ubicación en mp4

** Para más información, echa un vistazo a estos http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/

HTML5 <video> element on Android does not play

+0

Esto es HTML, no es una aplicación nativa. –

+0

"Estoy intentando crear un reproductor de video fuera de línea" Pensé que era una especie de aplicación para Android, por cierto intente agregar formato ogv con el mp4, cuando intento con la vista web de Android que no reproduce mp4 sin ogv, actualizó mi respuesta – UdayaLakmal

+0

IIRC Android admite MP4 como formato de contenedor, pero no admite todos los perfiles H.264. No recuerdo cuál fue o es el estado de soporte de Ogg Vorbis. El * juego * de videos no es un problema aquí: tenemos videos que funcionan bien, siempre que se transmitan. Está funcionando el almacenamiento fuera de línea de HTML5 que está roto. –

Cuestiones relacionadas