网络流媒体(五)———HLS

编程入门 行业动态 更新时间:2024-10-11 11:16:06

网络<a href=https://www.elefans.com/category/jswz/34/1770639.html style=流媒体(五)———HLS"/>

网络流媒体(五)———HLS

1. 简介

         HLS(HTTP Live Streaming)是苹果公司提出的基于HTTP的流媒体网络传输协议。HLS把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。HLS 协议由三部分组成:HTTP、M3U8、TS。这三部分中,HTTP 是传输协议,M3U8 是索引文件,TS 是音视频的媒体信息。类似于MPEG-DASH,但是HLS更加简洁,它的基本原理也是服务端把文件或媒体流按照不同的码率切分成一个个小片段进行传输,客户端在播放码流时,可以根据自身的带宽及性能限制,在同一视频内容的不同码率的备用源中,选择合适码率的码流进行下载播放。在传输会话开始时,客户端首先需要下载描述不同码流元数据的M3U8索引文件(类似于DASH中的MPD文件)。
         优点:与基于UDP的RTP协议不同,HLS请求仅使用HTTP传输,因此可以穿过任何允许HTTP数据通过的防火墙或代理服务器。这也便于使用传统的HTTP服务器作为源,并广泛使用基于HTTP的内容分发网络来传输媒体流。HLS相对于RTMP来讲使用了标准的 HTTP 协议来传输数据,可以避免在一些特殊的网络环境下被屏蔽。HLS相比RTMP在服务器端做负载均衡要简单得多。因为HLS是基于无状态协议HTTP实现的,客户端只需要按照顺序使用下载存储在服务器的普通ts文件进行播放就可以。而RTMP是一种有状态协议,很难对视频服务器进行平滑扩展,因为需要为每一个播放视频流的客户端维护状态。HLS 协议本身实现了码率自适应,在不同带宽情况下,设备可以自动切换到最适合自己码率的视频播放。
         缺点:虽然HLS有上述优势,但也同时存在延迟过大的劣势。采用HLS直播的视频流延时一般在10秒以上,使用推荐配置时延迟大概在30s,而RTMP直播的延迟最低可达到3、4秒,因此,在对实时性要求较高的场合,如互动直播,就要慎用HLS了。
         HLS的格式可简单归结如下:
        网络协议: HTTP;
        封装格式: MEPG-2 TS;
        编码格式: 视频编码格式为H.264,音频编码格式为MP3、AAC、AC-3或EC-3;
        索引文件: M3U8。每一个.m3u8文件,分别对应若干个ts文件,这些ts文件才是真正存放视频的数据,m3u8文件只是存放了一些ts文件的配置信息和相关路径,当视频播放时,.m3u8是动态改变的,video标签会解析这个文件,并找到对应的ts文件来播放,所以一般为了加快速度,.m3u8 放在web服务器上,ts文件放在cdn 上。.m3u8 文件,其实就是以utf-8编码的m3u文件,这个文件本身不能播放,只是存放了播放信息的文本文件。
        需要说明的是,目前已有厂家实现了H.265的HLS编码。在封装层面,除了MPEG-2 TS封装外,在WWDC2016上,苹果宣布了HLS对分段MP4(fMP4)文件字节寻址的支持,为HLS向MPEG-DASH的兼容提供了可能。
        根据媒体流的生成及流向,HLS的结构可划分为如下几个部分(本图来自苹果官网):

        HLS有两级索引,第一级索引存放的是不同码率的HLS源的M3U8地址,也就是二级索引文件的地址;第二级索引则记录了同一码率下TS切片序列的下载地址。客户端获取一级M3U8文件后,根据自己的带宽,去下载相应码率的二级索引文件,然后再按二级索引文件的切片顺序下载并播放TS文件序列。
        一个典型的一级索引文件如下:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000, RESOLUTION=720x480
