H5直播系列二 MSE(Media Source Extensions) - 简书

1、Video标签

拥有解封装和解码功能的浏览器自带播放器

随着视频点播、直播等视频业务的发展,视频通过流媒体传输协议(目前常用的有两种,MPEG-DASH和Apple的HLS)从服务器端分发给客户端,媒体内容进一步包含在一层传输协议中,这样<video>就无法识别了。以HLS为例,将源文件内容分散地封装到了一个个TS文件中。

仅靠<video>标签无法识别这样的TS文件,那么就引入了MSE拓展来帮助浏览器识别并处理TS文件,将其变回原来可识别的媒体容器格式,这样<video>就可以识别并播放原来的文件了。那么支持HTML5的浏览器就相当于内置了一个能够解析流协议的播放器。

hls实际会先通过 ajax(loader 是可以完成自定义的) 请求 m3u8文件,然后会读取到文件的分片列表,以及视频的编码格式,时长等。随后会按照顺序(非 seek )去对分片进行请求,这些也是通过 ajax 请求二进制的文件,然后借助 Media Source Extensions 将 buffer 内容进行合流,然后组成一个可播的媒体资源文件。

2、MSE的功能一:转封装(FLV/FMP4->mp4)

很多媒体源都是适用Flash播放的FLV格式:而由于历史遗留问题(HTML5 视频标准最终被广泛支持以前,Flash 在 Web 视频播放方面有着统治地位),视频网站的视频源和转码设置,很多都高清源都是适用于 Flash 播放的 FLV 格式,只有少量低清晰度视频是 mp4 格式,webm 和 ogg 更是听都没听说过。比如优酷只有高清和标清才有 MP4 源,超清、1080P 等,基本都是 FLV 和 HLS(M3U8)的视频源(在 Windows PC 上支持 M3U8 比支持 FLV 更复杂,我们不做过多赘述)。

而Video标签只支持mp4、webm、ogg 等封装的264/265码流

因此MSE应运而生,他可以把FLV格式转换成mp4格式。

B 站开源的 flv.js 就是这个技术的一个典型实现。B 站的 PC HTML5 播放器,就是 MSE 技术,将 FLV 源用 JS 实时转成 HTML5 支持的视频流编码格式(其实就一个文件头的差异(这里文件头改成容器。感谢评论区谦谦的指教,是容器的差异,容器不只是文件头)),提供给 HTML5 播放器播放。

FLV和MP4的对比,为什么不直接采用mp4格式

  • 一方面是历史遗留问题,由于视频网站前期完全依赖 Flash 播放而选择 FLV 格式;
  • 另一方面,如果仔细研究过 FLV/MP4 封装格式,你会发现 FLV 格式非常简洁,而 MP4 内部 box 种类繁杂,结构复杂固实而又有太多冗余数据。FLV 天生具备流式特征适合网络流传输,而 MP4 这种使用最广泛的存储格式,设计却并不一定优雅。

MP4和FMP4对比:

对于普通 MP4 文件,整个mp4文件的的meta数据都在文件头,所有媒体数据为整体一块。当文件比较大的时候,meta数据就比较大。这样对mp4文件的本地播放是没有问题。但对于一些视频播放网站而言,用户的播放器必须下载全meta数据才能开始播放,这就意味着用户的缓冲时间将因为mp4文件的存储结构而延长。目前一种解决方法是将大的mp4文件切成物理分离的多段,使得每段的meta都比较小,从而在一定程度上减少缓冲时间。 fMP4 是一个流式的封装格式,这样更适合在网络中进行流式传输,而不需要依赖文件头的metadata。

3、MSE的功能二:自适应比特率播放

我们已经可以在 Web 应用程序上无插件地播放视频和音频了。但是,现有架构过于简单,只能满足一次播放整个曲目的需要,无法实现拆分/合并数个缓冲文件。

使用MSE,我们可以:①把通常的单个媒体文件的 src 值替换成引用 MediaSource 对象(一个包含即将播放的媒体文件的准备状态等信息的容器)以及引用多个 SourceBuffer 对象(组成整个串流的不同媒体块)的元素。②能够根据内容获取视频的大小、频率、内存占用详情,从而进行更加精准地控制。 这是基于它可扩展的 API 建立的自适应比特率流客户端(例如DASH 或 HLS 的客户端)的基础。

4、使用createObjectURL将MediaSource和video标签连接起来

var mediaSource = new MediaSource;
//console.log(mediaSource.readyState); // closed
video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', sourceOpen);

MS 的实例通过 URL.createObjectURL() 创建的 url 并不会同步连接到 video.src。换句话说,URL.createObjectURL() 只是底层流(MS)和 video.src 的连接中间者,一旦两者连接到一起之后,该对象就没用了。那么什么时候 MS 才会和 video.src 连接到一起呢?创建实例都是同步的,但是底层流和 video.src 的连接是异步的。MS 提供了一个 sourceopen 事件给我们进行这项异步处理。一旦连接到一起之后,该 URL object 就没用了,处于内存节省的目的,可以使用 URL.revokeObjectURL(vidElement.src) 销毁指定的 URL object。

