H5视频播放

html5新增了音频/视频(audio/video)的API。
这次我们先来了解video。
video 元素支持三种视频格式:
.ogg
.mp4
. webm

<video src="movie.ogg" >
  你的浏览器不支持video
</video>

video 元素允许多个 source 元素。source 元素可以链接不同的视频文件。浏览器将使用第一个可识别的格式:

<video width="320" height="240" controls="controls">
  <source src="movie.ogg" type="video/ogg">
  <source src="movie.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>

知道视频在移动端播放会出现很多坑,我们来踩踩坑。首先对video的Api还不熟悉,所以先不考虑移动端的兼容问题。首先来实现video的播放等功能。
video Api


这是我写的html元素标签。
  现在我是把Dom元素和js都放在了body标签中。dom中绑定的onclick之类的事件,必须是全局的才能够正确获取。像settimeout函数里面定义的函数不是全局的,是局部的。出了settimeout函数就获取不到了,所以绑定的事件不能写在任何函数里。如果不想污染全局可以选择写一个匿名自执行函数里写响应事件,然后通过addEventListener绑定监听,而不是在html绑定监听事件。


html中事件里面的this代表什么?
this作为事件的参数传递的话,指的是触发事件的html element。如果不传this,第一个参数是event, event.target 和这里的this是等价的。
onclick事件之类的event.offsetX 和 event.target.offsetWidth。一个在target上获取。一个直接获取。

var video = document.querySelector('.videoSource');
获取视频总时长

video元素属性duration返回音频视频长度,单位为s。初始化显示获取需要用到video的loadeddata事件。

鼠标点击快进或者后退

直接修改video.currentTime属性即可。

全屏播放

h5暴露了一个webkitRequestFullScreen方法,可以让每个dom都请求全屏,当然video标签也可以使用。
但是一些安卓机不支持该属性,如小米手机,所以需要在调用的时候进行一下判断

if (video.webkitSupportsFullscreen) {
        video.webkitEnterFullscreen();
 } else {
        video.webkitRequestFullScreen();
}

页面生成二维码扫描

这几天总看h5通过一个二维码扫描就可以访问了。于是搜了一下。
二维码生成方法
只需在页面中加一段代码

      thisURL = document.URL;  
      strwrite = 
      "<img src='https://chart.googleapis.com/chart?cht=qr&chs=150x150&choe=UTF-8&chld=L|4&chl="
        + thisURL + "' width='150' height='150' alt='网址URL 二维码生成' />"; 
      document.write( strwrite );  

二维码是生成了,但是手机扫描却会出现网络错误打不开,我本地写了个项目,打开是file:// 这种方式。其实手机扫二维码也就是通过手机打开的生成二维码的document.URL。手机上去访问file:// 肯定是加载不到的。于是我就用http-sever生成一个web服务器。一般可以生成两个可访问的地址

 http://127.0.0.1:8000
 http://172.16.222.157:8000

我开始用第一个地址打开,不行,还是网络错误。因为手机也无法识别127.0.0.1。我突然就想到一个局域网内是可以互相访问ip的。第二个不就是ip吗。我的手机和电脑都连接的是公司的无线,应该可以访问了吧。果然换成第二个地址手机就可以访问了。不过微信扫描二维码会出现缓存问题。
android video播放进度控制

页面内联播放问题

在iOS Safari和一些安卓的一些浏览器下播放视频的时候,不能在h5页面中播放视频,系统会自动接管视频,就是会默认全屏播放。如何禁止呢?
增加属性webkit-playsinline playsinline就可以了
<video id="player" webkit-playsinline playsinline >

移动端手势触发事件

移动端多用touch事件,而不是click事件。并且click有两个著名的bug,移动端300ms点击延迟和点击穿透问题。所以有很多库对事件进行封装,用封装的tap代替click事件。
我们这个视频播放的例子主要是看video在手机端的一些问题。设计手势事件很少,并且设置了content="width=device-width"所以移动端浏览器自动就取消了300ms的延迟。

遇到的问题
  1. 给video绑定的loadeddata事件怎么不触发了呢
    找了快一早上的原因。
      最后发现问题的根本是因为link引入外部css会阻塞后面内联脚本的执行。所以css还没加载完,video元素就已经加载完了因为css不会会阻塞DOM的加载会阻塞DOM的渲染。这时候该video响应的loadeddata绑定的事件没响应呢video的状态都已经变了,早都已经过了。结果等css加载完成之后,已经不会响应loadeddata的事件了。如果绑定的是onplay事件还是可以响应的,因为这个是视频播放时候才会触发的。或者把css异步加载,给link添加media="none"就可以异步加载
  2. 给video绑定loadeddata的函数传入一个函数执行就可以触发?
       答案肯定是否定的,给ele.addEventListener('click', func)这是给ele绑定click事件,但是如果变成ele.addEventListener('click', func())。就是js解析到这句会执行func函数。如果func函数没有return一个函数,则就没有绑定上事件。
  3. 判断是否移动端
//如果没有触摸事件 判定为PC  
var ua = navigator.userAgent.toLowerCase();
            var isTocuh = ("ontouchstart" in window) || (ua.indexOf("touch") !== -1) || (ua.indexOf("mobile") !== -1);
  1. 视频旋转尺寸问题
     防止视频尺寸因为宽高设置乱掉,需要给video设置object-fit: contain;
     把视频旋转90deg。再把宽和高重新设置一下。这就可以实现旋转全屏了呀。可是结果出来为什么是这个样子?

左边和下边都有空隙并且视频内容偏移了。
所以不能单单的旋转90°,还要设置translate

var info = [
                   document.documentElement.clientWidth || document.body.clientWidth,
                   document.documentElement.clientHeight || document.body.clientHeigth
           ],
                   w = info[0],
                   h = info[1],
                   cha = Math.abs(h - w) / 2;
videoBox.style.transform = 'translate(-' + cha + 'px,' + cha + 'px) rotate(90deg)';

H5 直播避坑指南
html5 实现video标签的自定义播放进度条
HTML5 VideoAPI,打造自己的Web视频播放器

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,463评论 25 707
  • HLS是什么 HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS...
    富士里阅读 65,230评论 9 27
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 我有一个摩羯座好友。我昨晚做了个恐怖的梦,以下是我醒来后在有道云上做的梦境回忆记录: 昨晚梦见自己的脚趾头大脚趾裂...
    童心麻麻阅读 476评论 3 2
  • 找出去年戴的帽子,本来想洗洗的,看到帽子里有根头发,应该是妈妈的,舍不得洗了,把那根头发又放回去了。
    小圣嘟嘟阅读 114评论 0 0