HLS流媒体协议介绍
HLS流媒体协议介绍
HLS流媒体协议介绍如下:
-
概述:
- 1.1 架构:
- 1.1.1 组成要素:
- 流动视频数据编码器
- 流动音频数据编码器
- H.264流媒体服务器核心组件框架
- 1.1.1 组成要素:
- 1.2 传输协议:HTTP
- 1.3 编码格式:mpegts(MPG-Visual Track Simplified)
- 1.4 多码流自适应编码:M3U8层次一(HLS M3U8 Multicast Stream)
- 1.5 节目内容描述符:M3U8层次二(HLS M3U8 Program Content Description)
- 应用架构实战
- 相关工具使用
- 1.1 架构:
简介
由苹果开发的网络直播技术H.264 LiveStreaming(HLS)主要应用于实现网络直播与点播服务,在平台兼容性方面处于领先地位。目前除了这一技术外,主流的应用还包括基于统一数据传输协议(UDP)的技术以及采用实时传输控制协议(TCP)的解决方案。
特点:
- 平台兼容性好
基于HTTP的网络层架构设计使得网络兼容性得到显著提升;该方案不仅能够与所有主流浏览器实现天然兼容,并且还支持现代H5浏览器提供的MSE(Media Source Extensions)媒体源扩展接口;从而使得用户能够在不依赖第三方插件的情况下自定义音视频源进行播放;而仅限于非H5标准的浏览器需要依赖第三方插件来实现类似功能
目前仅苹果Safari浏览器具备原生HLS支持
余下主流H5浏览器则不具备直接支持
均能借助MSE技术和Flash技术实现
例如videojs-contrib-hs库
- 媒体内容数据分块管理与分块传输
内容数据会经过划分形成小块片段, 大多数情况下每小块的时间长度约为10秒。每个小片段都可能具备独立的属性信息, 例如不同的加密密钥或向量标识。
- 支持多码率自适应
依据数据传输质量来自动调节码率以获取最佳视频效果这一需求意味着服务端必须准备好多种配置方案以应对不同的传输条件. 而非强制性的设置可以选择性地进行配置这样既能提高系统的灵活性又能确保播放端能够顺利运行
- 直播应用时延较大
与RTP和RTMP相比而言
- 不支持组播
HTTP由于基于TCP的原因,并不支持组播技术这一特性属于UDP的技术专利。这一特性直接导致服务器流量与运算随着用户数据量的增长而显著增加。
结构
此图片源自苹果开发者网站
此图片源自苹果开发者网站
多码率时右上部分为:
此多媒体页面源自苹果开发者网站中的相关文档内容
组件
传输协议:HTTP
这个话题无需深入探讨, 其特点已在简介中详述. HLS中的所有数据均通过HTTP协议传输, 主要用于传输mpegts文件(音视频数据)以及m3u8文件(音视频索引信息及辅助数据)。
封装格式:mpegts
多媒体内容中的块文件格式采用mpegts,并通常具有*.ts的常见后缀。这类似于一种多媒体容器协议,并其中包含多种音视频数据,并采用不同的编码格式存储。数学公式...原样保留
- 视频格式:h264
- 音频格式:mp3, aac, ac-3
多码率自适应:m3u8(一级)
码率自适应由服务端及客户端共同完成。即服务端仅需发布不同码率的媒体源信息。这即是通过m3u8文件的形式来描述。m3u8文件分为一级与二级, 其中描述多个码率的是前者; 如下所示:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1064000
http://www.demo.com/1000kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=564000
http://www.demo.com/500kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=282000
http://www.demo.com/250kbps.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2128000
http://www.demo.com/2000kbps.m3u8
在此示例中阐述了四种不同码率的媒体源及其对应访问地址。可以观察到这些媒体源的访问地址均指向m3u8文件类型,并且这种结构属于二级m3u8文件格式,在下一节中将介绍其具体应用和相关特性。
客户端最初会下载该一级m3u8文件,并得知该媒体拥有多个码率数据源。随后客户端需主动监控当前码率文件的 download 速度与 playback 进度。若 download 速度跟不上 playback 节奏,则采用更低码率的数据源继续获取内容,在此期间视频质量随之降低。当 download 速度远高于 playback 速度时,则切换至更高码率的数据源获取内容,在此期间视频质量也随之提升。
媒体内容描述:m3u8(二级)
具体的码率参数所对应的媒体内容由二级m3u8文件进行描述,并通过服务端发送给客户端下载以便于后者能够确定从何处获取相应的媒体数据内容。例如:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:23
#EXT-X-ALLOW-CACHE:YES
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https://www.demo.com/key?id=123",IV=0x00000000000000000000000000000000
#EXTINF:23.000,
https://www.demo.com/0.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://www.demo.com/key?id=123",IV=0x11111111111111111111111111111111
#EXTINF:16.667,
https://www.demo.com/1.ts
...
#EXT-X-ENDLIST
以上示例描述了各分块(*.ts)的访问地址与相应的信息:
- “https://www.demo.com/*.ts”
描述mpegts分块数据的获取地址
- “METHOD=AES-128”
描述接下来的分块为AES加密数据
描述AES解密的KEY的获取地址
- “IV=0x00000000000000000000000000000000”
描述AES解密的初始向量值
- “#EXTINF:16.667,”
描述接下来的分块长度为16.667秒
建议您参考标准文档中的详细描述参数
应用架构实战
HLS在实际应用上的实战, 这部分推荐看看阿里云上的应用架构:
此图源自阿里云的帮助文档详细说明
该系统已经进行了详细阐述四个部门及其各自的具体职责:包括业务提供方、视频上传端、视频存储与处理端以及视频观看端。
深入理解其中涉及的技术细节, 通过整合HLS标准实现对媒体内容授权给观看用户提供使用权限
相关工具使用
- ffmpeg
解密mpegts:
ffmpeg -iv "初始向量(HexString)" -key "密钥(HexString)" -f mpegts -i "crypto:/root/enc.ts" -c copy -y "dec.ts"
合并mpegts并转码为mp4:
ffmpeg -i "concat:0.ts|1.ts|2.ts" -c copy -y "out.mp4"
播放:
# m3u8播放. 若有加密,会自动根据标准自动解密
ffplay *.m3u8
# ts播放
ffplay *.ts
- openssl
解密mpegts:
openssl enc -aes-128-cbc -d -in enc.ts -out dec.ts -iv [初始向量(HexString)] -K [密钥(HexString)] -nosalt
