我在iOS和Blackberry上运行PhoneGap / Cordova(1.8.1直到我敢于升级到2.3.0)的应用程序。
当我尝试启动视频播放时,应用会切换到视频“page”div与视频播放器(我们正在使用JQuery和JQuery Mobile)并设置目标视频的URL。
该播放器旨在播放以前下载到本地文件系统的文件,但目前甚至不会播放从网络流式传输的内容。
我为视频播放器上的所有事件添加了监听器,我可以看到一个“loadstart”事件,然后什么都没有。
初始化如下:
HTML:
<video id="video_player" class="video-js vjs-default-skin noscroll" controls preload="none">
JavaScript - 初始化:
var DEFAULT_OPTIONS = { controls: true, autoplay: false, preload: "none", loop: false };
var videoPlayer = null;
try {
videoPlayer = _V_("video_player", DEFAULT_OPTIONS, function() {
log("Video ready");
});
} catch (error) {
dumpError("Problem with initialisation", error);
}
try {
log("DEBUG: Setting up video");
videoPlayer.addEvent("loadstart", function() {
try {
dumpArguments("loadstart", arguments);
} catch (error) {
dumpError("Failed to process loadstart", error);
}
});
videoPlayer.addEvent("loadedmetadata", function() {
try {
dumpArguments("loadedmetadata", arguments);
} catch (error) {
dumpError("Failed to process loadedmetadata", error);
}
});
videoPlayer.addEvent("loadeddata", function() {
try {
dumpArguments("loadeddata", arguments);
} catch (error) {
dumpError("Failed to process loadeddata", error);
}
});
videoPlayer.addEvent("loadedalldata", function() {
try {
dumpArguments("loadedalldata", arguments);
} catch (error) {
dumpError("Failed to process loadedalldata", error);
}
});
videoPlayer.addEvent("progress", function() {
try {
dumpArguments("progress", arguments);
} catch (error) {
dumpError("Failed to process progress", error);
}
});
videoPlayer.addEvent("error", function() {
try {
dumpArguments("error", arguments);
} catch (error) {
dumpError("Failed to process error", error);
}
});
} catch (error) {
dumpError("Error setting up video controller", error);
}
JavaScript - 设置视频以供播放
APP.avPlayer.video.src(cachedFileRecord.URL);
APP.avPlayer.video是初始化结束时创建的视频播放器的全局参考。
有时视频会启动,并且会对该会话有利,但重新启动应用程序,问题会再次出现。
我是移动开发世界,JavaScript(以及iOS和Cordova等)的新手,但不是开发,我是按错误的顺序做事,还是我的Java历史悠久我用JavaScript行为做出错误的假设?
哦,后代的最后一个事实,代码在BlackBerry上运行得很好,所以这绝对与iOS平台相关,但5.1,6.0和6.1都在模拟器和设备上都失败了。
答案 0 :(得分:1)
我无法解决问题的根源,所以为了将来参考,如果其他人有这个问题,我通过动态构建所有内容来解决它:
// Get the place we will mount the video
var home = $("#videoInsert");
// Remove previous player, TODO Release first
home.empty();
// Create the new content
var player = $('<video></video>');
var videoId = "video" + playerCounter++;
player.attr("id", videoId);
player.attr("class", "video-js vjs-default-skin noscroll");
player.attr("controls", "true");
player.attr("autoplay", "false");
player.attr("preload", "auto");
player.attr("data-setup", "{}");
// Add the optional poster if supplied
if (arguments.length > 2) {
player.attr("poster", posterUrl);
}
// Set the media up
var media = $("<source />");
media.attr("src", "file://" + videoUrl);
media.attr("type", mimeType);
player.append(media);
// Finally add the player to the page
home.append(player);
try {
target = _V_(videoId, null, function() {
log("Video ready");
attachEventListeners(this);
resize(this);
});
} catch (error) {
dumpError("Problem with initialisation", error);
}
似乎有关HTML和JS初始化的内容存在冲突,但纯粹的JS init解决了这个问题。