无 Flash 时代,让直播拥抱 H5(一)


直播是脱离于文字、图片来说,另外一种社交的方式。各大平台也在深耕这一领域,淘宝直播,花椒,映客,Now 直播,企鹅电竞。本人就职于腾讯 Now 直播前端开发,感觉直播能够尝试的领域真的太多太多,但是,Web 在这块一直是一个痛点。由于没有现成操作流的接口,只能简简单单的通过添加 video.src 尴尬的播放几段回放...... 这样造成的后果就是,在 Web 上,我们根本体会不到实时流畅的观看体验。

而且,根据 8 月份腾讯财报内容,直播贡献的收入增长的飞快。现在,我们也想让 Web 体会一把能够实时观看直播的方式,这应该怎么做呢?W3C 提出了 MSE 的标准,表义上来说就是,让前端能够操作视频流。HLS.js,FLV.js 本身也是基于 MSE 开发的。MSE 的出现,不仅能让 Web 接上直播,而且还可以根据协议自己控制相关的延迟率。

那直播,又和我们今天的主题 MSE/video 有啥关系呢?

在没有 MSE 的时候,直播形式要么在 flash 中播放,要么在客户端播放,要么利用 HLS 来手机端播放。不仅 HTML5 原生播放器的场景几乎可以说是没有,而且 H5 播放的延时性还非常高。最多我们也只能控制一下 视频播放 的表层工作,比如,暂停,播放,快进。例如:

<audio id="demo" src="audio.mp3"></audio>
<div>
  <button onclick="document.getElementById('demo').play()">播放声音</button>
  <button onclick="document.getElementById('demo').pause()">暂停声音</button>
  <button onclick="document.getElementById('demo').volume+=0.1">提高音量</button>
  <button onclick="document.getElementById('demo').volume-=0.1">降低音量</button>
</div>

这样,感觉和写 HTML 没啥区别,我们也并不能对流做一下神奇的操作,比如,跳帧,音视频同步,拿到 I/B/P 帧生成视频图像之类的。这其实只是给了我们另外一个界面的 UI API 而已,并不能让 所有能用代码写的程序,都可以用JavaScript来写 这一非常宏伟的目标。

后面,各台平台支持了 MSE,前端开发者从此也可以进行音视频的相关开发。因为,MSE 的主要工作是可以创建 media stream,并且喂给 video/audio 进行播放。从此,前端可以和写 C++ Java 的人有了共同的话题--二进制流的操作。

MSE 简介

MSE 是实际上是一系列 API 的集合。它的全称为: MediaSourceExtensions,看名字差不多都可以知道,MSE 就是一系列接口的拓展集合,里面包括了一系列 API:Media Source,Source Buffer 等。

我们来看一下 MSE 是如何完成基本流的处理的。

var vidElement = document.querySelector('video');

if (window.MediaSource) {
  var mediaSource = new MediaSource();
  vidElement.src = URL.createObjectURL(mediaSource);
  mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
  console.log("The Media Source Extensions API is not supported.")
}

function sourceOpen(e) {
  URL.revokeObjectURL(vidElement.src);
  var mime = 'video/webm; codecs="opus, vp9"';
  var mediaSource = e.target;
  var sourceBuffer = mediaSource.addSourceBuffer(mime);
  var videoUrl = 'droid.webm';
  fetch(videoUrl)
    .then(function(response) {
      return response.arrayBuffer();
    })
    .then(function(arrayBuffer) {
      sourceBuffer.addEventListener('updateend', function(e) {
        if (!sourceBuffer.updating && mediaSource.readyState === 'open') {
          mediaSource.endOfStream();
        }
      });
      sourceBuffer.appendBuffer(arrayBuffer);
    });
}

上面的代码完成了相关的获取流和处理流的两个部分。其中,主要利用的是 MS 和 Source Buffer 来完成的。URL.revokeObjectURL 主要是用来生成一个内联链接的,例如: blob:http://villainhr/demo_123d1dticn1@df1

MSE 中主要内容就是 MS 和 SourceBuffer。后面几篇内容将是关于 H5 直播技术的一整个系列。

另外,腾讯 TLC 直播大会 5 折票只剩 3 天!!!

如果对直播感兴趣的同学,可以快速下手,今年没了,估计只能等明年的。

原文发布于微信公众号 - 前端小吉米(villainThr)

原文发表时间:2017-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏双十二技术哥

GMTC移动开发者大会纪实(三)像投奔移动互联网一样投奔大前端

在客户端开发,不管是PC还是移动端,Native与Web之争持续了近十年。二者的优劣也很明显:

1114
来自专栏腾讯社交用户体验设计

Windows 10 新特性变化研究 - 腾讯ISUX

1412
来自专栏沈唁志

什么是SEO,SEO为何如此重要?

1021
来自专栏phodal

我的职业是前端工程师二:入门不是应该很简单吗?

入门前端,是一件很难的事吗?在今天,我也没有想好一个答案,也不知道怎样给出一个答案。这个问题并不取决于前端,而是取决于不同人的需求。到底是想要快得一步登天呢,还...

2136
来自专栏IT派

Vue 超越 React 破 10 万星,比球赛精彩

近日,Vue 在 Github 上的星星数第一次超过了 React,React 的主要开发者 Dan 在 Twitter 上表示了祝贺。

882
来自专栏无原型不设计

5个范例告诉你什么是自适应网页设计

移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页?自适应网页设计的出现很好的解...

3093
来自专栏守候书阁

2018前端值得关注的技术

2017悄然过去,2018已经来到。人在进步,技术在发展。2018年前端有哪些领域,技术值得关注,哪些技术会兴起,哪些技术会没落。下面就我个人的判断进行一个预测...

60515
来自专栏即时通讯技术

iOS后台唤醒实战:微信收款到账语音提醒技术总结

微信为了解决小商户老板们在频繁交易中不方便核对、确认到账的功能痛点,产品MM提出了新版本需要支持收款到账语音提醒功能。本文借此总结了iOS平台上的APP后台唤醒...

1491
来自专栏web前端教室

【黄金时代】20年-我眼中的前端开发思想的变迁

现在的前端框架越来越倾向于隐藏细节,不管是react还是vue都是这样。 说是让你更集中精力在业务逻辑,但某个东西在dom层面到底是怎么实现的?不用你用什么,前...

2447
来自专栏程序员的知识天地

程序员电脑桌面是什么样的? 网友: IE浏览器必删, 不能留!

近日,有网友提问道:作为一个程序员,一直使用的都是默认Windows7桌面,最近被妹子吐槽太丑,打算换一个,不知道各位程序员的桌面都长什么样子?

922

扫码关注云+社区