注:本文环境默认为linux
首先需要下载
nginx-1.8.1
nginx-rtmp-module
因为nginx-rtmp-module对nginx的版本限制比较大,所以最好使用上面给出的nginx版本。
安装nginx
1.首先下载安装nginx-1.8.1
//也可以电脑上下载完后上传到服务器
wget http://nginx.org/download/nginx-1.8.1.tar.gz
2.安装依赖
yum apt-get update
yum apt-get install libpcre3 libpcre3-dev
yum apt-get install openssl libssl-dev
3.解压
tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/live
4.配置
//改变默认监听端口(进入nginx解压后根目录),找到下图位置,修改端口号
vi conf/nginx.conf
i
编辑....
ESC
shift+q
x
5.添加nginx-rtmp-module模块并编译安装
将下载的nginx-rtmp-module文件解压,进入第3步解压完的nginx-1.8.1文件夹中
./configure --add-module=../nginx-rtmp-module-master --prefix=/usr/local/live/nginx
make
make install
6.运行nginx,进入第5步安装完后的nginx文件
./sbin/nginx
浏览器出现如下界面就表示nginx安装成功了,url为 http:// + 服务器 ip + : + 第4步改的端口号
搭建流媒体服务器相关配置
1.继续上面的第4步
events {
worker_connections 1024;
}
//...................
//添加的部分
rtmp {
server {
listen 8001;#之后推流拉流的端口
chunk_size 4096;
application live { #
live on;
}
}
//...................
}
server {
listen 8000;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#...................
#添加的部分
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
#为nginx-rtmp-module解压的地址
root /usr/local/live/nginx-rtmp-module-master/;
}
#...................
location / {
root html;
index index.html index.htm;
}
}
配置完成后重启nginx
./sbin/nginx -s reload
浏览器url: http:// + 服务器ip +: + 端口号 + /stat
出现下方红框部分则配置成功
这时候就可以试试推流给流媒体服务器了。
我这里是使用ffmpeg将保存在服务器上的mp4文件推成rtmp流来测试的,大家也可以使用OBS来生成rtmp推流。
讲下ffmpeg吧,之后还会使用ffmpeg实现在线转流服务。
ffmpeg安装配置
因为之前写的博客中有涉及到ffmpeg安装,所以这里就直接放上链接了
ffmpeg安装
ffmpeg推流本地MP4文件
因为我没有把ffmpeg加入到环境中,所以就直接用路径运行了,
/usr/local/ffmpeg为我的服务器ffmpeg安装路径。
新建/usr/local/live/video文件夹用来放置测试用的MP4文件。
rtmp://172.16.253.146:8001/live/test 推流路径 8001 就是上面配置rtmp的监听端口,live为application配置号,test可以随便取名
/usr/local/ffmpeg/bin/ffmpeg -re -i /usr/local/live/video/1.mp4 -vcodec copy -acodec copy -f flv rtmp://172.16.253.146:8001/live/test
执行上面命令后控制台的大致样子
此时ffmpeg正将MP4文件以rtmp协议推送给上面的nginx流媒体服务器,此时可以进入 http:// + 服务器ip +: + 端口号 + /stat 网页查看信息
如下图,先不要看红框中的,应该会出现蓝框中的信息,publishing,就是推流端,可以看到有一个流正在一直被推送给nginx服务器
然后可以使用播放器收看该直播流,这里推荐时用VLC,这个百度下就能下到,所以也不放出下载地址了。
VLC收看直播流
填入上面推流的url:rtmp://172.16.253.146:8001/live/test
就可以收看刚才推送的MP4文件直播了
然后回到刚才的页面,刷新下就可以看到多了一个play流,即有一个播放端在播放该RTMP流,如下图,先无视掉蓝框中的东西(那些是在线转码时用到的),红框中出现了一个play,地址正是我用VLC播放直播流的PC IP地址。
实际直播时可以使用PC 上的OBS等软件录制直播发送推流给nginx服务器,或者什么微信小程序等等都可以,之后有空会讲下微信小程序录制直播流和观看直播流的相关操作。
ffmpeg在线转流
因为实际直播中,因为网络等因素,在网络联通不流畅时就需要看清晰度低一些的直播,所以还需要提供多个不同清晰度的直播流来供观众选择。因此在线转流也是必须的,这是我们可以看下nginx-rtmp-module作者所给出的功能介绍:
ffmpeg在线转码。
因为之前我也有使用ffmpeg的经历,所以也就直接拿来用了。
对照作者给出的使用方式模板:
# Transcoding (ffmpeg needed)
application big {
live on;
# On every pusblished stream run this command (ffmpeg)
# with substitutions: $app/${app}, $name/${name} for application & stream name.
#
# This ffmpeg call receives stream from this application &
# reduces the resolution down to 32x32. The stream is the published to
# 'small' application (see below) under the same name.
#
# ffmpeg can do anything with the stream like video/audio
# transcoding, resizing, altering container/codec params etc
#
# Multiple exec lines can be specified.
exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
-f flv rtmp://localhost:1935/small/${name};
}
application small {
live on;
# Video with reduced resolution comes here from ffmpeg
}
就能很轻松的进行配置。
我这里设置了3个不同的清晰度,720,480,360,当然使用的ffmpeg命令只是示范,为了更好的效果是需要调整的,配置如下:
修改之前添加的live
application live {
live on;
exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 720x405 -f flv rtmp://172.16.253.146:8001/live720/${name};
exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 480x270 -f flv rtmp://172.16.253.146:8001/live480/${name};
exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 360x202 -f flv rtmp://172.16.253.146:8001/live360/${name};
}
application live720{
live on;
}
application live480{
live on;
}
application live360{
live on;
}
重启nginx服务器,进入页面
http:// + 服务器ip +: + 端口号 + /stat
可以看到如下,test为原始流,然后转码为其他3个不同清晰度的rtmp流,可以试试使用VLC播放4个流。
我这里看确实分辨率下降了非常多,截图可能看不出
另外ffmpeg还提供了将rtmp流保存为MP4文件等等功能,所以我么也可以根据需要来定制自己的服务。当然nginx-rtmp-module自身也可以进行相应配置将流保存到本地等等功能,这些可以去作者的博客&github自己查看文档。
nginx-rtmp-module有一个缺点是不支持集群,关于这里应该如何进行架构设计可以参考 如何从零开始搭建高性能直播平台 这里不再深入。