写这篇文章以前,被本身否定了三连,由于只是出于对.ts格式视频文件的好奇才记录下来的一些笔记,作了个简单整理而已,既然最终决定了发出来,仍是想同各位大佬学习下更多关于视频编码解码、流媒体、大文件上传时断点续传的实现、以及如B站和直播行业实现视频传输时所涉及的一些技术点等,欢迎各位大佬参与讨论。浏览器
先来简要介绍一下什么是MPEG2-TS吧,先献上一段来自百度百科的科普。MPEG2格式你们都经过对DVD的接触而多多少少了解了一些,DVD节目中的MPEG2格式,确切地说是MPEG2-PS,全称是Program Stream,而TS的全称则是Transport Stream。MPEG2-PS主要应用于存储的具备固定时长的节目,如DVD电影,而MPEG-TS则主要应用于实时传送的节目,好比实时广播的电视节目。这两种格式的主要区别是什么呢?简单地打个比喻说,你将DVD上的VOB文件的前面一截cut掉(或者干脆就是数据损坏),那么就会致使整个文件没法解码了,而电视节目是你任什么时候候打开电视机都能解码(收看)的,因此,MPEG2-TS格式的特色就是要求从视频流的任一片断开始都是能够独立解码的。更多请参考百度百科性能优化
大多数视频网站都采用渐进式下载,这意味着视频会下载到个人设备上。视频通常采用流式传输,这意味着咱们不仅是下载了1个文件,而是下载了不少小包(本文指的是.ts传输流切片文件)。好比我最近在极客帮学习视频课程时,看到他们对视频进行了分流加载,并且仍是一个个的.ts格式传输流文件,给视频文件进行加密的同时又是一种性能优化手段,打开浏览器的开发者工具就能够清楚地看到它们在异步加载,此处先贴上2张截图: 服务器
图一就是一个几十兆的视频文件分流加载的效果,图二能够看到这些ts文件的http响应头的
content-type
的值为application/octet-stream
,是个二进制传输的流文件格式,不妨再看看accept-ranges
的值为bytes
。从中还能够看到,他们采用的服务器是Tengine,经查阅资料可知,Tengine是由淘宝网发起的Web服务器项目,已经是个开源项目,此前对Tengine一无所知,还请自行查阅资料😂。网络
服务器使用 HTTP 响应头 Accept-Range 标识自身支持范围请求(partial requests)。字段的具体值用于定义范围请求的单位。当浏览器发现 Accept-Range 头时,能够尝试继续中断了的下载,而不是从新开始。Accept-Ranges
的值能够为bytes
或none
。app
M3U8是
Unicode
版本的M3U,用UTF-8
编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式能够在 iPhone 和 Macbook 等设备播放。m3u8文件实际上是 HTTP Live Streaming(缩写为 HLS) 协议的部份内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。异步
HLS 的工做原理是把整个流分红一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端能够选择从许多不一样的备用源中以不一样的速率下载一样的资源,容许流媒体会话适应不一样的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。 HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不一样,HLS 能够穿过任何容许 HTTP 数据经过的防火墙或者代理服务器。它也很容易使用内容分发网络CDN
来传输媒体流。更详细介绍请参考m3u8文件格式详解工具
m3u8文件实质是一个播放列表(playlist),其多是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但不管是哪一种播放列表,其内部文字使用的都是 utf-8 编码。 当 m3u8 文件做为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片断资源,顺序播放该片断资源,便可完整展现多媒体资源,由此可知,整个视频的总时长就是各个.ts切片资源的时长之和。其格式以下图所示:性能
既然.ts文件只是一种视频切片文件,那么它支持直接播放吗?把它下载到本地后,果真能够播放,真是涨姿式了~~可自行下载此ts文件连接试试,此截图是极客帮最新推出的视频课程《玩转Webpack》其中一小节(这么帅气的大佬固然要晒下~😀):学习
本文参考了如下文章,若是认为本文还不错,欢迎点赞+关注❤️;若是感受个人文章有问题,欢迎在评论区提出,我会第一时间修改……谢谢😊优化