Date: | 07/06 2016 |
---|
HTTP Live Stream Library (HLS) 是 Apple 开发的基于 HTTP 的串流规范,目前正在申请成为 IETF 组织的标准规范(当前为草案阶段)。
该协议优点:
- 完全基于 HTTP 协议,意味着可以直接穿越防火墙,浏览器可以直接使用。
- 视频分片机制有利于大规模的内容分发(这点,其它协议很难做到,比如 RTMP/RTSP )
- Apple 移动端 只支持该方案(没有 Flash , 没有 WebRTC ), 所以如果你想让 Apple 移动端的用户能用上你们的流服务,那么选择 HLS 吧 :))
该协议缺点:
- 延时高(纯粹就协议设计来讲,如果你架构够好,你完全可以使用 HLS 打造出延时低于 RTMP 的服务出来, 比如 YouTuBe )
- 单向流
哪些服务在使用该规范?:
哪些云服务支持该规范?:
Server:
- 初始化视频片索引文件(比如 live.m3u8 )。
- 从视频源收集 视频帧 (AVFrame), 然后对 视频帧 进行编码(比如 H264 )。
- 收集固定时长(一般是5秒)的已编码的 视频帧 数据, 合并成一片 MPEG-TS 数据。
- 将合并完成的 MPEG-TS 片数据存储至 静态文件服务器(或者CDN)。
- 将已存储的 MPEG-TS 片数据公网访问路径(比如: http://live.com/object/d1162b6b627b8726f91e3d59feaf5db188e95219.ts ) 更新进 M3U8 索引文件。
Client:
- 下载视频流索引文件 M3U8,获得 MPEG-TS 数据片。
- 按照索引顺序下载 MPEG-TS 数据片,解码并播放(非 Apple 浏览器,可能需要 JavaScript 来做软解码)。
- 索引播放完毕,重新下载 M3U8 看是否更新了索引文件,如果更新,则继续重复上述步骤直至索引文件标示 结束 。
这个模式没什么好讲的,对视频文件进行解码操作,得到 视频帧,然后后续操作跟 直播 流程一样, 只是对 索引文件 的处理方式不太一样。
- #EXTM3U
- #EXT-X-VERSION
- #EXT-X-TARGETDURATION
- #EXT-X-MEDIA-SEQUENCE
- #EXTINF
- #EXT-X-BYTERANGE
- #EXT-X-PLAYLIST-TYPE
- #EXT-X-STREAM-INF
- #EXT-X-ENDLIST
其它不常用的标签(TAG)暂未支持,在可预见的将来也不会考虑。
解析M3U8 Playlist:
extern crate hls;
use std::str::FromStr;
use hls::Playlist;
static Master_Playlist: &'static str = r#"#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:12.1,Title 1
media-b2000000_1.ts?wowzasessionid=2029972411
#EXTINF:12.1,Title 2
media-b2000000_2.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_3.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_4.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_5.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_6.ts?wowzasessionid=2029972411
#EXTINF:12.1,
media-b2000000_7.ts?wowzasessionid=2029972411
#EXT-X-ENDLIST"#;
fn main() {
println!("Master Playlist:\n{}\n\n", Master_Playlist);
let res = Playlist::from_str(Master_Playlist);
assert_eq!(res.is_ok(), true);
let playlist = res.unwrap();
assert_eq!(Master_Playlist, playlist.to_string());
}
创建M3U8 Playlist:
TODO.
- HTTP Live Streaming
- draft-pantos-http-live-streaming , HTTP Live Streaming Internet - Draft
- M3U , A computer file format for a multimedia playlist.
- WebVTT , The Web Video Text Tracks Format
JavaScript HTTP Live Stream Player:
- hls.js , 支持 HLS , 支持 MPEG-2 Transport Stream , MP4 , HLS
- HTML5 Adaptive Streaming Player , 支持 HTML5 , HLS , DASH , MPEG-DASH