Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器.
这个流媒体服务器可以支持RTMP和HLS(Live Http Stream)
Nginx安装开始
源码安装
1 | #安装gcc,nginx底层采用c++编写,因此需要gcc环境进行编译 |
nginx 配置rtmp
1 | rtmp { |
修改http中的server模块:
1 | location /hls { |
修改nginx.conf之后,需重启nginx服务,才会生效:$nginx -s reload。
再次在浏览器中测试:http://localhost,以确认nginx开启的状态。
保存完配置文件后,启动nginx,通过netstat -ltn命令可以看到增加了一个1935端口的监听.80是nginx默认的http监听端口。
ffmpeg安装
从ffmpeg官网:http://ffmpeg.org/download.html下载最新的ffmpeg安装包,然后通过如下命令解压:
1 | tar jxf ffmpeg-2.5.3.tar.bz2 |
然后用ffmpeg推流到nginx:
RTMP流,推流至rtmplive:
1 | ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://server:1935/rtmplive/test1 |
HLS流,推流至hls:
1 | ffmpeg -re -i "D:\download\film\aqgy\02.mp4" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://ip:1935/hls/test2 |
其中,HLS流表现较明显,在nginx的临时目录下,直观的可看到m3u8索引文件和N多个.ts文件。m3u8列表会实时更新,且会动态更改当前播放索引切片(.ts)。这种实时更新的机制,不会使得.ts文件长时间存在于Nginx服务器上,且当推流结束之后,该目录下的内容会被全部清除,这样无形中减缓了nginx服务器的压力。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
m3u8索引文件
1 | #EXTM3U m3u文件头,必须放在第一行 |
现在我们的流媒体服务器有两个实时流了,一个是rtmp的,另一个是hls的,用流媒体播放器播放一下,流媒体播放器可以用vlc也可以用ffmpeg带的ffplay.手机也是可以播放的。
第一个就是推送的地址: rtmp://localhost:1935/myapp/test1
第二个是HTTP地址: http://localhost/hls/test2.m3u8
播放rtmp流或hls流
最简单的测试,可通过VLC播放器,建立网络任务实现播放。所谓的播放,就是从Nginx服务器取到视频流并播放,也称之为“拉流”。需注意的是,HLS是基于HTTP的流媒体传输协议,端口为8080 ,hls的话用hls on开启hls,并且为hls设置一个临时文件目录hls_path /tmp/hls;其它更高级的配置可以参看nginx-rtmp-module的readme;而RTMP本身即为实时消息传输协议,端口为1935。由此决定了客户端访问直播流的方式
拉流地址:
1 | RTMP流:rtmp://localhost:1935/rtmplive/test |