Ubuntu 中使用 Nginx+rtmp 模块搭建流媒体视频点播服务

1. 背景#

不知不觉笔者来到流媒体部门已经一年半多了,积攒了不少的流媒体知识,但平时工作也比较忙,很少进行总结性的梳理,最近准备花几个周末时间写一个流媒体系列的实践文章,也算是给自己做总结的同时帮助有需要的开发者;

在这一节中我们主要是通过 nginx+rtmp 模块搭建一个点播服务,就是你有很多视频文件,想让其他人观看就可以参考这篇文章,和笔者之前的一篇文章 使用 PHP 结合 Ffmpeg 快速搭建流媒体服务实践 , 应用场景基本一致,不过这篇文章当中不涉及任何代码,相对来说更加简单。

在这个流媒体系列文章当中,已实践为主,在文章当中的每一条命令都经过笔者亲自运行并提供相关截图,并说明其中参数的来意,希望能够更好的帮助到读者。

2. 运行环境#

为了此服务后期部署到生产环境中,笔者采用 docker 方式来搭建此服务,并且一般在生产环境中我们通常使用 Linux 系统作为服务器,所以我选择了 Ubuntu 这个系统,其他系统搭建流程基本类似。

2.1 docker 容器#

rtmp 服务默认端口是 1935,另外安装 nginx 后需要进行验证,需要开放一个 http 端口,为了防止和宿主机冲突,这里我们使用 8081 端口;我们需要将视频文件拷贝到容器中,因此还需要挂载一个目录,因此 docker 容器运行命令如下所示

docker run --name video -v /Users/tangqingsong/files:/root/videos -d -i -p 8081:8081  -p 1935:1935 ubuntu:18.04 && docker ps

命令很执行完成之后,docker 返回结果如下图所示
image
在上图中中可以看到已经有一个容器运行了,接着我们需要进入容器安装 nginx 和 rtmp 模块,进入容器命令如下所示

docker exec -it video bash

命令执行完成之后,返回信息如下图所示
image
在上图中从光标位置的左侧可以看到已经显示了 root 账户名称,说明已经进入容器成功;

2.2 国内加速源#

docker 的 Ubuntu 镜像 apt 软件源默认使用官方域名,这个域名在国内访问非常慢,为了后续安装速度能够更快,我们将 apt 的软件源更换成阿里云源的地址,执行命令如下所示

echo 'deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
' > /etc/apt/sources.list  && cat /etc/apt/sources.list

命令执行之后,返回的信息如下图所示
image
从上图中可以看到已经执行成功,已经使用阿里云的软件源替代了默认的软件源;

2.3 更新软件源列表#

接下来我们更新一下本地的软件源信息,执行命令如下所示

apt update

命令执行之后,返回的信息如下图所示
image
从上图中可以看到已经从阿里云中更新了软件源信息,更新速度也非常快,到此我们已经完成运行环境的基础准备。

3 Nginx 安装#

在我们准备好系统环境之后,我们就需要开始安装 Nginx 了,安装 Nginx 我们需要先把他的依赖给安装,然后下载相关的源码进行编译,最后执行编译安装

3.1 安装 Nginx 依赖#

在我们更新 apt 软件源完成之后,就可以安装 Nginx 等一些软件的依赖环境,执行的命令如下所示

apt-get install -y libpcre3 libpcre3-dev libssl-dev zlib1g-dev gcc  wget unzip vim make curl

安装的依赖软件有点多,会根据你的网速安装速度也不一样,命令执行之后,返回的信息如下图所示
image
从上图中可以看到依赖已经安装完成,接下来我们开始安装 nginx,nginx 不能使用 apt 安装,需要源码编译安装才可以,因为需要我们编译一个模块进去

3.2 下载源码#

我们首先将需要的模块下载下来,这里我不准备使用 nginx-rtmp-module,而是使用 nginx-http-flv-module 来替代,因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开发,有中文文档,所以就采用它了,首先将它下载下来并解压,执行的命令如下所示

wget https://github.com/winshining/nginx-http-flv-module/archive/master.zip ; unzip master.zip

命令执行之后,返回的信息如下图所示
image
从上图中可以看出已经下载并解压完成,接着我们还需要下载 nginx 本身的源码,下载 Nginx 源码并解压的命令如下所示

wget http://nginx.org/download/nginx-1.17.6.tar.gz  && tar -zxvf nginx-1.17.6.tar.gz

命令执行之后,返回的信息如下图所示
image
下载并解压完成,到此我们两个所需要的源码都准备完成

3.3 编译安装#

接着我们进入编译安装环节,首先进入刚才解压的 nginx 目录当中,执行的命令如下所示

cd  nginx-1.17.6 && ls

命令执行之后,返回的信息如下图所示
image
从上图中可以看到解压出来的目录结构,我们执行./configure 便可以配置编译参数,这个地方我们需要将刚才下载的插件 nginx-http-flv-module 加入进来,执行的命令如下所示

