关于苹果HLS协议的解读和说明

来源:互联网 发布:韩国媚日 知乎 编辑:程序博客网 时间:2024/06/05 00:58

1官方文档

官方文档地址:

HTTP Live Streamingdraft-pantos-http-live-streaming-11

http://tools.ietf.org/html/draft-pantos-http-live-streaming-11

 

此文档共计发布了11个版本

 

本系统自2012年发布,当时采用的是 No.08版,之后跟随新版做了部分修订,主体保持不变。

http://tools.ietf.org/html/draft-pantos-http-live-streaming-08

 

而在HLS官方文档的更新中,做到了前向兼容,没有出现版本升级造成旧的TAG无法使用的问题。

为了保证老版本的IOS对HLS的支持,本系统当前采用了HLS V2。

例如:

Durations MUST be integers if the protocol version of the Playlist fileis less than 3.

2 本系统提供的内容示例

本系统提供的主索引(manifest)如下:

 

http://xxxx/main.m3u8

 

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=204800, RESOLUTION=240x180

/xxxx/200.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=460800, RESOLUTION=480x360

/xxxx/450.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=870400, RESOLUTION=480x360

/xxxx/850.m3u8

 

对于4月1日之前的视频,提供的内容如下:

http://xxxx/main.m3u8

 

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=204800

/xxxx/200.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=460800

/xxxx/450.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=870400

/xxxx/850.m3u8

 

两者的区别在于:

今年4月之后新生产的视频补充了一个属性:RESOLUTION,以视频的分辨率信息

 

3 关键TAG说明:

以下将对manifest的关键TAG以官方标准文档为基础,做一个中文说明以及补充。

涉及到的TAG有:

EXTM3U

EXT-X-STREAM-INF

PROGRAM-ID

BANDWIDTH

RESOLUTION

<URI>

 

3.1 EXTM3U

请参阅[Page 6]

仅仅是为了对苹果传统的播放列表m3u文件做一个区别。约定俗成即可。

 

3.2 EXT-X-STREAM-INF

请参阅[Page 14]

该标签仅仅对跟随它的URI所指定的多媒体资源有效。

3.3 PROGRAM-ID

请参阅[Page 14]

 

以上文的示例说明:

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=204800, RESOLUTION=240x180

 

该TAG对应的是一个整数,这个整数可以任意指定。本系统默认指定1. 如无需要,可以直接忽略。

 

3.4 BANDWIDTH

请参阅[Page 14]

表达码率信息。

以上文的示例说明:

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=204800, RESOLUTION=240x180

需要注意两点:

首先,换算关系 bits/second 以及 kilo-bits/second。需要获得我们日常所说的200码率、450码率,需要 ${ BANDWIDTH } / 1024。如:204800 / 1024 = 200

第二,本系统的输出确保必须带有该TAG。这也是文档所要求的,亦即MUST

 

特别说明:HLS标准协议严格区分了 MUST MAY / SHOULD的区别。

在通常情况下,缺失MUST TAG会造成manifest无法正常解析,视频无法播放。

而缺失MAY TAG or SHOULD TAG不会对IOS内核的播放器造成影响。但是对于ANDROID等non-native media player可能会出现问题。

 

3.5 RESOLUTION

请参阅[Page 14]

提供视频解析率信息。

其格式如下定义:

 

如:RESOLUTION=240x180

此TAG不是必要的,而且在老视频的manifest中并不提供,如无需要,可以直接忽略。本系统提供该TAG出于其他需要。

 

此标签的提供并不对文档所提及的3.4.10.1. Alternative Renditions造成影响。

参见[Page 15]

3.6<URI>

HLS并未对URI的格式做任何说明,

至于URI的语法等可参考如下链接;

W3C 《URIs, URLs, andURNs: Clarifications and Recommendations 1.0》

http://www.w3.org/TR/uri-clarification/

或者更为详细的:

5.2. Resolving Relative References toAbsolute Form [Page 20]

http://www.ietf.org/rfc/rfc2396.txt

 

示例:

(取自http://en.wikipedia.org/wiki/Uniform_resource_identifier示例内容)

 

亦即,HLS协议对URI并无要求或者遵循RFC2396即可。

 

关于URI的补充说明:

Adobe的HDS协议对URI做了硬性的规定:

http://sourceforge.net/apps/mediawiki/osmf.adobe/index.php?title=Flash_Media_Manifest_%28F4M%29_File_Format

详见<media>说明:

亦即,HDS对URI的处理逻辑是:如果url非绝对路径,那么,它必须与baseURL相关(如果指定)或者与manifest文件同一个目录。

对比可见,HLS并不强制要求路径不能以”/”开头,client开发过程中,最好严格依照标准协议处理,对其他的口头消息来源不予采信。