云顶娱乐集团

当前位置:云顶娱乐集团 > 云顶娱乐集团 > 新鲜目的,H5直播起航

新鲜目的,H5直播起航

来源:http://www.clubskodakaroq.com 作者:云顶娱乐集团 时间:2019-10-06 17:14

JavaScript 特殊指标 Array-Like Objects 详解

2016/06/26 · JavaScript · Javascript, underscore

正文笔者: 伯乐在线 - 韩子迟 。未经小编许可,禁绝转发!
接待出席伯乐在线 专栏撰稿人。

那篇小说拖了有两周,前几日来跟我们拉家常 JavaScript 中一类特殊的指标 -> Array-Like Objects。

(本文节选自 underscore 源码解读类别小说,完整版请关切 )

H5直播起航

2016/10/31 · HTML5 · 开发

原版的书文出处: 坑坑洼洼实验室   

图片 1

承继的落到实处情势及原型概述

2015/07/15 · JavaScript · 原型, 继承

初稿出处: 名一的博客   

对此 OO 语言,有一句话叫“伊夫rything is object”,尽管 JavaScript 不是严峻意义上的面向对象语言,但假诺想要了然 JS 中的承接,那句话不可能不每十30日铭记于心。

JS 的语法特别灵活,所以有人以为它大约,因为怎么写都以对的;也是有人认为它难,因为很难解释有些语法的宏图,何人能告诉本身干吗 typeof null 是 object 而 typeof undefined 是 undefined 吗?况兼那是在 null == undefined 的前提下。非常多大家自认为“懂”了的知识点,细细研讨起来,照旧会发觉有多数盲点,“无畏源于无知”吧……

Facebook 引发的 HTML5 危机

2012/09/01 · HTML5 · 来源: @AppCan 刘鑫     · HTML5

作者:AppCan 刘鑫

不久前几个音信聚积在共同,颇具韵味。第一 WHATWG 和 W3C 在 HTML5 标准上渐行渐远,继而“推特(TWTR.US)移动采纳公布吐弃 HTML5 的一些,改为纯 Native 方式开荒”,接着又据悉苹果 AppStore 肃杀基于 Web 手艺的 App。那多少个事件对运动互联网行业以来个个都以重磅炸弹,押注 HTML5 的遭受相当大的打击,唱衰 HTML5 发展的借此幸灾乐祸。HTML5真的只是一场政争吗?到底 照片墙为啥甩掉 HTML5?现阶段 HTML5 到底出了哪些难点?

Facebook 放弃 HTML5 主因:慢

“对于 Facebook 的 iOS 原生应用来说,它首要在八个方面有极大的快慢升高:应用运维、分享信息滚动还应该有图片点击查阅。其总体速度大致升高了一倍。那几个版本部分使用了 Facebook Camera 和 照片墙 Messenger 两款应用的代码库:在那之中图片点击查看作用的代码是从 Twitter Camera 移植过来,而荧屏音信是从 推特(TWTR.US)(推特) Messenger 那克隆过来的。这些原生版本是由多个单独的组织开垦,产品老总 Johnson代表今后会丰硕利用公司的代码分享,也会适度向别的团队寻求救助。”

上述摘自 Twitter 的法定博客。博客中牵线到 Facebook 的 iOS 原生应用放任HTML5 后速度获得巨大进步。大家不禁惊叹,为啥HTML5 会比原生 NativeApp 要“慢”非常多?

在近些日子的运动终端设备硬件配备和操作系统优化水平的前提下,大部分根据 HTML5 开荒的 Web 页面会并发延时加载呈现的场地,也便是俗称的卡、慢。极度是在不相同的视图分界面(view)切换之间,这种卡和不通畅的现象会尤为严重。而 Native 应用不会出现这种情形。究其根源,在于浏览器深入分析的运转搭飞机制和原生 Native 的分界面显示机制差别上。如下图所示:

 图片 2