./configure --add-module=../nginx-http-flv-module-master

命令执行之后,返回的信息如下图所示
image
在上图中可以看到准备编译已经完成,但在编译的过程当中有可能会出现一些意外因素,nginx 默认编译非常严格,只要遇到一些意外就会中断编译,因此我们将一些非致命的意外设置为警告模式,执行命令如下所示

vim objs/Makefile

在当前文件夹下有一个 objs/Makefile 文件,我们将里面的 -Werror 删除,用 vim 打开文件后如下所示

命令执行之后,返回的信息如下图所示
image

删除之后,保存并退出,接着就可以进行编译 Nginx 了,编译的过程稍微有点长,执行的命令如下所示

make 

命令执行之后,返回的信息如下图所示
image
在上图中可以看到一些 Nginx 的一些日志存放路径信息,当我们执行安装命令后,就会往这些文件里写入相应信息,执行安装命令如下所示

make install

安装命令执行之后,返回的信息如下图所示
image
在上图中可以可以看到安装过程大致执行了哪些命令,安装完成后接下来需要进行一些简单的配置就可以使用了

4. 配置 rtmp 服务#

在完成 Nginx 的安装之后,我们需要对 Nginx 进行一番配置,并启动 Nginx 服务

4.1 添加 rtmp 服务#

我们直接使用 vim 命令去编辑 Nginx 的配置文件,执行命令如下所示

vim /usr/local/nginx/conf/nginx.conf

vim 命令执行之后,打开的编辑窗口如下所示
image
我们将以下配置信息复制并粘贴到配置文件信息里面,放在 http 配置上面

rtmp {                #RTMP服务
   server {
       listen 1935;  #//服务端口
        chunk_size 4096;   #//数据传输块的大小

        application vod {
                play /opt/video/vod; #//视频文件存放位置。
        }
   }
}

4.2 验证配置#

粘贴完成并保存之后,我们在终端执行 nginx -t 命令,来测试一下配置文件是否有异常,执行命令如下所示

/usr/local/nginx/sbin/nginx -t

命令执行之后,返回的信息如下图所示
image
在上图中可以看出 Nginx 提示我们配置文件没有异常,说明我们配置没有语法错误,我们启动一下 Nginx 并使用 curl 命令来测试启动是否成功,执行命令如下所示

/usr/local/nginx/sbin/nginx && curl http://127.0.0.1

命令执行之后,返回的信息如下图所示
image
从上图中 Nginx 返回的信息可以看出我们 Nginx 服务已经启动成功

5 视频播放#

在上述环节都操作完毕之后,此时基本都处于正常,现在我们就可以开始来播放视频了,不过我们还需要在视频目录下放一个视频文件,这样才能播放到这个视频

5.1 添加视频文件#

接着我们创建一个存放视频的文件夹,并将权限设置设置为 777,防止因为权限问题导致无法播放,执行命令如下所示

mkdir -p /opt/video/vod  && chmod -R 777 /opt/video/vod

命令执行之后,返回的信息如下图所示
image
在上图中可以看出,创建文件夹和设置权限命令已经执行完成,接着我们需要将我们准备好的视频文件复制到我们之前配置指定的目录下,执行命令如下所示

cp /root/videos/out.mp4 /opt/video/vod &&  ls /opt/video/vod

命令执行之后,返回的信息如下图所示
image
在上图中可以看出,已经将视频文件 out.mp4 文件复制到此目录中,接着我们就可以测试播放了;不过在测试播放之前我们需要安装一个视频播放器,因为浏览器是不支持 rtmp 协议。

5.2 安装 VLC 播放器#

一般用于调试流媒体我们习惯使用 vlc 播放器,我们去官网下载一下他,官网地址如下

https://www.videolan.org/

使用浏览器打开官网后,我们在首页能看到下载按钮,同时也可以看出支持各种平台,默认下载当前系统的版本,如下图所示

image

下载并安装 vlc 播放器完成后,我们需要在菜单中找到 File->Open Network,如下图所示

image

点击 Open Network 选项后,会打开一个新的窗口,在这个窗口中我们可以输入我们的播放地址,我刚才复制过去的视频播放地址对应如下所示

rtmp://localhost/vod/out.mp4

image

在上图中可以看到窗口中有一个输入框,将播放地址复制进去之后,点击右下方的 open 按钮,就可以开始播放了,点击后成功播放效果下图所示

image
此次通过 Nginx+rtmp 模块搭建点播服务已经成功了,在下一篇文章中我将搭建直播服务,欢迎关注我的博客~


作者:汤青松

日期:2019-11-28

微信:songboy8888

本作品采用《CC 协议》,转载必须注明作者和本文链接
汤青松
PHP高级工程师 @ 中公教育
文章
35
粉丝
36
喜欢
169
收藏
77
排名:246
访问:3.9 万
私信
所有博文
社区赞助商