mid_video_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=800000, RESOLUTION=1280x720
wifi_video_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=3000000,CODECS="avc1.4d001e,mp4a.40.5", RESOLUTION=1920x1080
h264main_heaac_index.M3U8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000, CODECS="mp4a.40.5"
aacaudio_index.M3U8

        #EXTM3U:格式标签,标明该文件是一个Extended M3U播放列表文件,必须存在于一二级列表的第一行。
        #EXT-X-STREAM-INF:特定流标签,指示了该流的格式信息:PROGRAM-ID节目ID,一般不用考虑;BANDWIDTH:指定流的带宽;RESOLUTION:视频分辨率;如果存在音频分级,则需指定音频的编码格式CODECS,如上例中的最后两项;#EXT-X-STREAM-INF下面紧接的一行,如mid_video_index.m3u8则是对应流的二级索引文件地址,通过下载该二级索引文件,便可得到媒体切片的信息。
        二级索引文件格式如下:

       (1)VOD形式

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
.ts
#EXTINF:9.009,
.ts
#EXTINF:3.003,
.ts
#EXT-X-ENDLIST

       仍然是以#EXTM3U开头。
       #EXT-X-TARGETDURATION: 表示切片的最大时长,单位是秒。#EXT-X-TARGETDURATION:10表示列表中表示的每个切片时长不超过10秒。
       #EXT-X-VERSION:表示协议兼容性版本。
       #EXTINF:切片的实际时长,若要求取整,则其数值不能大于EXT-X-TARGETDURATION的值。
       .ts:对应的切片文件(路径),可以是绝对路径,也可以是相对路径。
       #EXT-X-ENDLIST:表示整个码流的结束,不再向后附加新的切片列表。
        (2) Live形式:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:7.975,
.ts
#EXTINF:7.941,
.ts
#EXTINF:7.975,
.ts

       #EXT-X-MEDIA-SEQUENCE:媒体序列号,表示出现在当前M3U8文件中的第一个Segment的序列号。
       Live形式的M3U8一般用于直播,列表中的文件数有限制,推荐配置中是3个,服务端会实时更新该列表,删除最开始的Segment,并向后面添加新生成的Segment。因此,这种模式下,当网络带宽不足时,客户端来不及下载新的M3U8和对应的切片文件,会导致切片丢失,播放卡顿。

       (3) 加密形式:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:7794
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI=".php?r=52"
#EXTINF:2.833,
.ts
#EXTINF:15.0,
.ts
#EXTINF:13.333,
.ts
#EXT-X-KEY:METHOD=AES-128,URI=".php?r=53"
#EXTINF:15.0,
.ts

        HLS可以被加密。客户端通过读取M3U8文件中的#EXT-X_KEY标签可以获取解密的密钥。EXT-X-KEY指示的密钥信息作用于当前EXT-X-KEY标签至下一个EXT-X-KEY标签(若没有下一个,则到最后一个Segment)之间的所有Segments。METHOD指示加密算法,可用的取值有NONE、AES-128和SAMPLE-AES,NONE表示不加密。URI指示获取密钥的路径,该项不可省略,除非METHOD为NONE。

2. 基础概念

2.1 Playlist file

       一个 m3u 的 Playlist 就是一个由多个独立行组成的文本文件,每行由回车/换行区分。每一行可以是一个 URI、空白行或是一个 以 "#" 号开头的字符串,并且空格只能存在于一行中不同元素间的分隔。
一个 URI 表示一个媒体段或是 "variant Playlist file"(最多支持一层嵌套,即一个 m3u8 文件中嵌套另一个 m3u8),以 "EXT" 开头的表示一个 "tag",否则表示注释,直接忽略。

2.2 Tags

① #EXTM3U:每个 m3u8 文件第一行必须是这个 tag,如上面的两个示例。
② #EXTINF:指定每个媒体段(ts)的持续时间,这个仅对其后面的 URI 有效,每两个媒体段URI间被这个tag分隔开,
其格式为:#EXTINF:<duration>,<title>
•    duration:表示持续的时间(秒),"Durations MUST be integers if the protocol version of the Playlist file is less than 3",否则可以是浮点数。
③ #EXT-X-BYTERANGE:表示媒体段是一个媒体URI资源中的一段,只对其后的media URI有效,
格式为:#EXT-X-BYTERANGE:<n>[@o]
•    n:表示这个区间的大小
•    o:表示在 URI 中的 offset
•    The EXT-X-BYTERANGE tag appeared in version 4 of the protocol
④ #EXT-X-TARGETDURATION:指定当前视频流中的单个切片(即ts)文件的最大时长(秒)。所以 #EXTINF 中指定的时间长度必须小于或是等于这个最大值。这个tag在整个 Playlist 文件中只能出现一次(在嵌套的情况下,一般有真正ts url的m3u8才会出现该tag)。

3  参考文献

.html

更多推荐

网络流媒体(五)———HLS

本文发布于:2024-02-26 12:48:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1702525.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:流媒体   网络   HLS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!