新民主主义革命框起来的局地是原生 NativeApp 的界面呈现机制,轻巧的看起来正是 1 个步骤 —— 显示,因为具备的绘图和渲染职业都由系统一贯完毕。而红框以外的部分富含红框内的有个别是 webkit 大旨的浏览器深入分析页面包车型客车流水生产线。相比较 Native 的 1 个步骤,webkit 的分析进度可谓持久而风尘仆仆。历经分析、组建 Dom 树、获取相应能源、布局、创建渲染树、绘图到体现。所以随意移动终端设备硬件怎么着发展,这一个距离是始终存在的,最四只是随着硬件的升官和软件的优化将以此差别减少到最小乃至忽视。

更倒霉的是。推文(Tweet) 在此以前的 iOS 混合了 HTML5 的活动选拔,使用 HTML5 绘图的页面在 HTML5 开垦上也绝不技艺可言,基本沿用了主流前端开荒框架 jQuery mobile 等的单 View 多 div 的建制。也正是在叁个网页内绘制多少个视图,页面之间的切换其实只是贰个页面内差异区块的切换。这种措施加大了浏览器的渲染和制图职业强度。而且在数据加载和流量上产生十分大的负面影响。如若切换成新页面,此前的页面不开展销毁,则会加小运算量和扩张内部存款和储蓄器据有,而假如销毁又会招致已经下载的数目失效,要重复载入,浪费流量。类似处境在神州的网络和设备状态下会尤为出色。所以 推文(Tweet)(TWT奥德赛.US) 不当的在 Native App 内混合搭配 HTML5 也难免引来客商怨言。

再有,一如广播发表中涉及的,推特(Twitter)(推特)此番的改进升高重倘诺“音信滚动和图纸点击”。要是精通 HTML5 的人,就能够意识,这两点当然是“不应有在现阶段应用 HTML5 达成的”。为啥?小编作为二个基于 HTML5 本事的 Hybrid App 系统的设计者,设计秉承的二个准绳正是“凡是供给’动’的局地和急需多量运算的片段,就最棒利用原生弥补,并不是大势所趋要使用 HTML5 来贯彻”。音讯滚动,这种不停通过转移 Dom 树近而改造渲染再绘图展现的使用处境比较原生 Native 弱势是丰富显眼的。至于图片的有个别就更毫相当少说了,那实际不是 HTML5 眼前长于的局地。HTML5 今后专长的片段是数据量十分小的页面、动画少的页面,特别是跨平台的支出。足够利用好 HTML5 的优势,尽量裁减 HTML5 的弱势,学会用好 HTML5,才是当今以此时期使用 HTML5 开垦的基本点。能够说开采手艺很重点。

现阶段 HTML5 的难题:政争

图片 3

“原生版本是一个独立团队开垦的。”Facebook(TWT普拉多.US)公开的这点也引人深思。原本客商端是 Native 与 HTML5 混合的秘诀,原本的组织也必定有原生的费用能力,为何非要四个独立团队重新成本6 个月实行双重开荒?恐怕这里不能够排除集团内政治因素,而 HTML5 成为多个旧货。HTML5 的政治不止是一个厂家内的,更是全部行当的。八月份,同为 HTML5 制定者的 WHATWG 和 W3C 表示力不能支持续搭档,前者希望制订贰个可以跟随市集或手艺动态的规范;后面一个则要手无寸铁七个“死”的规范,一旦正式公布再也无法修改。

WHATWG 和 W3C 的双管齐下只怕会产生 HTML5 发展的贰个分割线。WHATWG 背后有 谷歌(Google)、苹果,W3C 拉到了特立独行的巨无霸微软。标准是为补益服务的,曾经力推 HTML5 的苹果,未来也闻讯在 AppStore 内打压基于 HTML5 开拓的 App。那苹果究竟是喜欢依旧不爱好 HTML5?喜欢也是真,讨厌也是真。过去Jobs为了灭掉 Adobe 的 Flash,将 HTML5 当成冲刺枪,在移动端干掉了 Flash 之后,面临本人密封生态系统的硬汉利润和 HTML5 世界安阳的愿景做出选取的时候,苹果当然绝不悬念的选项本人的益处。

