後で 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>