mediaSource.addEventListener('sourceopen', sourceOpen);
function sourceOpen(){URL.revokeObjectURL(vidElement.src)
}

5、设置编码类型mime字符串

'avc1.42E01E'

有一处要注意,后面两个值(profile_compability、AVCLevelIndication)只是浏览器用于判断自身的解码能力能否满足需求,所以不需要和视频完全对应,更高也是可以的。

MSE和Video标签的关系相关推荐

  1. 粗识 HTML5 video 标签和MSE媒体源扩展

    前言 当前网页上能够搜到的HTML5和MSE相关的内容一抓一大把,本文的目的是尽量用较短的篇幅,简述浏览器为何要使用HTML5的MSE扩展.这也是在我最开始接触有关内容时的最大的疑惑,希望对大家有所帮 ...

  2. php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...

    HTML5 video标签(播放器)学习笔记(一):使用入门 近有在学习html5中video标签(播放器)的使用,这里做一些学习笔记,方便自己查阅和记录,本文是第一篇,将介绍的是使用该标签初始化该做 ...

  3. html5视频播放器脚本怎么用,HTML5 video标签(播放器)学习笔记(一):使用入门...

    近有在学习html5中video标签(播放器)的使用,这里做一些学习笔记,方便自己查阅和记录,本文是第一篇,将介绍的是使用该标签初始化该做的哪些工作. 网上的教程其实也不少了 w3cschool里面的 ...

  4. 用video标签流式加载

    video标签 浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频. 这个过程是浏览器来加载video的. 这种方式有什么问题吗? mp4文件不能流式加载 ...

  5. video标签学习 xgplayer视频播放器分段播放mp4

    文章目录 学习链接 目标 video标签自带视频和制作的视频区别 video标签的src属性 本地视频文件 前端代码 播放效果 服务器视频文件 示例1 后端代码 前端代码 播放效果 示例2 后端代码 ...

  6. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    2019独角兽企业重金招聘Python工程师标准>>> <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放c ...

  7. video标签poster属性在安卓微信中不生效问题解决

    video标签poster属性在安卓微信中不生效问题解决 参考文章: (1)video标签poster属性在安卓微信中不生效问题解决 (2)https://www.cnblogs.com/shicha ...

  8. html video标签问题,用HTML5 video标签的一系列问题

    H5标签的video,我想写过前台代码的人,都不会陌生吧.但video标签还是有少量问题. 一.PC端的兼容问题: H5的标签不兼容ie8包括ie8以下的浏览器:处理办法:用js的库video.js, ...

  9. HTML5中video标签与canvas绘图的使用

    原文:https://www.cnblogs.com/zhuzhenwei918/p/6822834.html video标签的使用 video标签定义视频, 它是html5中的新标签, 它的属性如下 ...

最新文章

  1. STP生成树协议与MSTP的基本原理与简单配置
  2. 医学专用计算机证,问一下,医学生考计算机2级证和心理咨询师证有用吗
  3. [企业内部https证书配置]tomcat 7配置https的完整历程
  4. IDEF企业软件系统建模方法
  5. 多种方式Map集合遍历
  6. java一键生成海报_小程序生成海报(java后端)
  7. Thinkphp响应式第三四方聚合支付平台源码
  8. Nature:阐明肿瘤代谢的脆弱性
  9. 从零开始学习C语言 Day 036
  10. Python 实现 2048 游戏
  11. Illegal character
  12. 又一微信自动化框架wxauto横空出世了!
  13. 你的个人所得税完税证明看准了吗?
  14. 你有没有为自己拼过命?
  15. 分布式架构、大数据、机器学习、搜索、推荐、广告
  16. OPPO程序员一语惊人,你认同吗?
  17. 少儿编程Scratch学习教程5--基本操作(二)动画例子
  18. 微信公众平台如何操作迁移?迁移公证步骤是什么?
  19. 维特WT931——制作支持ROS的IMU惯性导航传感器
  20. 王刚日记:网络兼职赚钱重点需要学哪些技能?

热门文章

  1. 大数据开源框架之基于Spark的气象数据处理与分析
  2. 抖音视频怎么拼接?分享一款功能强大的软件
  3. 电影产业价值意义分析,影片定义至关重要
  4. CentOS7安装KVM虚拟机
  5. OpenGL学习----程序库编译-glew
  6. STM32F1常用外设介绍(超详细35000字介绍)
  7. c语言怎么录入上下作用,c语言怎么使用键盘上的上下左右键
  8. android切换账号登录界面,华为游戏切换安卓账号登陆界面
  9. 气动薄膜单座调节阀种类划分
  10. C++ Primer Plus习题及答案-第十四章