《Web App 的挑衅(三):入口之争》一文中,小编有演讲本人的意见:入口之争”在存活移动操作系统设计架构下,浏览器很难和顾客桌面争夺大旨入口地位。苹果创设的 iOS 系统正是四个选取优先的体系,无论 HTML5 怎么提升,Web App 如何挣扎,浏览器如何拿钱砸,都抢然而客商桌面包车型客车进口地位。基于 HTML5 的 Web App 的气数被苹果确实把控。Android 系统这几个跟随 iOS 桌面入口观念的半山寨货也从未押注 Web App 而是将以此职务交给了 Chrome OS。所以,不用炒概念,也不用谈现在,用 HTML5 开采原生应用,实际不是单纯套个外壳那么简单才是如今 HTML5 使用的根本和升华的关键。何况苹果封闭扼杀的也只是纯 HTML5 套壳的 App,对于利用混合着搭配方式(满含 推特(TWTR.US)(TWTSportage.US)在此以前的版本)的移位选择依旧维持开放姿态,究竟这种 HTML5 依旧在苹果的生态系统内可控的运营着。

最后

Facebook 的 iOS 丢弃HTML5。幸灾乐祸也好,消沉也罢。变的只是三个施用,HTML5 的矛头和样子不是一个商户能够咸鱼翻身的。现阶段,真正的摸底 HTML5,领悟 HTML5 的开销手艺和在适用的地点用好 HTML5,才是把握时机的首要性。

 

 

 

赞 收藏 评论

图片 4

H5单页面手势滑屏切换原理

2016/03/22 · HTML5 · 2 评论 · 滑屏

最先的文章出处: 一像素   

H5单页面手势滑屏切换是利用HTML5 触摸事件(Touch) 和 CSS3动画片(Transform,Transition)来落到实处的,效果图如下所示,本文轻巧说一下其落到实处原理和第一思路。

图片 5

1、完成原理

假诺有5个页面,种种页面占显示器百分之百宽,则开创一个DIV容器viewport,将其调幅(width) 设置为500%,然后将5个页面装入容器中,并让那5个页面平分整个容器,最终将容器的默许地点设置为0,overflow设置为hidden,那样显示器就暗中同意展现首个页面。

<div id="viewport" class="viewport"> <div class="pageview" style="background: #3b76c0" > <h3 >页面-1</h3> </div> <div class="pageview" style="background: #58c03b;"> <h3>页面-2</h3> </div> <div class="pageview" style="background: #c03b25;"> <h3>页面-3</h3> </div> <div class="pageview" style="background: #e0a718;"> <h3>页面-4</h3> </div> <div class="pageview" style="background: #c03eac;"> <h3>页面-5</h3> </div> </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div id="viewport" class="viewport">
    <div class="pageview" style="background: #3b76c0" >
        <h3 >页面-1</h3>
    </div>
    <div class="pageview" style="background: #58c03b;">
        <h3>页面-2</h3>
    </div>
    <div class="pageview" style="background: #c03b25;">
        <h3>页面-3</h3>
    </div>
    <div class="pageview" style="background: #e0a718;">
        <h3>页面-4</h3>
    </div>
    <div class="pageview" style="background: #c03eac;">
        <h3>页面-5</h3>
    </div>
</div>

CSS样式:

.viewport{ width: 500%; height: 100%; display: -webkit-box; overflow: hidden; pointer-events: none; -webkit-transform: translate3d(0,0,0); backface-visibility: hidden; position: relative; }

1
2
3
4
5
6
7
8
9
10
.viewport{
   width: 500%;
   height: 100%;
   display: -webkit-box;
   overflow: hidden;
   pointer-events: none;
   -webkit-transform: translate3d(0,0,0);
   backface-visibility: hidden;
   position: relative;
}

注册touchstart,touchmove和touchend事件,当手指在显示器上海滑稽剧团动时,使用CSS3的transform来实时设置viewport的任务,举例要来得第四个页面,就安装viewport的transform:translate3d(百分之百,0,0) 就可以, 在此处大家选拔translate3d来代替translateX,translate3d能够积极展开手提式有线话机GPU加速渲染,页面滑动更通畅。

