SRS-HLS服务的部署
直播服务器simple-rtmp-server支持rtmp和hls两种流的分发。对于rtmp的配置很简单,默认configure进行编译安装后,执行./objs/srs -c conf/srs.conf就行了。
但是配置hls就比较麻烦了,要分为使用nginx作为hls分发服务,还是使用自带http服务器来分发。而且要根据本机http端口的占用情况来修改配置的hls的端口。不过配置完成后就可以同时支持rtmp和hls流的播放。
下面分别给出范例说明,主要内容参考自:
一、SRS-http内嵌服务器
SRS内嵌了http服务器,支持分发hls流和文件。这里使用SRS分发RTMP和HLS流,不依赖于外部服务器。
注意:SRS内嵌的HTTP服务器是实验性的,不推荐使用。
假设服务器的IP是:192.168.1.170
1、获取并编译SRS。
git clone https://github.com/ossrs/srs
cd srs/trunk
./configure --disable-all --with-hls --with-ssl --with-http-server
make
make install
2、编写SRS配置文件。
默认配置文件conf/http.hls.conf的内容如下:
# conf/http.hls.conf
listen 1935;
max_connections 1000;
http_stream {
enabled on;listen 8080;dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
hls {
enabled on;hls_path ./objs/nginx/html;hls_fragment 10;hls_window 60;
}
}
以上配置中,hls配置就是HLS的配置,主要配置项如下:
- enabled:是否开启HLS,on/off,默认off。
- hls_path:HLS的m3u8和ts文件保存的路径。SRS会自动加上app和stream名称。譬如:
对于RTMP流:rtmp://localhost/live/livestream HLS配置路径:hls_path /data/nginx/html; 那么会生成以下文件: /data/nginx/html/live/livestream.m3u8 /data/nginx/html/live/livestream-0.ts /data/nginx/html/live/livestream-1.ts /data/nginx/html/live/livestream-2.ts 最后的HLS地址为:http://localhost/live/livestream.m3u8 |
备注:hls_path必须存在,srs只会自动创建${hls_path}下的app的目录。
- hls_fragment:秒,指定ts切片的最小长度。实际上ts文件的长度由以下公式决定:
ts文件时长 = max(hls_fragment, gop_size)
hls_fragment:配置文件中的长度。譬如:5秒。
gop_size:编码器配置的gop的长度,譬如ffmpeg指定fps为20帧/秒,gop为200帧,则gop_size=gop/fps=10秒。
那么,最终ts的时长为max(5, 10) = 10秒。这也是为什么有些流配置了hls_fragment,但是ts时长仍然比这个大的原因
- hls_window:秒,指定HLS窗口大小,即m3u8中ts文件的时长之和,超过总时长后,丢弃第一个m3u8中的第一个切片,直到ts的总时长在这个配置项范围之内。即SRS保证下面的公式:
hls_window >= sum(m3u8中每个ts的时长)
3、启动SRS。
./objs/srs -c conf/http.hls.conf
如果使用内存保存ts而不是创建hls_path,使用这个配置启动srs:
./objs/srs -c conf/ram.hls.conf
备注:
- 请确定srs-http-server已经启动,可以访问http://192.168.1.170:8080/nginx.html,若能看到nginx is ok则没有问题。
- 实际上提供服务的是SRS,可以看到响应头是Server: SRS/0.9.51之类。
4、启动ffmpeg推流。
使用FFMPEG命令循环推流:
for((;;)); do \
./ffmpeg -re -i ./tset.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.170/live/livetest; \sleep 1; \
done
以上命令生成的结果:
FMS URL: rtmp://192.168.1.170/live
Stream: livetest
生成的用于播放的流地址为:
RTMP流地址为:rtmp://192.168.1.170/live/livetest
HLS流地址为: http://192.168.1.170:8080/live/livetest.m3u8
5、问题
RTMP流能看,HLS看不了
- 确认srs-http-server启动并且可以访问:nginx is ok页面能访问。
- 确认m3u8文件能否下载:浏览器打开http://192.168.1.170:8080/live/livetest.m3u8。若不能下载,请检查网络和防火墙设置。
- 若m3u8能下载,可能是播放器的问题,使用vlc或ffplay播放地址:http://192.168.1.170:8080/live/livetest.m3u8。
- 若还不行,有可能是编码问题
二、SRS-nginx服务器
1、获取并编译SRS。
这里获取srs同上,编译配置需要修改为:
./configure --disable-all --with-hls --with-ssl
--with-nginx
make
make install
2、启动分发hls(m3u8/ts)的nginx。
sudo ./objs/nginx/sbin/nginx
备注:请确定nginx已经启动,可以访问nginx,若能看到nginx is ok则没有问题。
3、编写SRS配置文件。
默认配置文件conf/hls.conf,内容如下:
# conf/hls.conf
listen 1935;
max_connections 1000;
vhost __defaultVhost__ {
hls {
enabled on;hls_path ./objs/nginx/html;hls_fragment 10;hls_window 60;
}
}
4、启动SRS。
./objs/srs -c conf/hls.conf
5、启动推流编码器。
命令同上,
RTMP流地址为:rtmp://192.168.1.170/live/livetest
注意,hls流地址的端口视nginx的端口而定,如果不是80,需要加上自定义端口号。