编译安装 nginx 添加 rtmp 模块

摘要:nginx源码编译添加rtmp模块实现视频推流服务器
环境:deepin linux 15.10.1(基于debian9)

安装依赖库

执行命令前,最好执行一次 sudo apt update 更新下仓库

sudo apt install autoconf automake

sudo apt install libpcre3 libpcre3-dev

sudo apt install openssl

sudo apt install libssl-dev

下载 nginx 和 nginx-rtmp-module 源码

进入到一个目录 (可以自己新建), 然后 clone nginx 和 rtmp 模块的源码,地址可在 github 上面查找对应的仓库,然后进行 clone 操作 (需要安装 git)

git clone https://github.com/nginx/nginx.git --depth=1 //clone nginx 源码,指定克隆深度 depth 为 1 即表示只克隆最近一次 commit (clone 时间大幅缩短)

git clone https://github.com/arut/nginx-rtmp-module.git --depth=1 //clone nginx-rtmp-module 源码

进入到 nginx 源码目录,有一个 auto 文件夹,里面有一个名为 configure 的文件。通过命令参数调用该文件,生成 MakeFile

cd nginx // 进入到 nginx 源码目录

./auto/configure --prefix=/opt/nginx --with-http_ssl_module --with-http_v2_module --with-http_flv_module --with-http_mp4_module --add-module=../nginx-rtmp-module/

ls -al // 查看当前目录 (nginx) 下的文件,会有一个产生的 MakeFile 文件

编译和安装

当前目录还是位于上一步的 nginx 目录

make // 编译

sudo make install // 安装

查看结果

ls -l /opt/nginx/ // 查看 opt 目录下 nginx 目录的内容

sudo /opt/nginx/sbin/nginx // 启动 nginx 服务,默认只能用 root 启动,所以加 sudo

sudo chmod u+s /opt/nginx/sbin/nginx // 为 nginx 文件加上 setuid 标志.(setuid 只对文件有效). 设置后可以通过普通用户就可以启动

  • 关于 chmod 扩展:如果是一个可执行文件,那么在执行时,一般该文件只拥有调用该文件的用户具有的权限。而 setuid, setgid 可以来改变这种设置:

    setuid: 设置使文件在执行阶段具有文件所有者的权限

    setgid: 该权限只对目录有效。目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.

    sticky bit: 该位可以理解为防删除位。一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没有写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件,则可以对文件使用 sticky bit 位。设置该位后,就算用户对目录具有写权限,也不能删除该文件,该权限只对目录有效.

    具体使用如下

    chmod u+s temp — 为 temp 文件加上 setuid 标志. (setuid 只对文件有效)

    chmod g+s tempdir — 为 tempdir 目录加上 setgid 标志 (setgid 只对目录有效)

    chmod o+t temp — 为 temp 文件加上 sticky 标志 (sticky 只对文件有效) *

浏览器打开 localhost, 正常就能打开 nginx 默认的首页面

nginx 推流配置

sudo vim /opt/nginx/conf/nginx.conf

rtmp {
  server {
      listen 1935;
      application rtmplive_demo {
          live on;
          max_connections 1024;
      }
      application hlsvideo {
          live on;
          hls on;
          hls_path /home/bz/Desktop/video/hlsvideo; # 推流存放文件夹,自定义
          hls_fragment 1s;
      }
  }
}

location ^~ /hlsvideo {
  types {
    application/vnd.apple.mpegurl    m3u8;
    video/mp2t ts;
  }
  root /home/bz/Desktop/video; # 此处不能写/home/bz/Desktop/video/hlsvideo,因为路径中带了一层hlsvideo了,如果写上hlsvideo会导致读取m3u8文件404
  add_header Cache-Control    no-cache;
}

sudo /opt/nginx/sbin/nginx -t // 测试配置文件是否 ok

sudo /opt/nginx/sbin/nginx -s reload

测试 rtmp 推流

ffmpeg -re -i ./龙珠超.布罗利.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://192.168.100.31:1935/rtmplive_demo/longzhuchao

注:rtmp://192.168.100.31:1935/rtmplive_demo/longzhuchao rtmp流地址,其中rtmplive_demo必须和nginx.conf中
application中的rtmplive_demo名称必须一致,否则导致推流不成功

打开 VLC Media Player 测试

在工具栏” 媒体 -> 打开网络串流” 然后输入 rtmp://192.168.100.31:1935/rtmplive_demo/longzhuchao 点击确定即可进行直播预览转换后的 rtmp 视频流。效果如图

测试 HLS 推流

ffmpeg -re -i ./龙珠超.布罗利.mp4 -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://192.168.100.31:1935/hlsvideo/longzhuchao

注:rtmp://192.168.100.31:1935/hlsvideo/longzhuchao,其中hlsvideo必须和nginx.conf中
application中hlsvideo名称必须一致,否则导致推流不成功

打开 VLC Media Player 测试

HLS 测试地址是 http 协议的。访问路径是 nginx 中 http 节点下 server 节点配置的。此处是 http://192.168.100.31/hlsvideo/longzhuchao.m3u8

在工具栏” 媒体 -> 打开网络串流” 然后输入 http://192.168.100.31/hlsvideo/longzhuchao.m3u8 点击确定即可进行直播预览转换后的 rtmp 视频流。效果如图