雷霄骅 是国内视频、直播的积极布道者,提供了通俗易懂的学习资料,下班途中不幸猝死。

视频文件播放的过程

播放输入地址到播放,播放器的处理过程:

  • 解协议
  • 拆分:视频、音频
  • 解压缩

音箱最后将视频和音频合并

视频的组成

视频由原始帧组成,它每个单元由YUV(亮度、色值、饱和度)组成,黑白电视可以播放,哪怕去了UV。

相比较而言,RGB则不能去除某一个,会导致画面不能正常显示。

两种压缩优化手段:

  • 画面传输,内容会非常大,DCT变换节省传输带宽,类是将数据转化为更小的数据结构存储
  • 运动补偿,没变化的话,数值会很小

DCT + 运动补偿,有很多种标准会实现这样的过程:

  • H.264(需要支付专利费)
  • VP8(谷歌提供,开源)

音频也有类似的标准:

  • AAC

两条流如何进行封装,涉及的就是具体的视频格式:

  • avi
  • mp4。

视频的解压

每一种视频流,能否解压缩,是需要有对应的解码能力才行。

H5最早不支持视频,flash内置了不同格式的解码能力支持.flv格式,目前支持mp4,谷歌想重点推荐的是web movie的格式。

视频内容是根据请求头要的位置来决定返回哪个区段的字节流的内容。视频是需要用到content-length的,服务器知道返回的内容有多少。

直播的传输

直播是不知道有多少流的,因此请求头不会有这个字端。

flv

flash RTMP协议,使用chunk格式作为传输单元,chunk有特定的内容格式,标记每个chunk的内容有多少,以及什么时候代表直播结束。

HTTP-FLV 是一个长链接版本的RTMP。

.flv的视频格式,浏览器端可以获取但是不能播放,B站的开发自己开发了一个“钥匙”,将请求到的视频内容解码播放。能够解这样的视频,必须非常清楚.flv视频格式的加解密的过程,关于flv的视频格式标准涉及90多页的文档。前端解码非常耗时,会导致效率会很低。

解码以后会讲内容,append到video标签中。版本太低的浏览器,可能因为没有某语言特性,可能不支持解码。

hls

苹果公司提出了自己的 hls 协议,hls文件只能在苹果自家的浏览器上播放(确有人实现了hls.js)。

视频被切成 m318(索引文件) 和 ts文件,ts文件是具体播放的问题,理论上其他家浏览器只要能解析ts文件,也能播放该视频。

ts文件是由服务器解决的吗?是,服务器需要进行存储方案的设计。将视频存储为文件、内存,服务器还需要做一些推流、拉流的功能,甚至可以做防抖功能。

  • 淘宝直播 265 转 264付费,因为涉及比较多的计算
  • 非付费只能提供输入什么格式,输出也是什么格式

video.js

淘宝直播使用的video.js就是组合了这两种方案:flv.js + hls.js

疑问

对方的地址怎么爬呢?