2、主要思路

从指尖放在显示屏上、滑动操作、再到距离荧屏是三个完整的操作进度,对应的操作会触发如下事件:

手指放在显示屏上:ontouchstart

手指在显示屏上海好笑剧团动:ontouchmove

手指离开荧屏:ontouchend

小编们必要捕获触摸事件的那七个级次来成功页面包车型客车滑行:

ontouchstart: 开端化变量, 记录手指所在的义务,记录当前岁月

/*手指放在显示器上*/ document.addEventListener("touchstart",function(e){ e.preventDefault(); var touch = e.touches[0]; startX = touch.pageX; startY = touch.pageY; initialPos = currentPosition; //这次滑动前的发端地点 viewport.style.webkitTransition = ""; //撤除动画功用 startT = new Date().getTime(); //记录手指按下的起来时间 isMove = false; //是不是产生滑动 }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
/*手指放在屏幕上*/
document.addEventListener("touchstart",function(e){
   e.preventDefault();
   var touch = e.touches[0];
   startX = touch.pageX;
   startY = touch.pageY;
   initialPos = currentPosition;   //本次滑动前的初始位置
   viewport.style.webkitTransition = ""; //取消动画效果
   startT = new Date().getTime(); //记录手指按下的开始时间
   isMove = false; //是否产生滑动
}.bind(this),false);

ontouchmove: 得到当前所在地点,总计手指在显示器上的移位差量deltaX,然后使页面跟随移动

/*手指在荧屏上海滑稽剧团动,页面跟随手指运动*/ document.addEventListener("touchmove",function(e){ e.preventDefault(); var touch = e.touches[0]; var deltaX = touch.pageX - startX; var deltaY = touch.pageY - startY; //假如X方向上的位移大于Y方向,则感觉是反正滑行 if (Math.abs(deltaX) > Math.abs(deltaY)){ moveLength = deltaX; var translate = initialPos + deltaX; //当前急需活动到的职分 //如若translate>0 或 if (translate = maxWidth){ //移动页面 this.transform.call(viewport,translate); isMove = true; } direction = deltaX>0?"right":"left"; //推断手指滑动的大势 } }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*手指在屏幕上滑动,页面跟随手指移动*/
document.addEventListener("touchmove",function(e){
   e.preventDefault();
   var touch = e.touches[0];
   var deltaX = touch.pageX - startX;
   var deltaY = touch.pageY - startY;
   //如果X方向上的位移大于Y方向,则认为是左右滑动
   if (Math.abs(deltaX) > Math.abs(deltaY)){
       moveLength = deltaX;
       var translate = initialPos + deltaX; //当前需要移动到的位置
       //如果translate>0 或
       if (translate = maxWidth){
           //移动页面
           this.transform.call(viewport,translate);
           isMove = true;
       }
       direction = deltaX>0?"right":"left"; //判断手指滑动的方向
   }
}.bind(this),false);

ontouchend:手指离开荧屏时,计算显示器最后停留在哪一页。首先计算手指在显示器上的停留时间deltaT,假使deltaT

(1)如果是便捷滑动,则让眼下页面完整的栖息在荧屏中心(须求总括当前页面还会有稍稍必要滑动)

(2)假设是慢速度滑冰动,还要求推断手指在显示屏上海滑稽剧团动的距离,假如滑动的离开没有超过荧屏宽度二分之一,则要回降到上一页,相反则要停留在现阶段页面

/*手指离开荧屏时,总计最后需求逗留在哪一页*/ document.addEventListener("touchend",function(e){ e.preventDefault(); var translate = 0; //计算手指在显示屏上逗留的时间 var deltaT = new Date().getTime() - startT; if (isMove){ //发生了左右滑动 //使用动画片过渡让页面滑动到最终的职责 viewport.style.webkitTransition = "0.3s ease -webkit-transform"; if(deltaT //假诺停留时间小于300ms,则以为是高效滑动,无论滑动距离是稍稍,都停留到下一页 translate = direction == 'left'? currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength; //假诺最终地点超越界限地点,则停留在边界地点 translate = translate > 0 ? 0 : translate; //左侧界 translate = translate //侧面界 }else { //假诺滑动距离小于显示屏的一半,则退回到上一页 if (Math.abs(moveLength)/pageWidth moveLength; }else{ //借使滑动距离超过荧屏的百分之五十,则滑动到下一页 translate = direction == 'left'? currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength; translate = translate > 0 ? 0 : translate; translate = translate maxWidth : translate; } } //实践滑动,让页面完整的呈现到显示屏上 this.transform.call(viewport,translate); } }.bind(this),false);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*手指离开屏幕时,计算最终需要停留在哪一页*/
document.addEventListener("touchend",function(e){
   e.preventDefault();
   var translate = 0;
   //计算手指在屏幕上停留的时间
   var deltaT = new Date().getTime() - startT;
   if (isMove){ //发生了左右滑动
        //使用动画过渡让页面滑动到最终的位置
        viewport.style.webkitTransition = "0.3s ease -webkit-transform";
        if(deltaT //如果停留时间小于300ms,则认为是快速滑动,无论滑动距离是多少,都停留到下一页
            translate = direction == 'left'?
            currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength;
            //如果最终位置超过边界位置,则停留在边界位置
            translate = translate > 0 ? 0 : translate; //左边界
            translate = translate //右边界
        }else {
            //如果滑动距离小于屏幕的50%,则退回到上一页
            if (Math.abs(moveLength)/pageWidth moveLength;
            }else{
                //如果滑动距离大于屏幕的50%,则滑动到下一页
                translate = direction == 'left'?
                currentPosition-(pageWidth+moveLength):currentPosition+pageWidth-moveLength;
                translate = translate > 0 ? 0 : translate;
                translate = translate  maxWidth : translate;
            }
        }
        //执行滑动,让页面完整的显示到屏幕上
        this.transform.call(viewport,translate);
    }
}.bind(this),false);

除去,还要总结当前页面是第几页,并安装当前页码

//总结当前的页码 pageNow = Math.round(Math.abs(translate) / pageWidth) + 1; setTimeout(function(){ //设置页码,DOM操作必要安放子线程中,不然会冒出卡顿 this.setPageNow(); }.bind(this),100);

1
2
3
4
5
6
7
//计算当前的页码
pageNow = Math.round(Math.abs(translate) / pageWidth) + 1;
 
setTimeout(function(){
    //设置页码,DOM操作需要放到子线程中,否则会出现卡顿
    this.setPageNow();
}.bind(this),100);

着力的笔触就那么些,当然在实操进程中还也许有局地细节要求留意,这里就不详细说了,都在代码里能体现出来,源代码已传至Git:https://github.com/git-onepixel/guesture, 有意思味的同学迎接一起探究,(由于时日原因,本示例未有出席history路由),你也足以点击或扫描上边二维码来查阅示例效果:

图片 6

 

3 赞 24 收藏 2 评论

图片 7

Array-Like

JavaScript 中整整皆为目的,那么如何是 Array-Like Objects?顾名思义,就是像数组的指标,当然,数组自身便是目的嘛!稍微有一点基础的同桌,一定了解arguments 便是 Array-Like Objects 的一种,能像数组同样用 [] 去访问 arguments 的元素,有 length 属性,不过却不可能用一些数组的秘诀,如 push,pop,等等。

那正是说,什么样的成分是 Array-Like Objects?我们来会见 underscore 中对其的定义。

JavaScript

var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; var getLength = property('length'); var isArrayLike = function(collection) { var length = getLength(collection); return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; };

1
2
3
4
5
6
var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
var getLength = property('length');
var isArrayLike = function(collection) {
  var length = getLength(collection);
  return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
};

一点也不细略,不是数组,然则有 length 属性,且属性值为非负 Number 类型即可。至于 length 属性的值,underscore 给出了一个上限值 MAX_ARRAY_INDEX,其实是 MAX_SAFE_INTEGE卡宴(谢谢 @HangYang 同学指出) ,因为那是 JavaScript 中能精确表示的最大数字。

思量还应该有何同期能满足上述条件的?NodeList,HTML Collections,稳重考虑,以至还有字符串,恐怕具备 length 属性的对象,函数(length 属性值为形参数量),等等。

前言

近年来忙里偷闲对眼下可比火的摄像直播,做了下商量与研究,掌握其总体达成流程,以及研究移动端HTML5直播可行性方案。

察觉近年来 WEB 上主流的录像直播方案有 HLS 和 RTMP,移动 WEB 端最近以 HLS 为主(HLS存在延迟性难点,也足以依附 video.js 接纳RTMP),PC端则以 RTMP 为主实时性较好,接下去将围绕那二种摄像流契约来张开H5直播大旨分享。

1. 简约对象

既然是讲传承,自然是从最简便易行的指标谈起:

JavaScript

var dog = { name: 'tom' }

1
2
3
var dog = {
  name: 'tom'
}

那正是指标直接量了。每多个指标直接量都以 Object 的子类,即

JavaScript

dog instanceof Object; // true

1
dog instanceof Object; // true

Array-Like to Array

一部分时候,供给将 Array-Like Objects 转为 Array 类型,使之能用数组的一对方法,八个非常轻便严酷而且包容性出色的不二等秘书籍是新建个数组,然后循环存入数据。

我们以 arguments 为例。

function fn() { // Uncaught TypeError: arguments.push is not a function // arguments.push(4); var arr = []; for (var i = 0, len = arguments.length; i < len; i++) arr[i] = arguments[i]; arr.push(4); // [1, 2, 3, 4] } fn(1, 2, 3);

1
2
3
4
5
6
7
8
9
10
11
12
function fn() {
  // Uncaught TypeError: arguments.push is not a function
  // arguments.push(4);
 
  var arr = [];
  for (var i = 0, len = arguments.length; i < len; i++)
    arr[i] = arguments[i];
 
  arr.push(4); // [1, 2, 3, 4]
}
 
fn(1, 2, 3);

不过那不是最高雅的,更崇高的解法大家鲜明都知晓了,use Array.prototype.slice(IE9- 会有标题)。

function fn() { var arr = Array.prototype.slice.call(arguments); arr.push(4); // arr -> [1, 2, 3, 4] } fn(1, 2, 3);

1
2
3
4
5
6
function fn() {
  var arr = Array.prototype.slice.call(arguments);
  arr.push(4); // arr -> [1, 2, 3, 4]
}
 
fn(1, 2, 3);

只怕能够用 [] 代替 Array.prototype 节省多少个字节。

function fn() { var arr = [].slice.call(arguments); arr.push(4); // arr -> [1, 2, 3, 4] } fn(1, 2, 3);

1
2
3
4
5
6
function fn() {
  var arr = [].slice.call(arguments);
  arr.push(4); // arr -> [1, 2, 3, 4]
}
 
fn(1, 2, 3);

假定非得追求质量,用 [] 会新建个数组,品质明确不比后面一个,然而由于内燃机的优化,这一点距离基本得以忽略不计了(所以广大框架用的正是后人)。

干什么这么能够转移?大家简要询问下,首要的原故是 slice 方法只须要参数有 length 属性就能够。首先,slice 方法获得的结果是三个 新的数组,通过 Array.prototype.slice.call 传入的参数(假使为 a),若无 length 属性,也许 length 属性值不是 Number 类型,恐怕为负,那么直接重返多少个空数组,不然再次来到a[0]-a[length-1] 组成的数组。(具体能够看下 v8 源码 )

本来,ES6 提供了更便利的不二秘诀。

var str = "helloworld"; var arr = Array.from(str); // ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]

1
2
3
var str = "helloworld";
var arr = Array.from(str);
// ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d"]

小结下,要是要把 Array-Like Objects 转为 Array,首要推荐Array.prototype.slice,可是出于 IE 下 Array.prototype.slice.call(nodes) 会抛出错误(because a DOM NodeList is not a JavaScript object),所以宽容的写法如下。(但还应该有某个要注意的是,借使是 arguments 转为 Array,最佳别用 Array.prototype.slice,V8 下会一点也不快,具体能够看下 幸免予修业改和传递 arguments 给其余办法 — 影响优化 )

function nodeListToArray(nodes){ var arr, length; try { // works in every browser except IE arr = [].slice.call(nodes); return arr; } catch(err){ // slower, but works in IE arr = []; length = nodes.length; for(var i = 0; i < length; i++){ arr.push(nodes[i]); } return arr; } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function nodeListToArray(nodes){
  var arr, length;
 
  try {
    // works in every browser except IE
    arr = [].slice.call(nodes);
    return arr;
  } catch(err){
    // slower, but works in IE
    arr = [];
    length = nodes.length;
 
    for(var i = 0; i < length; i++){
       arr.push(nodes[i]);
     }  
 
    return arr;
  }
}

一、录像流左券HLS与RTMP

2. 构造函数

JS 中的构造函数与常见函数并不曾什么样两样,只可是在调用时,前边加上了 new 关键字,就真是是构造函数了。

JavaScript

function Dog(name) { this.name = name; } var dog = new Dog('tom'); dog instanceof Dog; // true

1
2
3
4
5
6
7
function Dog(name) {
  this.name = name;
}
 
var dog = new Dog('tom');
 
dog instanceof Dog; // true

七个难题,第一,不加 new 关键字有怎么着后果?

那就是说 Dog 函数中的 this 在上下文(Context)中被演讲为全局变量,具体在浏览器端的话是 window 对象,在 node 遭遇下是三个 global 对象。

第二,dog 的值是何许?很简短,undefined 。Dog 函数没有再次来到任何值,试行达成后,dog 的值自然是 undefined 。

新鲜目的,H5直播起航。关于 new 的经过,这里也顺手介绍一下,这么些对后边精通原型(prototype)有十分大的帮扶:

  1. 成立三个空的靶子,仅包罗 Object 的属性和方法。
  2. 将 prototype 中的属性和措施创造一份引用,赋给新目的。
  3. 将 this 上的性质和办法新建一份,赋给新对象。
  4. 返回 this 对象,忽略 return 语句。

需求鲜明的是,prototype 上的习性和办法是实例间分享的,this 上的天性和章程是种种实例唯有的。

Others

相当多时候,有些方法你感到接收的参数是数组,其实类数组也是能够的。

Function.prototype.apply() 函数接收的第叁个参数,其实也足以是类数组。

var obj = {0: 4, length: 2}; var arr = [1, 2, 3]; Array.prototype.push.apply(arr, obj); console.log(arr); // [1, 2, 3, 4, undefined]

1
2
3
4
var obj = {0: 4, length: 2};
var arr = [1, 2, 3];
Array.prototype.push.apply(arr, obj);
console.log(arr); // [1, 2, 3, 4, undefined]

1. HTTP Live Streaming

HTTP Live Streaming(简称 HLS)是四个根据 HTTP 的录制流协议,由 Apple 公司落到实处,Mac OS 上的 Quick提姆e、Safari 以及 iOS 上的 Safari 都能很好的帮忙 HLS,高版本 Android 也扩充了对 HLS 的支撑。一些分布的客商端如:MPlayerX、VLC 也都协理 HLS 磋商。

HLS 研讨基于 HTTP,而叁个提供 HLS 的服务器须要做两件事:

  • 编码:以 H.263 格式对图像进行编码,以 MP4 或然 HE-AAC 对声音举行编码,最后包装到 MPEG-2 TS(Transport Stream)容器之中;
  • 划分:把编码好的 TS 文件等长切分成后缀为 ts 的小文件,并转移一个.m3u8 的纯文本索引文件;

浏览器选用的是 m3u8 文件。m3u8 跟音频列表格式 m3u 很像,可以大致的以为m3u8 便是满含四个 ts 文件的播放列表。播放器按顺序每一个广播,全部放完再诉求一下 m3u8 文件,获得包含最新 ts 文件的播放列表继续播,周而复始。整个直播进程便是凭仗三个不断更新的 m3u8 和一批小的 ts 文件组成,m3u8 必须动态更新,ts 能够走 CDN。一个头名的 m3u8 文件格式如下:

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000
gear1/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=311111
gear2/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=484444
gear3/prog_index.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=737777
gear4/prog_index.m3u8

可以看出 HLS 商量本质依旧一个个的 HTTP 央浼 / 响应,所以适应性很好,不会碰着防火墙影响。但它也许有二个沉重的欠缺:延迟现象拾叁分刚强。要是各种ts 依据 5 秒来切分,叁个 m3u8 放 6 个 ts 索引,那么起码就能够拉动 30 秒的延迟。如若缩减每一种 ts 的长度,裁减 m3u第88中学的索引数,延时着实会巨惠扣,但会带来更频仍的缓冲,对服务端的伸手压力也会倍增扩充。所以只能依靠实际情状找到三个折中的点。

对于补助 HLS 的浏览器来讲,直接那样写就会播放了:

XHTML

<video src="" height="300" width="400" preload="auto" autoplay="autoplay" loop="loop" webkit-playsinline="true"></video>

1
2
<video src="http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"
height="300" width="400" preload="auto" autoplay="autoplay" loop="loop" webkit-playsinline="true"></video>

注意:HLS 在 PC 端仅帮忙safari浏览器,类似chrome浏览器选拔HTML5 video标签无法播放 m3u8 格式,可径直行使网络一些相比较早熟的方案,如:sewise-player、MediaElement、videojs-contrib-hls、jwplayer。

3. 引入 prototype

前段时间为 Dog 函数加上 prototype,看二个事例:

JavaScript

function Dog(name) { this.name = name; this.bark = function() {}; } Dog.prototype.jump = function() {}; Dog.prototype.species = 'Labrador'; Dog.prototype.teeth = ['1', '2', '3', '4']; var dog1 = new Dog('tom'), dog2 = new Dog('jerry'); dog1.bark !== dog2.bark; // true dog1.jump === dog2.jump; // true dog1.teeth.push('5'); dog2.teeth; // ['1', '2', '3', '4', '5']

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Dog(name) {
  this.name = name;
  this.bark = function() {};
}
 
Dog.prototype.jump = function() {};
Dog.prototype.species = 'Labrador';
Dog.prototype.teeth = ['1', '2', '3', '4'];
 
var dog1 = new Dog('tom'),
    dog2 = new Dog('jerry');
 
dog1.bark !== dog2.bark; // true
dog1.jump === dog2.jump; // true
 
dog1.teeth.push('5');
dog2.teeth; // ['1', '2', '3', '4', '5']

旁观有注释的那三行应该能够知晓“援引”和“新建”的界别了。

那正是说大家平常聊起的“原型链”到底是何等吗?那个术语出以以往续个中,它用于表示对象实例中的属性和情势来自于哪个地点(哪个父类)。好吧,那是作者的表达。

JavaScript

- Object bark: Dog/this.bark() name: 'tom' - __proto__: Object jump: Dog.prototype.jump() species: 'Labrador' + teeth: Array[4] + constructor: Dog() + __proto__: Object

1
2
3
4
5
6
7
8
9
- Object
  bark: Dog/this.bark()
  name: 'tom'
- __proto__: Object
    jump: Dog.prototype.jump()
    species: 'Labrador'
  + teeth: Array[4]
  + constructor: Dog()
  + __proto__: Object  

地方的是 dog1 的原型链,不明了够非常不足直观地汇报“链”那些概念。

  1. 里面,bark 和 name 是概念在 this 中的,所以最顶层能够看看它俩。
  2. 然后,每贰个指标都会有二个 __proto__ 属性(IE 11+),它象征定义在原型上的属性和艺术,所以 jump、species 和 teeth 自然就在那时了。
  3. 最终就径直发展找 __proto__ 中的属性和艺术。

  4. 持续的二种完毕


本文由云顶娱乐集团发布于云顶娱乐集团,转载请注明出处:新鲜目的,H5直播起航

关键词: