2012-08-13 42 views
6

Tôi đang cố gắng tạo trình phát video ngoại tuyến có thể tải xuống nội dung video từ trang web của tôi để xem ngoại tuyến sau qua phần tử video HTML5. Mã bên dưới hoạt động tốt trong Chrome dành cho máy tính để bàn nhưng không hoạt động trên thiết bị di động (điện thoại thông minh Nexus S, máy tính bảng Nexus 7, 4.1 vì chỉ chạy Chrome, được yêu cầu cho api hệ thống tệp). Tôi đang sử dụng API hệ thống tệp được chrome hỗ trợ trên cả máy tính để bàn và thiết bị di động.Phát video từ Hệ thống tệp Chrome Không hoạt động trên Android

Tôi đã xác nhận rằng tệp đó đang lưu trữ chính xác tệp trên thiết bị di động và tôi có thể truy xuất tệp chính xác nhưng vì một số lý do sau khi truy xuất video từ chrome hệ thống không muốn phát video. Điều này đúng cho dù tôi đang sử dụng phần tử video html5 hay tôi đang điều hướng trực tiếp đến URL hệ thống tệp. Khi tôi sử dụng phần tử video html5, nó trả về lỗi media_err_not_supported. Tôi đã xác nhận rằng thiết bị có thể phát video nếu tôi điều hướng trực tiếp đến nó trên máy chủ của tôi (không lưu trữ trước tiên bằng api hệ thống tập tin), vì vậy vấn đề không phải là vấn đề về codec hoặc video. Tôi cũng đang sử dụng loại mime video/mp4 trong cả hai trường hợp.

Một lần nữa, tính năng này hoạt động trên máy tính để bàn nhưng không hoạt động trên thiết bị di động. Bất kỳ ý tưởng?

Đây là mã chúng tôi đang sử dụng:

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

là gì đường dẫn đầy đủ đến tệp khi nó đã được tải xuống? Bạn có chắc chắn có thể chơi tập tin * đó *, trái ngược với một bản sao được tải xuống riêng ở nơi khác không? –

+0

Khi cuộc gọi được thực hiện tới fileEntry.toURL() trong đoạn mã trên, nó trả về một URL như thế này: filesystem: mydomain.com/persistent/test3.mp4. Và, vâng, nếu tôi điều hướng trực tiếp đến URL mà nó đang tải xuống từ (mydomain.com/trailer.mp4 trong ví dụ trên), nó sẽ phát video tốt. –

+0

Xem bạn có thể phát video không. Lấy nó ra khỏi thiết bị và chơi nó hoặc chơi nó từ một trình phát phim trên thiết bị. –

Trả lời

0

Vấn đề trông giống như chrome android của bạn coudn't truy cập hệ thống tập tin android một cách chính xác, Cho rằng bạn có thể sử dụng máy chủ nanoHttpd để truy cập android file cục bộ trong thiết bị hoặc sdcard. for NanoHttpd server sử dụng một lớp này trong ứng dụng của bạn và vượt qua các vị trí tập tin phương tiện truyền thông như http://localhost:8081/sdcard/(your_media_location).mp4

hoặc nhận nanoHttpd từ https://gist.github.com/1893396

Tôi nghĩ rằng đây là chính xác hơn để truy cập vào các file sdcard vì gọi trực tiếp cho chúng


thử thay đổi html phần để

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

bạn có thể chuyển đổi mp4 của bạn để sử dụng ogv http://video.online-convert.com/convert-to-ogg và đưa ogv tập tin trong cùng một vị trí trong mp4

** để biết thêm thông tin hãy kiểm tra các http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/

HTML5 <video> element on Android does not play

+0

Đây là HTML, không phải là ứng dụng gốc. –

+0

"Tôi đang cố gắng tạo trình phát video ngoại tuyến" Tôi nghĩ đây là loại ứng dụng Android, bằng cách này bạn thử thêm định dạng ogv với mp4, khi tôi thử với webview android không phát mp4 mà không có ogv, i cập nhật câu trả lời của tôi – UdayaLakmal

+0

IIRC Android hỗ trợ MP4 dưới dạng định dạng vùng chứa nhưng không hỗ trợ tất cả cấu hình H.264. Tôi không thể nhớ được tình trạng của Ogg Vorbis đã hỗ trợ hay không. Video * phát * của video không phải là vấn đề ở đây - chúng tôi có video phát rất tốt, cung cấp video được phát trực tuyến. Nó đang phát từ bộ nhớ ngoại tuyến HTML5 đã bị hỏng. –

Các vấn đề liên quan