文档章节

SRS配置HLS分发

冯继虎
 冯继虎
发布于 2015/05/15 00:12
字数 1794
阅读 4700
收藏 5

一、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的m3u8/ts挂载点。播放的时候到这个路径下找m3u8和ts文件。播放路径为:http://your-server/[vhost]/[app]/[stream].m3u8

        #若要支持内存分发HLS,即ts不写磁盘。1、需要开启SRS的http_server。2、修改 hls_storage ram;

        hls_mount       [vhost]/[app]/[stream].m3u8;

        #默认的音频编码。当流的编码改变时,会更新PMT/PAT信息;默认是aac,因此默认的PMT/PAT信息是aac;如果流是mp3,那么可以配置这个参数为mp3,避免PMT/PAT改变。

        hls_acodec      aac;

        #默认的视频编码。当流的编码改变时,会更新PMT/PAT信息;默认是h264。如果是纯音频HLS,可以配置为vn,可以减少SRS检测纯音频的时间,直接进入纯音频模式

        hls_vcodec      h264;

        #是否删除过期的ts切片,不在m3u8中就是过期。可以关闭清除ts切片,实现时移和存储,使用自己的切片管理系统。

        hls_cleanup     on;

        #从notify服务器读取数据的长度

        hls_nb_notify   64;

        #是否按gop切片,即等待到关键帧后开始切片。测试发现OS X和android上可以不用按go切片。

        hls_wait_keyframe       on;

    }

}

五、SRS中关于HLS的Callback

vhost v.flyfn.com {

    http_hooks {

        #当切片生成时,回调这儿url,使用POST回调。

        #已json编码格式POST。

        # {

        #     "action": "on_hls",

        #     "client_id": 1985,

        #     "ip": "192.168.1.10", "vhost": "video.test.com", "app": "live",

        #     "stream": "livestream",

        #     "duration": 9.36, // in seconds

        #     "cwd": "/usr/local/srs",

        #     "file": "./objs/nginx/html/live/livestream/2015-04-23/01/476584165.ts",

        #     "url": "live/livestream/2015-04-23/01/476584165.ts",

        #     "m3u8": "./objs/nginx/html/live/livestream/live.m3u8",

        #     "m3u8_url": "live/livestream/live.m3u8",

        #     "seq_no": 100

        # }

        #下面是回调多个地址

        on_hls          http://127.0.0.1:8085/api/v1/hls http://localhost:8085/api/v1/hls;

        #HLS通知,实现CDN预分发

        on_hls_notify   http://127.0.0.1:8085/api/v1/hls/[app]/[stream][ts_url];

    }

}

六、支持HLS纯音频

    参考通过ffmpeg进行转码,转码的时候把视频禁止掉就可以了。


详细信息参考:https://github.com/simple-rtmp-server/srs/wiki/v2_CN_DeliveryHLS

© 著作权归作者所有

冯继虎
粉丝 33
博文 53
码字总数 21574
作品 0
西城
部门经理
私信 提问
利用Simple-RTMP-Server搭建RTMP和HLS直播服务(上)

SRS(Simple-RTMP-Server)定位是运营级的互联网直播服务器集群,追求更好的概念完整性和最简单实现的代码,在Github上人气颇高。本文是由王学投稿的SRS搭建直播的学习笔记,由LiveVideoStac...

livevideostack
2017/12/04
0
0
RTMP/HLS 直播服务器--simple-rtmp-server

一个采用MIT协议授权的国产的简单的RTMP/HLS 直播服务器,其核心的价值理念在于简单高效。 使用方法: tep 1: build srs tar xf simple-rtmp-server-..tar.gzcd simple-rtmp-server-./trunk...

熊猫与猫无关
2013/11/28
29.1K
4
EasyDSS RTMP流媒体服务器是怎样炼成的:Easy而且更加互联网!

开发EasyDSS的初衷 自从12年开始做EasyDarwin的时候,当时眼光一直都仅仅局限在安防监控视频这一块,对RTMP没有太大的重视,对于后起之秀HLS更是没有太多关注,然而经历了15直播火热的发展,...

xiejiashu
2017/12/09
0
0
SRS rtmp http-flv流低延时设置、测试

配置参考 https://github.com/simple-rtmp-server/srs/wiki/v2CNLowLatency 延迟影响因素 编码器:不同的编码器(免费或开源的),延迟也是不同的。 流媒体服务器:SRS2 流协议:比如:rtmp是...

Johnny_feng
2015/05/29
0
0
SRS配置采集(ingest)

via:https://github.com/simple-rtmp-server/srs/wiki/v1CNIngest 一、什么是ingest(采集) 采集(Ingest)指的是将文件(flv,mp4,mkv,avi,rmvb等等),流(RTMP,RTMPT,RTMPS,RTSP,H...

Johnny_feng
2015/06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php 遇到 No input file specified的解决方法

(一)IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1...

chenhongjiang
今天
5
0
MySQL 基础

一、常用命令 在命令行中,配置好环境变量后,通过cmd可以直接进入mysql命令行模式,同时列举几种常用命令 # 进入mysql数据库,密码可以先不写,打完-p后再输入,防止被别人看到mysql -u账...

华山猛男
今天
6
0
简单的博客系统(四)Django请求HTML页面视图信息--基于函数的视图

1. 编写用于查询数据的功能函数 应用目录 下的 views.py 文件通常用于保存响应各种请求的函数或类 from django.shortcuts import renderfrom .models import BlogArticles# Create your ...

ZeroBit
今天
5
0
用脚本将本地照片库批量导入到Day One中

因为目前iCloud 空间已经不足,其中95%都是照片,之前入手了DayOne,且空间没有限制,订阅费一年也不少,再加上DayOne作为一款日记App 也比较有名,功能方面最大的就是地理视图与照片视图,尤...

在山的那边
昨天
19
0
jupyter部署安装

python373 -m ipykernel install --name python373 ipython kernelspec list sc create myjupyterservice binpath="D:\apply\Python373\Scripts\jupyter-notebook --config=V:/my_work/jupyt......

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部