HLS
(Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议,直接把流媒体切片成一段段ts文件,通过m3u8索引文件按序访问ts文件,客户端不停的从服务器获取文件,实现播放音视频的功能。
优势:
- 可以在不同速率的版本间自由切换,实现无缝播放
- 省去使用其他协议的烦恼
劣势:
- 延迟大小受切片大小影响,不适合直播,适合视频点播。
- 实时性差,延迟高。HLS 的延迟基本在 10s+ 以上
- 文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战;
M3U8文件
(有很多种组合, 以下是常见的)
1649215316.ts ---ts文件路径,比如1649215316.ts和此M3U8在同一个目录下, 或者写完整的网络地址也可;
1649215326.ts
.....
常见问题
- 播放器显示的视频长度和实际播放长度不符
- 如果EXTINF 显示的时间, 比下面1649215316.ts的持续时间长或者短,就有可能出现此类情况;
#EXTINF:11.000,
1649215316.ts
TS流(Transport Stream)
组成:
固定长度一般是188字节, header+payload组成; header长度不固定, paylod大小不固定
一般是三层: ES层(Elementary Stream); PES层(Packet Elemental Stream);TS层(Transport Stream)
- ES层就是音频或者视频数据(视频H264裸流, 音频AAC)
- PES层是在ES层数据上加了时间戳等对数据帧的说明信息
- 组成: 头文件+负载, 一般一帧打包成一个PES包;
- PTS :为显示时间戳,用于控制解码后图像的显示时间(顺序), 在PES头文件中
- DTS:为解码时间戳,用于控制码流被解码器解码的时间(顺序),在PES头文件中
- 视频数据两种都要, 音频数据两个值相同, 所以只需要PTS; 为了在正确的时间对数据进行解码和显示,从而达到音频和视频之间的同步
- TS层是在PES层上加入了数据流识别和传输的必要信息。TS文件(码流)由多个TS Packet组成的。
具体生成过程:
- 需要对原始数据(ES),进行一些预处理,视频需要分割nalu(H264编码),并且打上sps,pps,nalu_aud信息.加入PTS/DTS等信息转成PES;
- 将PES包内容分存到一系列固定长度的TS Packet中; (一个pes可能分存到多个ts包中)
- TS Packet中加入定时信息(PCR—固定时刻将最新的STC计数器值复制到TS流中)
- TS Packet中加入其他信息(PSI)
- 连续包形成ts流;
ts文件
PAT: Program Association Table 节目关联表; PAT定义了当前TS流中所有的节目,其PID恒为0x00,它是PSI信息的根节点,要查找节目必须从PAT表开始
PMT: Program Map Table 节目映射表,PAT中给出用户有限自定义, 指定1个或多个节目PID
解析过程:
- Ts流中解析出TS包;
- 从TS包中获取PAT及对应的PMT,从而获取特定节目的音视频PID;
- 通过PID筛选出特定音视频相关的TS包,并解析出PES;
- 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;