@[直播, nginx, 系统构架, rtmp]
不会做直播还混什么互联网
2016年国内各种直播应用如雨后春笋一般涌现出来,各大主打云服务的国内互联网巨头纷纷推出了自己的视频直播平台的解决方案,比较优秀的有七牛, 阿里的大视频解决方案,网易的云视频,当然腾讯也不甘落后,推出了类似的视频云。
事实上,网络直播由来已久,但之所以会在2016年一下子火起来,我觉得一是短视频社区的火爆带动了整个视频行业,促成了网络直播的流行。再者,大部分人通过早期的微信公众号,微博等自媒体媒介尝到了甜头,网络直播片天地自然也不能放过。最后各类mooc在中国大地遍地开花,教育行业对直播也有相当需求。最后,事实上对于直播,国内具有相当的技术积累。
网络直播的技术构架
往简单地说直播就是在自己的设备上采集音视频流然后推送到远程服务器再有远程服务器分发到网络中的客户端。
看上去很简陋,但是单就直播这个功能来说,他确实就是这么工作的,但是为了让大家看到更加高清的画面同时又能最大限度的满足部分用户可怜的带宽,编码工作就成了视频直播的重点。其次,不同的硬件的编码方式也不同,存在各种兼容性问题。同时,视频取流的客户端也需要做各种各样的播放器来满足不同设备。最要命的还有服务器端的网络分发,怎么寻找最短的路径用最快的时间把视频分发出去?最后,还有视频延时怎么才能降到最低,音视频的同步,直播的录像和回看和其引出的存储问题,权限问题,内容审核,用户体验,用户之间的即时消息,礼物系统等等一系列问题的引出,最终导致了直播系统变得异常复杂,于是就有了下图:
书归正传,先来谈谈直播服务器
目前比较主流的直播协议有以下几种:
- RTMP(延迟低,适合对实时性要求比较高的情况)
- FLV OVER HTTP(延迟比RTMP高一点,来疯之类在用)
- HLS(高延迟,至少9秒左右,适合游戏直播,Twich好像用这个)
怎么选择协议是一个让人头疼的问题,RTMP是Adobe开发出来的一套私有协议,适用于flash player 在PC端用起来比较爽,但是到了移动端则需要自己单独开发播放器;HTTP-FLV,同样依赖于flash player延时排第二,同样不能原生支持移动端,但其本质上使用的是HTTP协议传输;HLS则可以原生支持手机端,不过,延时较大。
最终,尽管Adobe已经正是声明将在2020年停止开发FLASH,但是这也并不影响我使用rtmp协议,谁让网络上rtmp的资料比较多呢。
RTMP服务器
目前主流的RTMP服务器又有下面这么几种(这是要逼死选择困难户啊):
1.开源系统:
- Red5
- Live555
- RtmpD
- EasyDarwin
- FFServer
2.商用系统 - NTV Media Server G3
- Flash Media Server5
- Windows Media Server
商用系统,额,基本上不用考虑了,像我这种个人开发者。。。
然后,开源系统也果断一个都没有选,最后选择了nginx-rtmp.因为我的直播系统并没有多么复杂,说是直播,实际上是想做一个导播台!
nginx-rtmp安装
nginx-rtmp 事实上只是nginx的一个模块,而且并没有在nginx官方版本内集成,需要在安装nginx的时候同是编译这个模块进去。
具体的安装方法,按照一般的套路,首先是下载,然后是编译和安装,最后是配置。
首先,需要分别下载nginx服务器和对应的插件 nginx-rtmp-module.
wget https://nginx.org/download/nginx-1.12.1.tar.gz
git clone git://github.com/arut/nginx-rtmp-module.git
tar xzf nginx-1.12.0.tar.gz
cd nginx-1.12.0
然后,进行编译安装:
sudo ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module
sudo make
sudo make install
至此,编译安装完成!家下来启动nginx服务器:
sudo /usr/local/nginx/sbin/nginx
设置nginx服务器的直播流
sudo vi /usr/local/nginx/conf/nginx.conf
error_log logs/error.log debug;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name localhost;
# rtmp stat
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
# you can move stat.xsl to a different location
root /usr/build/nginx-rtmp-module;
}
# rtmp control
location /control {
rtmp_control all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
rtmp {
server {
listen 1935;
ping 30s;
notify_method get;
application myapp {
live on;
}
}
}
设置完成之后,重启nginx服务器:
sudo /usr/local/nginx/sbin/nginx -s stop
sudo /usr/local/nginx/sbin/nginx
最后准备一个MP4文件进行测试:
使用ffmpeg推送视频文件到服务器:
ffmpeg -re -i /var/Videos/test.mp4 -c copy -f flv rtmp://localhost/myapp/mystream
最后再访问我们的直播地址:
ffplay rtmp://localhost/myapp/mystream