视频文件M3U8和TS格式切片,讨论一下?

写这篇文章之前,被自己否认了三连,因为只是出于对.ts格式视频文件的好奇才记录下来的一些笔记,做了个简单整理而已,既然最终决定了发出来,还是想同各位大佬学习下更多关于视频编码解码、流媒体、大文件上传时断点续传的实现、以及如B站和直播行业实现视频传输时所涉及的一些技术点等,欢迎各位大佬参与讨论。

什么是TS切片

先来简要介绍一下什么是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一无所知,还请自行查阅资料?。

补充Accept-Range

服务器使用 HTTP 响应头 Accept-Range 标识自身支持范围请求(partial requests)。字段的具体值用于定义范围请求的单位。当浏览器发现 Accept-Range 头时,可以尝试继续中断了的下载,而不是重新开始。Accept-Ranges的值可以为bytesnone

  • bytes 范围请求的单位是bytes(字节)。
  • none 其中none表示不支持任何范围请求单位,由于其等同于没有返回此头部,因此很少使用。不过一些浏览器,比如IE9,会依据该头部去禁用或者移除下载管理器的暂停按钮。

浅谈m3u8文件格式

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文件简介

m3u8文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。 当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源,由此可知,整个视频的总时长就是各个.ts切片资源的时长之和。其格式如下图所示:

继续探究ts文件

既然.ts文件只是一种视频切片文件,那么它支持直接播放吗?把它下载到本地后,果然可以播放,真是涨姿势了~~可自行下载此ts文件链接试试,此截图是极客帮最新推出的视频课程《玩转Webpack》其中一小节(这么帅气的大佬当然要晒下~?):

请求m3u8播放列表的方法

  • 一是通过m3u8的URI进行请求,则该文件必须以.m3u8或.m3u结尾;
  • 二是通过 HTTP 进行请求,则请求头 Content-Type 必须设置为 "application/vnd.apple.mpegurl" 或者 "audio/mpegurl";

写在最后

本文参考了以下文章,如果认为本文还不错,欢迎点赞+关注❤️;如果感觉我的文章有问题,欢迎在评论区提出,我会第一时间修改……谢谢?

  • 百度百科-TS文件
  • m3u8文件格式详解
  • 视频内容加密封装技术研究

你可能感兴趣的:(视频文件M3U8和TS格式切片,讨论一下?)