时间 2015-05-13 17:11:58
The GIS
Guy

使用 video.js 简单几步编写一个可以在微信、QQ内置浏览器中正常工作的 HTML5 视频播放器。

HTML5 标签看似简单,但在不同设备上使用时却问题不断,原因是很多设备强制使用自身的视频播放器来播放 HTML5
视频。使用第三方组件 video.js 可以在一定程度上克服这个问题。

初始化 video.js

编写 HTML 页面:

<<span class="hljs-name">head>
<<span class="hljs-name">meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<<span class="hljs-name">title></<span class="hljs-name">title>
<<span class="hljs-name">link href="include/video-js/video-js.css" rel="stylesheet">
<<span class="hljs-name">script src="video.js"></<span class="hljs-name">script>
<<span class="hljs-name">script>
videojs.options.flash.swf = "include/video-js/video-js.swf"
</<span class="hljs-name">script>
</<span class="hljs-name">head>
<<span class="hljs-name">body>
<<span class="hljs-name">video id="video" class="video-js vjs-default-skin vjs-big-play-centered"
controls preload="auto" width="100%" height="100%"
poster="img/pure-black.jpg" data-setup=''>
<<span class="hljs-name">source src="video/video.mp4" type='video/mp4' />
<<span class="hljs-name">source src="video/video.webm" type='video/webm' />
<<span class="hljs-name">source src="video/video.ogv" type='video/ogg' />
<<span class="hljs-name">p class="vjs-no-js">播放视频需要启用 JavaScript,推荐使用支持HTML5的浏览器访问。</<span class="hljs-name">p>
</<span class="hljs-name">video>
</<span class="hljs-name">body>

与官方教程相比,这里为 video 元素额外添加了
vjs-big-play-centered 类,让播放按钮显示在视频的正中间(默认在左上角)。
controls 表示自动添加播放控件。加上 preload="auto"
可以让页面加载完成后立即开始加载视频,如果设置为 preload="meta" 则只加载视频元数据。

中声明 ,可以让页面在高分辨率的手机上显示正确的尺寸,防止因为屏幕像素高而使得页面元素变得很小。

虽然页面中已经指定 高度为100%,但此时视频控件高度仍然为0,可以用下面的 CSS 样式让视频控件全屏。

html, body {
width: 100%;
height: 100%;
}

为适配不同内核的浏览器,需要同时提供 .mp4、.ogv、.webm 三种格式的视频,但 OS X
下没有找到好用的免费转换器可以同时转换成 .mp4、.ogv 和 .webm 三种格式。miro
虽然号称免费开源,但是不捐钱无法得到下载链接……如果视频不大,推荐使用 converter.com 的在线转换器。

可以看看上面代码在浏览器中的效果:

video.js 开发 HTML5 视频页面" title="使用 video.js 开发 HTML5 视频页面">

事件响应

video.js 对 HTML5 视频的事件进行了封装,下面的代码演示了如何给视频添加事件响应:

var player = videojs('video');
// 检测播放时间
player.on('timeupdate', function () {
console.log('当前播放时间:' = player.currentTime());
}
});
// 开始或恢复播放
player.on('play', function() {
console.log('开始/恢复播放');
});
// 暂停播放
player.on('pause', function() {
console.log('暂停播放');
});

视频播放控件最常用的事件是 'play','pause','ended',以及'timeupdate'。

适配iOS、安卓设备

正确处理播放结束事件

在设备实测中可以发现,上一节中提到的 'ended' 事件在安卓设备上并没有正确触发。因此,需要通过
'timeupdate' 事件判断视频是否已播放完毕:

player.on('timeupdate', function () {
// 如果 currentTime() === duration(),则视频已播放完毕
if (player.duration() != 0 && player.currentTime() === player.duration()) {
// 播放结束
}
});

与iOS设备不同,安卓设备中视频还未加载的情况下 player.duration()
player.currentTime() 均为0,因此需要通过
player.duration() != 0 确保视频信息已加载成功
,以免在页面刚刚加载的时候就错误地认为视频播放已经结束。

隐藏移动设备自动添加的播放按钮

移动设备上的浏览器检测到 HTML5
视频时,会自动加上播放按钮,然而在大多数情况下,默认的播放按钮点击之后并不能正常播放视频。(为什么要采用第三方组件来写视频控件的原因。)

另外,video.js 本身已经带有播放按钮,因此需要将设备自动添加的播放按钮隐藏。设置下面的 CSS 样式:

