HLS协议解析

简介: HLS协议解析

介绍

HLS(HTTP Live Streaming) 协议是APPLE 提出的一种替代rtmp协议的直播传播协议

HLS 使用HTTP作为底层传输协议,传输的内容包括了m3u8文件和TS分片,其中m3u8文件用于记录可以播放哪些分片,

M3u8解析

TS解析

ts分片中包含header+Payload

  • header用于描述Payload中数据的类型
  • Payload中既可以是PSI(Program Specific Information)元数据 也可以是音视频数据

苹果推出的HLS协议对MPEG2规范中的PSI/SI数据种类做了精简 只保留了两种最基本的PSI数据,也就是PAT(Program Association Table)和PMT(Program Map Table)

PAT用于指明PMT使用的PID(Program ID)

PMT用于指明音视频流中的PID

TS header 结构图

每个TS包由Header和Payload组成,其中Header占4字节,Payload占184字节,TS包总长度为188字节

Header的四个字节分为8个段

一般通过PID判断Payload数据类型 比如PID==0x00表示Payload中存放的是元数据类型

adaptation_filed_control 为0b10或0b11时存在适配域 该域结构如下

适配域中各字段及其含义如下:

PAT与PMT作用

PAT是PSI/SI数据(元数据)的一种PSI/SI包括很多种数据,如PAT PMT SDT等 主要作用是帮助查找具体的频道。

比如TS流中包含了两个视频通道1和2通过PSI找到对应通道的PID 然后再通过PID找到对应的音视频流即可

在PSI数据中 最重要的两种数据是PAT和PMT PAT和PMT之间的树型关系,PAT中记录了有多少了PMT PMT则代表一个频道,通过PMT就能拿到

音视频数据对应的PID,从而获得到音视频数据。

PAT与PMT会周期发送 发送间隔一般为100ms 最小的间隔最好不超过25ms 如果间隔太小的话PSI占用的带宽就会增多,从而导致音视频延时变大

播放器播放TS流的基本过程 :解析TS流时,首选获得PAT信息,之后通过PAT找到PMT,在通过PMT找到音视频流,。。。

PAT数据的PID是固定值0x00解析TS流时,首先需要对每个传过来的TS包进行遍历,直到找到TS Header中的PID值为0x00的包,然后从Payload中找到PAT数据

需要注意的是如果TS Header中adaptation_field_control域指明存在adaption_field域,则在Payload中要跳过该域;另外,如果在TS Header中payload_unit_start_indicator置位,则说明真实数据之前还有一个字节的指针域,跳过这个域才能拿到真正的数据

PAT与PMT 部分相同的数据

PAT特有的数据

table_item

每个table_item 代表一个PMT 通过它可以找到想要观看的频道

PMT特有的数据

stream_info包含的字段

PMT 中stream_info中的信息是最关键的,它包含了数据流的类型和自身PID,可以根据这个两个字段判断PMT描述的是音频流还是视频流以及如何拿到该音视频流

TS中的音视频流

通常音视频编码器出来的数据时ES(Elementary Stream)基本流。以视频为例ES是指编码后的一个个视频帧,每个视频帧称为一个NAL(Network Abstraction Layer)单元。

在ES前面加上一个header 就形成了PES(Packet Elementary Stream)而 TS中的音视频流指的是具有共同时间基的一系列PES包形成的数据流

从上图中可以发现 ES 、PES 与TS之间的关系,

音视频原始数据经过音视频编码器后生成的压缩后的一系列音视频帧;再经过PES打包器打包之后,这些音视频帧就变成了PES包;最后对每一个PED包进行切割,将切割后的数据塞到TS包中(切割时候就会塞入红色的TS Header),这样就形成了TS的音视频流

PES Header

PES 由PES Header和PES Payload构成

PES Header 由Base Header和Optional Header组成

其中Base Header 占用6字节

Optional Header 可由3~259个字节组成

Base Header 分为3个域,分别为start_code 用于标识PES包的开始,stream_id用于标识是音频流还是视频流

其中0xCD~0xDF标识音频 0xE0~0xEF标识视频,packet_length PES的长度,这个长度是从packet_length 字段后的第一个字节开始算起,此值为0表示长度不受限制

start_code与stream_id组成的4字节成为PES的起始码,两个起始码之间的长度是一个PES包的总长度。

Optional Header

从上图中可知 Optional Header的前两位是固定值 必须位0b10后面的几个标志位不重要一般忽略,

PTS_DTS_flags标志位很重要,存在4种值

  • 0b00 代表PTS和DTS都不存在
  • 0b10 代表只有PTS 没有DTS
  • 0b11 表示PTS DTS 同时存在
  • 0b01 被禁止的 不能使用

header_info_length 标识了Optional Header 中是否有信息区域,如果值不为0的话说明后面还跟着信息区。而信息区中的内容就是根据前面Optional Header的几个标志位来决定 比如是否包含PTS DTS

PTS(Presentation Timestamp) DTS(Decode Timestamp)每个字段包含了40个bit 其中高4位是固定值 0010代表PTS 而0001代表DTS 剩下的36bit分为三部分

  • 3bit+1
  • 15bit+1
  • 15bit+1
目录
相关文章
|
2月前
|
缓存 中间件 测试技术
SOME/IP协议实践指南:精选开发与测试工具解析
SOME/IP协议实践指南:精选开发与测试工具解析
57 0
|
2月前
|
传感器 安全 中间件
深入浅出:SOME/IP协议中的服务发现机制解析
深入浅出:SOME/IP协议中的服务发现机制解析
77 0
|
2月前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
63 0
|
2月前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
120 0
|
4月前
|
域名解析 网络协议
IP协议, TCP协议 和DNS 服务分别是干什么的?
IP协议, TCP协议 和DNS 服务分别是干什么的?
233 0
|
4月前
|
缓存 网络协议 安全
【网络工程师】<软考中级>解析协议ARP&路由协议RIP/OSPF/BGP
【1月更文挑战第27天】【网络工程师】<软考中级>解析协议ARP&路由协议RIP/OSPF/BGP
|
4月前
|
存储 缓存 网络协议
ARP协议:地址解析协议
ARP协议:地址解析协议
42 0
|
4天前
|
监控 安全 网络虚拟化
|
14天前
|
域名解析 网络协议 Linux
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍
TCP/IP协议及配置、IP地址、子网掩码、网关地址、DNS与DHCP介绍
|
19天前
|
存储 域名解析 缓存
网络原理(3)--以太网协议,DNS
网络原理(3)--以太网协议,DNS
29 0

推荐镜像

更多