HLS

(Http Live Streaming) 是一个由苹果公司提出的基于HTTP的流媒体网络传输协议,直接把流媒体切片成一段段ts文件,通过m3u8索引文件按序访问ts文件,客户端不停的从服务器获取文件,实现播放音视频的功能。

优势:

  • 可以在不同速率的版本间自由切换,实现无缝播放
  • 省去使用其他协议的烦恼

劣势:

  • 延迟大小受切片大小影响,不适合直播,适合视频点播。
  • 实时性差,延迟高。HLS 的延迟基本在 10s+ 以上
  • 文件碎片。特性的双刃剑,ts 切片较小,会造成海量小文件,对存储和缓存都有一定的挑战;

M3U8文件

(有很多种组合, 以下是常见的)

#EXTM3U ---每个M3U8文件第一行必须是这个tag
#EXT-X-VERSION:3---表示 HLS 的协议版本号,该标签与流媒体的兼容性相关。该标签为全局作用域,使能整个 m3u8 文件;每个 m3u8 文件内最多只能出现一个该标签定义。如果 m3u8 文件不包含该标签,则默认为协议的第一个版本
#EXT-X-MEDIA-SEQUENCE:0---第一个ts文件序列号, 若未指定, 默认从0开始
#EXT-X-ALLOW-CACHE---是否允许做cache, 可以在任意问题出现,但是只能出现一次,作用范围是所有的媒体段
#EXT-X-TARGETDURATION:15 ---指定最大媒体段时间长度(秒),EXTINF中指定的时间长度必须小于或是等于这个最大值
#EXTINF:11.000, ---单个媒体文件持续时间是11秒,对应下面1649215316ts文件的长度
1649215316.ts ---ts文件路径,比如1649215316.ts和此M3U8在同一个目录下, 或者写完整的网络地址也可;
#EXTINF:10.000,
1649215326.ts
.....

#EXT-X-ENDLIST ---表示是末尾了,可以在任意位置出现, 但是只能出现一次

常见问题

  • 播放器显示的视频长度和实际播放长度不符
  • #EXTINF:11.000,

    1649215316.ts

  • 如果EXTINF 显示的时间, 比下面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

HLS和M3U8_数据

解析过程:

  • Ts流中解析出TS包;
  • 从TS包中获取PAT及对应的PMT,从而获取特定节目的音视频PID;
  • 通过PID筛选出特定音视频相关的TS包,并解析出PES;
  • 从PES中读取到PTS/DTS,并从PES中解析出基本码流ES;