一、HLS简介
HLS(HTTP Live Streaming) 是Appale公司在2009年发布的,可以通过普通的web服务器进行分发的新型流媒体协议。
HLS协议文件:http://tools.ietf.org/html/draft-pantos-http-live-streaming-07
HLS提供一个m3u8列表,播放地址像这样:http://IP[port]/[app]/live.m3u8,其实m3u8是一个ts的list,但是在这个list中要需要定义一些关键的参数,这些参数都有重要的意义。
一般HLS中ts切片的视频编码使用H264,音频编码使用AAC。
二、HLS m3u8介绍
下面是一个m3u8列表中的内容
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:64
#EXT-X-TARGETDURATION:12
#EXTINF:11.550
livestream-64.ts
#EXTINF:5.250
livestream-65.ts
#EXTINF:7.700
livestream-66.ts
#EXTINF:6.850
livestream-67.ts
有几个关键的参数,这些参数在SRS的配置文件中都有配置项:
- EXT-X-TARGETDURATION:所有切片的最大时长。有些Apple设备这个参数不正确会无法播放。SRS会自动计算出ts文件的最大时长,然后更新m3u8时会自动更新这个值。用户不必自己配置。
- EXTINF:ts切片的实际时长,SRS提供配置项hls_fragment,但实际上的ts时长还受gop影响,详见下面配置HLS的说明。
- ts文件的数目:SRS可配置hls_window,指定m3u8中保存多少个切片,SRS会自动清理旧的切片。
- livestream-67.ts:SRS会自动维护ts切片的文件名,在编码器重推之后,这个编号会继续增长,保证流的连续性。直到SRS重启,这个编号才重置为0。
譬如,每个ts切片为10秒,窗口为60秒,那么m3u8中会保存6个ts切片。
三、SRS的HLS工作流
RTMP编码器推流到SRS,视音频编码为,视频:H.264 音频:AAC,其他编码的,可以通过SRS进行直播转码后,输出到SRS的其他Vhost中,然后生成HLS
如果不是H264/AAC,则停止输出HLS。
四、SRS配置生成HLS
其他配置查看conf目录下的full.conf
vhost with-hls.srs.com {
hls {
#是否开启HLS,on:开启 off:关闭,默认是off
enabled on;
#单位秒,指定ts切片的最小长度。默认为10
#ts文件长度 = max(hls_fragment, gop_size)
#如果ffmpeg中指定fps(帧速率)为20帧/秒,gop为200帧,那么gop_size=gop/fps=10秒
#那么实际ts的长度为max(5,10) =10秒。这样实际ts切片的长度就与设定的不同了。
hls_fragment 5;
#倍数,控制m3u8的EXT-X-TARGETDURATION值,EXT-X-TARGETDURATION(整数)值标明了切片的最大时长。
#m3u8列表文件中EXTINF的值必须小于等于EXT-X-TARGETDURATION的值。
#EXT-X-TARGETDURATION在m3u8列表文件中必须出现一次。
hls_td_ratio 1.5;
#倍数。纯音频时,当ts时长超过配置的ls_fragment乘以这个系数时就切割文件。例如,当ls_fragment是10秒,hls_aof_ratio是2.0时,对于纯音频,10s*2.0=20秒时就切割ts文件。
hls_aof_ratio 2.0;
#单位:秒,指定HLS窗口大小,即m3u8中ts文件的时长之和,超过总时长后,丢弃第一个m3u8中的第一个切片,直到ts的总时长在这个配置项范围之内。即SRS保证:hls_window的值必须大于等于m3u8列表文件中所有ts切片时长的总和。
hls_window 60;
#hls错误策略
# ignore:当错误发生时,忽略错误并停止输出hls(默认)
# disconnect:当发生错误时,断开推流连接
# continue:当发生错误时,忽略错误并继续输出hls
hls_on_error ignore;
#hls存储方式
# disk:把m3u8/ts写到磁盘(默认)
# ram:发送m3u8/ts到内存,但是必须使用srs自带的http server进行分发。
# both, disk and ram。
hls_storage disk;
#当hls写到磁盘时,指定写入的目录。
hls_path ./objs/nginx/html;
#生成hls的m3u8文件的文件名,有一些变量可用于生成m3u8文件的文件名:
# [vhost],原始流来的vhost,比如rtmp://v.flyfn.com:1935/live/livestream,对应到srs中,vhost应是v.flyfn.com
# [app], 源rtmp流中的app,对应上面的播放地址中,为live
# [stream],源rtmp流中的流名称,对应上面播放地址中,为livestream
#m3u8文件的绝对路径为[SRS_Path]/objs/nginx/html/[app]/[stream].m3u8
hls_m3u8_file [app]/[stream].m3u8;
#生成的ts文件的名称,有许多的变量可用于生成ts文件的文件名:
# [vhost], the vhost of stream.
# [app], the app of stream.
# [stream], the stream name of stream.
# [2006], replace this const to current year.
# [01], replace this const to current month.
# [02], replace this const to current date.
# [15], replace this const to current hour.
# [04], repleace this const to current minute.
# [05], repleace this const to current second.
# [999], repleace this const to current millisecond.
# [timestamp],replace this const to current UNIX timestamp in ms.
# [seq], the sequence number of ts,顺序号,0,1,2...n
#生成的ts文件的绝对路径:[SRS_Path]/objs/nginx/html/[app]/[stream]-[seq].ts
#例如:[app]/[stream]/[2006][01]/[02]/[timestamp].ts生成的ts文件的绝对路径是:
#[SRS_Path]/objs/nginx/html/[app]/[stream]/201505/15/1431619258.ts
hls_ts_file [app]/[stream]-[seq].ts;
#是否使用floor的方式生成hls ts文件的路径。如实hls_ts_floor on; 使用timestamp/hls_fragment作为[timestamp]变量,即[timestamp]=timestamp/hls_fragment,并且使用enahanced算法生成下一个切片的差值。
hls_ts_floor off;
#hls_entry_prefix: TS的base url。可选默认为空字符串;非空时加在ts前面作为base url。
#对于ts切片:live/livestream-0.ts
#若配置为:hls_entry_prefix http://your-server;
#则最后的TS的URL是:http://your-server/live/livestream-0.ts
hls_entry_prefix http://your-server;
hls_mount [vhost]/[app]/[stream].m3u8;
hls_acodec aac;
hls_vcodec h264;
hls_cleanup on;
hls_nb_notify 64;
hls_wait_keyframe on;
}
}
详细信息参考:https://github.com/simple-rtmp-server/srs/wiki/v2_CN_DeliveryHLS