基于nginx-rtmp-module搭建流媒体服务器

两个月多月没写东西了哇,记录下之前内网流媒体服务器搭建的步骤吧,这里只需要关心RTMP协议,所以搭建方案就比较简单了,直接通过Nginx、nginx-rtmp-module、ffmpeg来实现。

环境: Ubuntu 18.04、Nginx 1.16.1、PotPlayer

nginx-rtmp-module

nginx-rtmp-module是知名的Nginx流媒体扩展,支持RTMP\HLS\MPEG-DASH实时流等特性,具体见项目文档。

Nginx此前已配置过,我这里只需要添加扩展即可,先对现有Nginx可执行文件进行备份:

1
2
$ cd /usr/local/nginx/sbin
$ cp nginx nginx.old

下载nginx-rtmp-module扩展,并进行编译:

1
2
3
4
5
$ cd ngx_module
$ git clone https://github.com/arut/nginx-rtmp-module.git
$ cd nginx-1.16.1
$ ./configure --prefix=/usr/local/nginx --add-module=../ngx_module/nginx-rtmp-module
$ make

替换Nginx可执行文件:

1
$ cp -f objs/nginx ../nginx/sbin/nginx

在配置文件nginx.conf添加如下内容,此处rtmp与http在同一个层级:

1
2
3
4
5
6
7
8
9
10
11
12
rtmp {
server {
listen 1935;
chunk_size 4096;
application myapp {
live on;
}
application vod {
play /home/top/vod/;
}
}
}

可以看到我配置了两个application,一个叫myapp,一个叫vod,采用的模式也不同,myapp采用的直播,为现场模式;vod点用的点播,播放指定的FLV或MP4文件。

现在停掉现有的Nginx服务之后重启,因为此时是测试机就直接这么操作了,不想停机的话,可以通过热升级的方式:

1
$ nginx -s stop && nginx

这个时候我们的流媒体服务器就准备好了。

直播推流

ffmpeg是视频处理最常用的开源软件,它提供了录制、转换以及流化音视频的完整解决方案,包含了非常先进的音频/视频编解码库libavcodec,平时生活中应用的场景非常多,这里的推流也通过ffmpeg实现。

第一步,安装:

1
$ sudo apt-get install ffmpeg

准备好一个本地的视频,就可以进行推流操作了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ffmpeg -re -i /home/top/vod/c4-rem\!x.flv -vcodec copy -f flv rtmp://192.168.199.106:1935/myapp

ffmpeg version 3.4.8-0ubuntu0.2 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
configuration: --prefix=/usr --extra-version=0ubuntu0.2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100

其中参数选项说明:

1
2
3
4
-re 以本地帧频读数据,主要用于模拟捕获设备
-i filename 输入文件
-vcodec 指定视频解码器
-f 指定采用格式fmt

视频播放

我这里选择在另一台Windows机器上启动PotPlayer,便于抓取RTMP数据包:

Live模式

右键添加RTMP播放源rtmp://192.168.199.106:1935/myapp即可观看直播视频。

Play模式

右键添加RTMP播放源rtmp://192.168.199.106:1935/vod/c4-rem!x.flv即可,注意此处与live模式不同,需要我们在播放源路径中加入指定的视频文件名称,不需要手动进行ffmpeg推流,和我们在视频网站看视频是一样的。

在线RTMP源

如果只是想抓取RTMP数据包并且有网络访问权限的话,直接使用在PotPlayer中添加某卫视的直播源就行了:
东方卫视: rtmp://58.200.131.2:1935/livetv/dftv
湖南卫视: rtmp://58.200.131.2:1935/livetv/hunantv

参考

1、https://github.com/arut/nginx-rtmp-module/wiki/Directives

0%