video::-webkit-media-controls {
display:none !important;
}

到此为止,一个适配了桌面端与移动端,并用能在QQ、微信浏览器中正常打开视频的页面就完成了。

使用 video.js 开发 HTML5 视频页面的更多相关文章

  1. JS开发HTML5游戏《神奇的六边形》(二)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  2. JS开发HTML5游戏《神奇的六边形》(四)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  3. JS开发HTML5游戏《神奇的六边形》(三)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  4. JS开发HTML5游戏《神奇的六边形》(一)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  5. 微信 vue中使用video.js播放m3u8视频,解决安卓自动全屏的问题。

    最近一个项目中需要在微信中播放m3u8格式的视频,刚开始用了 vue-video-player 这个插件,在IOS手机体验良好,本以为完事了, 结果安卓手机一点播放就自动全屏,心态略崩.查了资料说是安 ...

  6. vue使用 video.js动态切换视频源视频源不刷新问题

    网上的垃圾代码太多,最后翻了video.js的官方文档,就这么简单,浪费了我这么久,注:我这里使用的vue //html <video  id="my-player" con ...

  7. angular.js开发 将多页面开发成单页面

    用angulara.js做单页面开发时,由于不能跨页面取数据,又需要传参,可以采用:$scope.step=0/1来解决这个问题,设置初始值为想要的页面即可.

  8. video.js使用教程API

    videojs就提供了这样一套解决方案,他是一个兼容html5的视频播放工具,早期版本兼容所有浏览器,方法是:提供三个后缀名的视频,并在不支持html5的浏览器下生成一个flash的版本. 最新的3. ...

  9. WebView&HTML5-----使用WebView播放HTML5视频文件

    一.问题描述 HTML5提供了很多新的特性比如,视频播放.web本地存储.地理定位.应用缓存.Canvas等,但这些特性需要浏览器的支持,在Android应用中我们可以使用WebView构建Web应用 ...

随机推荐

  1. input上传图片(file),预览图片的两种方法。blob与base64编码

    上传图片时一般都需要预览,我一般用这两种方法来实现.base64编码可以直接上传到后台,后台解析下,得到的文件就会比较小了,省去了压缩图片这一步了. //获取对象input file 的图片地址,放进 ...

  2. [编织消息框架][消息服务]rmi

    RMI(即Remote Method Invoke 远程方法调用) 远程对象: 用于远程客户端调用 必需继承java.rmi.Remote,每个调用方法必须添加java.rmi.RemoteExcep ...

  3. K:常见的正则表达式

    @装载自:http://zxin.cnblogs.com/ 平时对字符串进行校验和处理的时候难免会用到正则表达式,通常采用的方式是去网上寻找相关的正则表达式,之后copy下来进行修改,以使其满足自己的 ...

  4. 针对单个 js 文件禁用 ESLint 语法校验

    问题描述: 在 Vue-cli 创建的项目中,使用了 ESLint 规范代码的项目中 如何针对单个 js 文件禁用 ESLint 语法校验,但整个项目依然保留 ESLint 的校验规则? 解决方案: ...

  5. Python File flush方法应用

    # flush()使用# #!/usr/bin/python# # -*- coding: UTF-8 -*-## # 打开文件# fo = open("runoob.txt", ...

  6. Java学习笔记16---抽象类与接口的浅显理解

    抽象类是由abstract修饰的类,定义方式如public abstract class A{...}. 接口由interface修饰,定义方式如public interface B{...}. 抽象 ...

  7. TabHost用法

    tabhost用两种方法 方法一:Activity继承TabActivity后用getTabHost()方法来获取tabhost(前提:Activity的setContentView要删除,这样布局才 ...

  8. 【ASP.NET 系列】浅谈缓存技术在ASP.NET中的运用

    本篇文章虽不谈架构,但是Cache又是架构中不可或缺的部分,因此,在讲解Cache的同时,将会提及到部分架构知识,关于架构部分,读者可以不用理解,或者直接跳过涉及架构部分的内容 你只需关心Cache即 ...

  9. ElasticSearch 集群监控

    要监控哪些 ElasticSearch metrics? Elasticsearch 提供了大量的 Metric,可以帮助您检测到问题的迹象,在遇到节点不可用.out-of-memory.long g ...

  10. 洛谷 P3370 【模板】字符串哈希

    洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...