6

後で HTML5 ビデオ要素を介してオフラインで表示するために、自分のサイトからビデオ コンテンツをダウンロードするオフライン ビデオ プレーヤーを作成しようとしています。以下のコードは、デスクトップ用の Chrome では正常に動作しますが、モバイルでは動作しません (Nexus S スマートフォン、Nexus 7 タブレット、4.1 のみがファイルシステム API に必要な chrome を実行するため)。デスクトップとモバイルの両方で Chrome でサポートされているファイルシステム API を使用しています。

ファイルがモバイル デバイスに正しく保存され、ファイルを正しく取得できることを確認しましたが、ローカル システムからビデオを取得した後、何らかの理由で chrome がビデオを再生したくありません。これは、html5 ビデオ要素を使用しているか、ファイルシステムの URL に直接移動しているかに関係なく当てはまります。html5 ビデオ要素を使用すると、エラー media_err_not_supported が返されます。サーバー上のビデオに直接移動すると (最初にファイルシステム API を使用して保存せずに)、デバイスがビデオを再生できることを確認したので、問題はコーデックまたはビデオ形式の問題ではありません。どちらの場合も、ビデオ/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>
4

1 に答える 1

0

この問題は、Android Chrome が Android ファイル システムに正しくアクセスできないように見えます。そのために、nanoHttpd サーバーを使用して、デバイスまたは SD カードの Android ローカル ファイルにアクセスできます。 NanoHttpd サーバーの場合、アプリケーションでこの 1 つのクラスを使用し、メディア ファイルの場所を次のように渡します。http://localhost:8081/sdcard/(your_media_location).mp4

またはhttps://gist.github.com/1893396から nanoHttpd を取得します

これは、直接呼び出すよりも、sdcard ファイルにアクセスする方が正確だと思います


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>

http://video.online-convert.com/convert-to-oggを使用して mp4 を ogv に変換し、 ogv ファイルを mp4 の同じ場所に配置できます。

**詳細については、 http://www.broken-links.com/2010/07/08/making-html5-video-work-on-android-phones/をご覧ください。

Android の HTML5 <video> 要素が再生されない

于 2012-09-03T07:34:49.550 に答える