这篇文章只是 M3U、M3U八、HLS、TS 相关的一些基础概念html
"M3U" 和 "M3U8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式能够在 iPhone 和 Macbook 等设备播放。缓存
HLS(HTTP Live Streaming) 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。服务器
效果就是客户端会根据网络情况自动选择不一样码率的视频流,条件容许的状况下使用高码率,网络繁忙的时候使用低码率,而且可以自动在两者之间随意切换。这对移动设备网络情况不稳定的状况下保障流畅播放很是有帮助。实现方法是服务器端提供多码率视频流,而且在列表文件中注明,播放器根据播放进度和下载速度进行自动调整。网络
这是由于两个 TS 片断能够无缝拼接,播放器能连续播放,而 MP4 文件因为编码方式的缘由,两段 MP4 不能无缝拼接,播放器连续播放两个 MP4 文件会出现破音和画面间断,影响用户体验。并且若是要在一段长达一小时的视频中跳转,若是使用单个 MP4 格式的视频文件,而且也是用 HTTP 协议,那么须要代理服务器支持 HTTP range request 获取大文件中的一部分。这样的话,对于代理服务器的性能来讲要求较高。而 HTTP Live Streaming 则只须要根据列表文件中的时间轴找出对应的 TS 片断下载便可,不须要 range request,对代理服务器的要求小不少。全部代理服务器都支持小文件的高效缓存。app
核心,在于对于 m3u8 的文件解析和 经过 XHR 去完成对分片内容二进制文件的获取,而后使用 MSE 的 appendBuffer 去进行 buffer 的封装,而后本身完成合流的工做。ide
M3U
文件是记录了一个索引纯文本文件,能够指定一个或多个多媒体文件的位置,其文件扩展名是“M3U”或者“m3u”。打开它时播放软件并非播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。M3U文件的做用一般是建立指向在线流媒体的播放列表,建立的文件能够轻松访问流媒体。性能
M3U8
是Unicode版本的M3U
,用UTF-8编码。ui
m3u8 文件实质是一个播放列表(playlist),其多是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。编码
当 m3u8 文件做为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片断资源,顺序播放该片断资源,便可完整展现多媒体资源。对于点播来讲,客户端只需按顺序下载片断资源,依次进行播放便可。而对于直播来讲,客户端须要定时从新请求该 m3u8 文件,看下是否有新的片断数据须要进行下载并播放。加密
当 m3u8 做为主播放列表(Master Playlist)时,其内部提供的是同一份媒体资源的多份流列表资源(Variant Strean)。客户能够根据不一样的网络状态选取合适码流的资源,而且最好根据用户喜爱选择合适的资源内容。
m3u8 文件要么是媒体播放列表,要么是主播放列表。但不管是哪一种列表,其有效组成均由两部分构成:
m3u8 文件必须以 utf-8 进行编码,不能使用 Byte Order Mark(BOM)字节序, 不能包含 utf-8 控制字符(U+0000 ~ U_001F 和 U+007F ~ u+009F)。
3u8 文件的每一行要么是一个 URI,要么是空行,要么就是以 # 开头的字符串。不能出现空白字符,除了显示声明的元素。
m3u8 文件中以 # 开头的字符串要么是注释,要么就是标签。标签以 #EXT 开头,大小写敏感。
标签用于指定 m3u8 文件的全局参数或在其后面的切片文件/媒体播放列表的一些信息。
#EXTM3U // 代表该文件是一个 m3u8 文件,必须在文件的第一行
#EXT-X-VERSION:3 // HLS 的协议版本号
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:1572999465 // M3U8直播时的直播切换序列,当播放打开M3U8时,以这个标签的值做为参考,播放对应的序列号的切片
#EXT-X-TARGETDURATION:6 // 该标签指定了媒体文件持续时间的最大值,,播放文件列表中的媒体文件在EXTINF标签中定义的持续时间必须小于或者等于该标签指定的持续时间。该标签在播放列表文件中必须出现一次。
#EXT-QQHLS-PIC-WIDTH:0
#EXT-QQHLS-PIC-HEIGHT:0
#EXT-QQHLS-CK:CRC_16
#EXT-QQHLS-BN:8
#EXT-QQHLS-SEGMENT-TYPE:0
#EXT-QQHLS-SEGMENT_RANGE:1572999448-1572999472
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:11:57+08:00 // 片断取样时间
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006317
#EXT-SID:1572999465
#EXT-SC:SZ=254364&CK=e633
#EXT-BC:SZ=31744&CK=782e
#EXT-BC:SZ=31744&CK=256a
#EXT-BC:SZ=31744&CK=7b04
#EXT-BC:SZ=31744&CK=30dd
#EXT-BC:SZ=31744&CK=6d89
#EXT-BC:SZ=31744&CK=46d
#EXT-BC:SZ=31744&CK=8f4
#EXT-BC:SZ=32156&CK=71b5
#EXTINF:5.000,
100204101-1572999465.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
// EXTINF为M3U8列表中每个分片的duration,描述信息
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:02+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006322
#EXT-SID:1572999466
#EXT-SC:SZ=287264&CK=6abc
#EXT-BC:SZ=35840&CK=aa34
#EXT-BC:SZ=35840&CK=42f1
#EXT-BC:SZ=35840&CK=46f
#EXT-BC:SZ=35840&CK=3fd
#EXT-BC:SZ=35840&CK=75b2
#EXT-BC:SZ=35840&CK=af4f
#EXT-BC:SZ=35840&CK=52a1
#EXT-BC:SZ=36384&CK=86ed
#EXTINF:5.000,
100204101-1572999466.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:07+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006327
#EXT-SID:1572999467
#EXT-SC:SZ=289708&CK=749f
#EXT-BC:SZ=35840&CK=a209
#EXT-BC:SZ=35840&CK=abb9
#EXT-BC:SZ=35840&CK=13ab
#EXT-BC:SZ=35840&CK=40b7
#EXT-BC:SZ=35840&CK=2e10
#EXT-BC:SZ=35840&CK=3a00
#EXT-BC:SZ=35840&CK=62ae
#EXT-BC:SZ=38828&CK=65e5
#EXTINF:5.000,
100204101-1572999467.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:11+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006331
#EXT-SID:1572999468
#EXT-SC:SZ=523016&CK=97c
#EXT-BC:SZ=64512&CK=a072
#EXT-BC:SZ=64512&CK=b80e
#EXT-BC:SZ=64512&CK=13ee
#EXT-BC:SZ=64512&CK=2c70
#EXT-BC:SZ=64512&CK=992c
#EXT-BC:SZ=64512&CK=3c51
#EXT-BC:SZ=64512&CK=a079
#EXT-BC:SZ=71432&CK=a66
#EXTINF:5.000,
100204101-1572999468.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:16+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006336
#EXT-SID:1572999469
#EXT-SC:SZ=670032&CK=6479
#EXT-BC:SZ=82944&CK=dc72
#EXT-BC:SZ=82944&CK=e970
#EXT-BC:SZ=82944&CK=4ca4
#EXT-BC:SZ=82944&CK=3d1b
#EXT-BC:SZ=82944&CK=fa9b
#EXT-BC:SZ=82944&CK=e9d3
#EXT-BC:SZ=82944&CK=ee0b
#EXT-BC:SZ=89424&CK=b998
#EXTINF:5.000,
100204101-1572999469.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:21+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006341
#EXT-SID:1572999470
#EXT-SC:SZ=777756&CK=a13c
#EXT-BC:SZ=96256&CK=e95e
#EXT-BC:SZ=96256&CK=f459
#EXT-BC:SZ=96256&CK=33a6
#EXT-BC:SZ=96256&CK=bb7c
#EXT-BC:SZ=96256&CK=f3e4
#EXT-BC:SZ=96256&CK=635d
#EXT-BC:SZ=96256&CK=67e9
#EXT-BC:SZ=103964&CK=b938
#EXTINF:5.000,
100204101-1572999470.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:27+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006347
#EXT-SID:1572999471
#EXT-SC:SZ=479212&CK=c493
#EXT-BC:SZ=59392&CK=dec8
#EXT-BC:SZ=59392&CK=1ee8
#EXT-BC:SZ=59392&CK=b9bf
#EXT-BC:SZ=59392&CK=8b9c
#EXT-BC:SZ=59392&CK=29fe
#EXT-BC:SZ=59392&CK=493
#EXT-BC:SZ=59392&CK=ae5f
#EXT-BC:SZ=63468&CK=630
#EXTINF:5.000,
100204101-1572999471.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
#EXT-X-PROGRAM-DATE-TIME:2019-11-06T10:12:32+08:00
#EXT-QQHLS-MACHINEID:56448
#EXT-QQHLS-START-TIME:1573006352
#EXT-SID:1572999472
#EXT-SC:SZ=266396&CK=648
#EXT-BC:SZ=32768&CK=a085
#EXT-BC:SZ=32768&CK=8233
#EXT-BC:SZ=32768&CK=1831
#EXT-BC:SZ=32768&CK=4042
#EXT-BC:SZ=32768&CK=f0eb
#EXT-BC:SZ=32768&CK=cd3a
#EXT-BC:SZ=32768&CK=e245
#EXT-BC:SZ=37020&CK=f6e3
#EXTINF:5.000,
100204101-1572999472.ts?cdncode=/18907E7BE0798990/&HLSP2P=1&buname=qqlive&sdtfrom=10002212&vkey=F1FE87B5E6D84B6FEFBB683D7C2558C08C8CF7B6E752E05C689F1117D651C359E4C7460F44AF4CA4D54188D17A34DB8F3D1E1A9B03F5F5509AFFC93EEA5B90B835EB1E096C8EA81447313AD2761912137D4F692E8AEC2D52E0E3ACD02E09272F82A1FC8573388BDE57FBE56A424E01BA
复制代码
其余的一些经常使用标签:
EXT-X-DISCONTINUITY
该标签代表其前一个切片与下一个切片之间存在中断。EXT-X-DISCONTINUITY
的一个经典使用场景就是在视屏流中插入广告,因为视屏流与广告视屏流不是同一份资源,所以在这两种流切换时使用 EXT-X-DISCONTINUITY 进行指明,客户端看到该标签后,就会处理这种切换中断问题,让体验更佳。
EXT-X-KEY
媒体片断能够进行加密,而该标签能够指定解密方法。
EXT-X-PLAYLIST-TYPE
:代表流媒体类型。全局生效。该标签为可选标签。 可选值以下:
VOD
即 Video on Demand,表示该视屏流为点播源,所以服务器不能更改该 m3u8 文件;EVENT
表示该视频流为直播源,所以服务器不能更改或删除该文件任意部份内容(可是能够在文件末尾添加新内容)注:VOD 文件一般带有 EXT-X-ENDLIST
标签,由于其为点播源,不会改变;而 EVEVT 文件初始化时通常不会有 EXT-X-ENDLIST 标签,暗示有新的文件会添加到播放列表末尾,所以也须要客户端定时获取该 m3u8 文件,以获取新的媒体片断资源,直到访问到 EXT-X-ENDLIST 标签才中止。
EXT-X-PROGRAM-DATE-TIME
该标签使用一个绝对日期/时间代表第一个样本片断的取样时间。
EXT-X-MEDIA-SEQUENCE
:表示播放列表第一个 URL 片断文件的序列号,每一个媒体片断 URL 都拥有一个惟一的整型序列号。 每一个媒体片断序列号按出现顺序依次加 1。媒体片断序列号与片断文件名无关。若是该标签未指定,则默认序列号从 0 开始。
EXT-X-ENDLIST
若出现EXT-X-ENDLIST
标签,则代表M3U8文件不会再产生更多的切片,能够理解为该M3U8已中止更新,而且播放分片到这个标签后结束。M3U8不只仅是能够做为直播,也能够做为点播存在,在M3U8文件中保存全部切片信息最后使用EXT-X-ENDLIST
结尾,这个M3U8即为点播M3U8。EXT-X-ENDLIST
标签可能会出如今播放列表文件的任何地方,可是不能出现两次或以上。
EXT-X-STREAM-INF
EXT-X-STREAM-INF
标签出如今M3U8时,主要是出如今多级M3U8文件中时,例如M3U8中包含子M3U8列表,或者主M3U8中包含多码率M3U8时;该标签后须要跟一些属性,下面就来逐一说明一下这些属性:
BANDWIDTH
:BANDWIDTH
的值为最高码率值,当播放EXT-X-STREAM-INF
下对应的M3U8时占用的最大码率(必要参数)。AVERAGE-BANDWIDTH
:AVERAGE-BANDWIDTH
的值为平均码率值,当播放EXT-X-STREAM-INF
下对应的M3U8时占用的平均码率(可选参数)。CODECS
:CODECS的值用于声明EXT-X-STREAM-INF
下面对应M3U8里面的音视频编码、视频编码的信息(可选参数)。RESOLUTION
:M3U8中视频的宽高信息描述(可选参数)。FRAME-RATE
:子M3U8中的视频帧率(可选参数)。EXT-X-ENDLIST
标签时,不管这个M3U8列表中有多少个分片,播放分片都是从倒数第三片开始播放,若是不满3片则不该该播放。固然若是有些播放器作了特别定制了,则能够不遵守这个原则。X-DISCONTINUTY
标签来解决这个错误。有两种请求 m3u8 播放列表的方法:一是经过 m3u8 的 URI 进行请求,则该文件必须以 .m3u8
或 .m3u
结尾;二是经过 HTTP 进行请求,则请求头 Content-Type
必须设置为 application/vnd.apple.mpegurl
或者 audio/mpegurl
。
空行和注释行在解析时都忽略。
媒体播放列表(Media Playlist)的流资源总时长就是各切片资源的时长之和。
TS(Transport Stream)是一种音视频封装格式,全称MPEG2-TS。MPEG-TS主要应用于实时传送的节目,好比实时广播的电视节目。
TS文件(流)能够分为三层:TS层(Transport Stream)、PES层(Packet Elemental Stream)、ES层(Elementary Stream)。
ES层就是音视频数据,PES层是在音视频数据上加了时间戳等对数据帧的说明信息,TS层是在PES层上加入了数据流识别和传输的必要信息。TS文件(码流)由多个TS Packet组成的。
TS文件(码流)的分层结构图
加密后的ts文件不能直接合并或播放,须要使用key对每一个ts文件解密。
参考资料: