2012-08-13 79 views
6

我正尝试创建一个离线视频播放器,用于从我的网站下载视频内容,以便稍后通过HTML5视频元素离线观看。下面的代码适用于桌面版的Chrome,但不适用于移动版(Nexus S智能手机,Nexus 7平板电脑,4.1版,因为只有该版运行chrome,这是文件系统API所必需的)。我使用桌面和移动设备上的chrome支持的文件系统API。从Chrome文件系统播放视频无法在Android上工作

我已确认它正确地将文件存储在移动设备上,并且我可以正确检索文件,但由于某些原因,从本地系统chrome检索视频后不想播放视频。无论是使用html5视频元素,还是直接导航到文件系统URL,情况都是如此。当我使用html5视频元素时,它返回错误media_err_not_supported。我已经确认设备可以播放视频,如果我直接在我的服务器上导航(没有先使用文件系统api存储它),所以问题不在于编解码器或视频格式问题。我也在这两种情况下使用video/mp4 mime类型。

此外,这可以在桌面上使用,但不能移动。有任何想法吗?

这是我们正在使用的代码:

<!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

什么下载完成后文件的完整路径?你确定能够播放*那个*文件,而不是在其他地方单独下载的副本? – 2012-08-14 16:01:47

+0

当在上面的代码中调用fileEntry.toURL()时,它将返回如下所示的URL:filesystem:mydomain.com/persistent/test3.mp4。而且,是的,如果我直接导​​航到正在从(mydomain.com/trailer.mp4在上面的示例中)下载的URL,它播放视频就好了。 – 2012-08-15 15:26:53

+0

看看你是否可以播放视频。将其从设备上取下并播放,或者从设备上的电影播放器​​播放。 – 2012-09-02 22:06:42

回答

0

问题看起来像你的Android铬正确coudn't访问了Android文件系统,对于您可以使用nanoHttpd服务器对设备访问Android的本地文件或SD卡。 for NanoHttpd server使用这个类在你的应用程序,并通过媒体文件的位置为http://localhost:8081/sdcard/(your_media_location).mp4

或获得nanoHttpd从https://gist.github.com/1893396

我觉得这是更准确的访问SD卡文件不是直接调用他们


尝试改变HTML部分

</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> 

你可以转换你的MP4使用 http://video.online-convert.com/convert-to-ogg 到远洋船,把OGV文件在同一位置的MP4

**有关更多信息,请查看这些 http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/

HTML5 <video> element on Android does not play

+0

这是HTML,不是本机应用程序。 – 2012-09-03 09:17:03

+0

“我想创建一个离线视频播放器”我认为这是一种Android应用程序,顺便说一句,你尝试添加MP4的ogv格式,当我尝试使用android webview,没有播放mp4没有ogv,我更新我的回答 – UdayaLakmal 2012-09-04 10:33:22

+0

IIRC Android支持MP4作为容器格式,但不支持所有H.264配置文件。我不记得Ogg Vorbis支持的状态是甚么。 *播放视频在这里不是问题 - 我们有视频播放良好,只要它们流式传输。它正在从HTML5脱机存储中播放。 – 2012-09-04 13:40:17