HLS和M3U8

Posted 阳光下是个孩子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HLS和M3U8相关的知识,希望对你有一定的参考价值。

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

解析过程:

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

m3u8和HLS分析工具

  HLS即HTTP Live Streaming的缩写,是由苹果公司(apple)提出的一种流媒体播出协议。iOS终端(iPhone、iPad、iPod等)以及Android终端都支持该协议。Android和iOS终端对HLS协议的支持是系统内置的,不需要开发额外的组件,通过HTML5网页和系统播放器可以直接播放HLS视频流。

  m3u8是HLS协议的播出索引文件,是HLS协议的播放列表(Playlist),文件内容是utf-8编码的文本数据。HLS协议的播出内容是分片分发的,视频文件(或视频流)会被切成长度大致相等的视频小片段进行分发,m3u8文件描述这些视频片段的排列顺序和下载位置。如果HLS播出内容是加密的,m3u8还描述加密的协议和秘钥获取方式的信息。

 相对其他播出协议,HLS的优势有:

   1、将大文件切分成小的文件片段,使用HTTP协议传输,能够充分利用现有的缓存和CDN加速技术进行快速分发,适合在互联网上进行高效传输

   2、Android和iOS都内置播放器,支持HTML5标签,能够方便的集成到HTML5应用和APP应用中,开发和集成难度低

   3、编码、复用、传输、加密技术都是开放的国际标准,设备和应用集成方便,更容易被接受和使用

  播放器播放HLS流的过程是:1)获取m3u8文件的url位置,2)下载m3u8文件,分析播放列表,3)根据播放列表的定义下载视频片段,4)对视频片段进行解复用、解码和播放。

  m3u8和hls分析工具对HLS协议的分析也遵循这个过程,通过下载和解析m3u8文件来分析判断HLS流的播出情况。

    

本文出自 “流媒体服务器技术研究” 博客,请务必保留此出处http://livestreaming.blog.51cto.com/3135568/1862009

以上是关于HLS和M3U8的主要内容,如果未能解决你的问题,请参考以下文章

音视频 HLS协议和m3u8格式分析

音视频 HLS协议和m3u8格式分析

音视频 HLS协议和m3u8格式分析

音视频 HLS协议和m3u8格式分析

使用hls.js播放m3u8视频流

m3u8和HLS分析工具