无法使用 cordova 在 android 上播放视频
Can't play videos on android using cordova
我已经四处寻找好几天了:(所以真的需要你的帮助。
我正在开发的是一个下载图像和视频并全屏显示的应用程序。
对于图像,一切都很好。
但是在播放视频时有时出现此图像并且视频无法播放。
这是我的下载代码:
download(URL, fileName, callback) {
var folderName = "serverMediaDir";
var uri = encodeURI(URL);
window.requestFileSystem(
LocalFileSystem.PERSISTENT,
0,
function (fileSystem) {
var directoryEntry = fileSystem.root; // to get root path of directory
directoryEntry.getDirectory(
folderName,
{
create: true,
exclusive: false
},
function (parent) {
// Directory created successfuly
var filename = fileSystem.root.toURL() + folderName + "/" + fileName;
console.log("Directory created successfuly: " + filename);
var fileTransfer = new FileTransfer();
fileTransfer.download(
uri,
filename,
function (entry) {
// download success
var path = entry.toURL(); //**THIS IS WHAT I NEED**
console.log("Download Completed: " + entry.fullPath);
callback(null, filename, entry);
},
function (error) {
callback(error, null);
} // irrelevant download error
);
},
function (error) {
//Error while creating directory
callback(error, null);
}
);
}, function (error) {
callback(error, null);
} // irrelevant request fileSystem error
);
}
然后我将视频和图像的完整路径保存到一个数组中,我用它来显示它们。
我是这样玩的:
vid: function () {
var self = this;
//Accepts any number of ‘src‘ to a same video ('.mp4', '.ogg' or '.webm')
var el = document.createElement("video");
// var source = document.createElement("source");
/*for (var i = 0; i < arguments.length; i++) {
source.src = arguments[i];
// source.type = "video/" + arguments[i].split(".")[arguments[i].split(".").length - 1];
el.appendChild(source);
}*/
el.src = arguments[0];
el.onplay = function () {
clearInterval(window.sliding);
};
el.onended = function () {
window.sliding = setInterval(self.rotateImages, self.mediaUnitDuration * 1000);
self.rotateImages();
};
return el;
},
rotateMedias: function () {
var self = this;
if (self.newMedia) {
self.galleryArray = [];
if (self.mediaServer.length === 0) {
self.galleryArray.push(self.img(require(window.display.toUpperCase() ==='H'? '~/assets/H.jpg':'~/assets/V.jpg')))
}
for (var i = 0; i < self.mediaServer.length; i++) {
if (self.mediaServer[i].type.toLowerCase() === "video" && self.mediaServer[i].status) {
var obj = {};
obj = self.vid(self.mediaServer[i].path);
} else if (self.mediaServer[i].type.toLowerCase() === "image" && self.mediaServer[i].status) {
var obj = {};
obj = self.img(self.mediaServer[i].path);
}
self.galleryArray.push(obj);
}
self.newMedia = false;
}
$("#slideShow").fadeOut("slow");
setTimeout(function () {
self.curImg = self.curImg < self.galleryArray.length - 1 ? self.curImg + 1 : 0;
document.getElementById("slideShow").innerHTML = "";
self.galleryArray[self.curImg].style.width = "100%";
self.galleryArray[self.curImg].style.height = "100%";
self.galleryArray[self.curImg].style.margin = "0px";
document.getElementById("slideShow").appendChild(self.galleryArray[self.curImg]);
if (self.galleryArray[self.curImg].tagName.toLowerCase() === "video") {
self.galleryArray[self.curImg].play();
}
$("#slideShow").fadeIn("slow");
}, 500);
}
我尝试的解决方案是更改我存储文件的目录 (cordova.file.applicationDirectory|dataDirectory|externalApplicationStorageDirectory...) 并尝试 public 和 private 但不是也在工作。
我也尝试了协议 file:/// 和 cdvfile://localhost
我使用:
科尔多瓦 10.0.0
cordova-plugin-file-transfer 1.7.1
科尔多瓦插件文件 6.0.2
并使用 android 7.1.2
在 X96mini 盒子上运行应用程序
经过大量测试后,我发现这是一个 box bug(该应用程序可以在许多其他 android 不同版本的设备上运行)。 Thnx 上帝,我找到了 this 插件,所以我使用了它,它确实可以正常工作。
我已经四处寻找好几天了:(所以真的需要你的帮助。 我正在开发的是一个下载图像和视频并全屏显示的应用程序。 对于图像,一切都很好。
但是在播放视频时有时出现此图像并且视频无法播放。
这是我的下载代码:
download(URL, fileName, callback) {
var folderName = "serverMediaDir";
var uri = encodeURI(URL);
window.requestFileSystem(
LocalFileSystem.PERSISTENT,
0,
function (fileSystem) {
var directoryEntry = fileSystem.root; // to get root path of directory
directoryEntry.getDirectory(
folderName,
{
create: true,
exclusive: false
},
function (parent) {
// Directory created successfuly
var filename = fileSystem.root.toURL() + folderName + "/" + fileName;
console.log("Directory created successfuly: " + filename);
var fileTransfer = new FileTransfer();
fileTransfer.download(
uri,
filename,
function (entry) {
// download success
var path = entry.toURL(); //**THIS IS WHAT I NEED**
console.log("Download Completed: " + entry.fullPath);
callback(null, filename, entry);
},
function (error) {
callback(error, null);
} // irrelevant download error
);
},
function (error) {
//Error while creating directory
callback(error, null);
}
);
}, function (error) {
callback(error, null);
} // irrelevant request fileSystem error
);
}
然后我将视频和图像的完整路径保存到一个数组中,我用它来显示它们。
我是这样玩的:
vid: function () {
var self = this;
//Accepts any number of ‘src‘ to a same video ('.mp4', '.ogg' or '.webm')
var el = document.createElement("video");
// var source = document.createElement("source");
/*for (var i = 0; i < arguments.length; i++) {
source.src = arguments[i];
// source.type = "video/" + arguments[i].split(".")[arguments[i].split(".").length - 1];
el.appendChild(source);
}*/
el.src = arguments[0];
el.onplay = function () {
clearInterval(window.sliding);
};
el.onended = function () {
window.sliding = setInterval(self.rotateImages, self.mediaUnitDuration * 1000);
self.rotateImages();
};
return el;
},
rotateMedias: function () {
var self = this;
if (self.newMedia) {
self.galleryArray = [];
if (self.mediaServer.length === 0) {
self.galleryArray.push(self.img(require(window.display.toUpperCase() ==='H'? '~/assets/H.jpg':'~/assets/V.jpg')))
}
for (var i = 0; i < self.mediaServer.length; i++) {
if (self.mediaServer[i].type.toLowerCase() === "video" && self.mediaServer[i].status) {
var obj = {};
obj = self.vid(self.mediaServer[i].path);
} else if (self.mediaServer[i].type.toLowerCase() === "image" && self.mediaServer[i].status) {
var obj = {};
obj = self.img(self.mediaServer[i].path);
}
self.galleryArray.push(obj);
}
self.newMedia = false;
}
$("#slideShow").fadeOut("slow");
setTimeout(function () {
self.curImg = self.curImg < self.galleryArray.length - 1 ? self.curImg + 1 : 0;
document.getElementById("slideShow").innerHTML = "";
self.galleryArray[self.curImg].style.width = "100%";
self.galleryArray[self.curImg].style.height = "100%";
self.galleryArray[self.curImg].style.margin = "0px";
document.getElementById("slideShow").appendChild(self.galleryArray[self.curImg]);
if (self.galleryArray[self.curImg].tagName.toLowerCase() === "video") {
self.galleryArray[self.curImg].play();
}
$("#slideShow").fadeIn("slow");
}, 500);
}
我尝试的解决方案是更改我存储文件的目录 (cordova.file.applicationDirectory|dataDirectory|externalApplicationStorageDirectory...) 并尝试 public 和 private 但不是也在工作。
我也尝试了协议 file:/// 和 cdvfile://localhost
我使用: 科尔多瓦 10.0.0 cordova-plugin-file-transfer 1.7.1 科尔多瓦插件文件 6.0.2
并使用 android 7.1.2
在 X96mini 盒子上运行应用程序经过大量测试后,我发现这是一个 box bug(该应用程序可以在许多其他 android 不同版本的设备上运行)。 Thnx 上帝,我找到了 this 插件,所以我使用了它,它确实可以正常工作。