ourfor / blog

利用GitHub的Issues记录
https://github.com/ourfor/blog/issues
1 stars 0 forks source link

编译Nginx #31

Open ourfor opened 5 years ago

ourfor commented 5 years ago

环境:

Last login: Thu Jun 20 02:31:24 2019 from 110.53.183.69
Nice To Meet You!
          /:-------------:\          root@vultr.guest
       :-------------------::        ----------------
     :-----------/shhOHbmp---:\      OS: Fedora 30 (Thirty) x86_64
   /-----------omMMMNNNMMD  ---:     Host: KVM/QEMU (Standard PC (i440FX + PIIX, 1996) pc-i440fx-3.1)
  :-----------sMMMMNMNMP.    ---:    Kernel: 5.0.16-300.fc30.x86_64
 :-----------:MMMdP-------    ---\   Uptime: 2 hours, 56 mins
,------------:MMMd--------    ---:   Packages: 1177 (rpm)
:------------:MMMd-------    .---:   Shell: zsh 5.7.1
:----    oNMMMMMMMMMNho     .----:   Terminal: /dev/pts/3
:--     .+shhhMMMmhhy++   .------/   CPU: Virtual 82d9ed4018dd (2) @ 2.593GHz
:-    -------:MMMd--------------:    GPU: Cirrus Logic GD 5446
:-   --------/MMMd-------------;     Memory: 2237MiB / 3942MiB
:-    ------/hMMMy------------:
:-- :dMNdhhdNMMNo------------;
:---:sdNMMMMNds:------------:
:------:://:-------------::
:---------------------://

由于我主要是用nginxrtmp模块推流,所以同时下载rtmp模块

git clone https://github.com/arut/nginx-rtmp-module.git

安装依赖:

dnf install pcre pcre-devel openssl openssl-devel

应为web服务器我主要用apache,所以很多nginx的功能我都不需要,所以我的编译参数为:

./configure --add-module=../nginx-rtmp-module\
make
make install
ourfor commented 5 years ago

编译过程中遇到了这个问题:

../../nginx-rtmp-module/ngx_rtmp_eval.c: 在函数‘ngx_rtmp_eval’中:
../../nginx-rtmp-module/ngx_rtmp_eval.c:160:17: 错误:this statement may fall through [-Werror=implicit-fallthrough=]
  160 |                 switch (c) {
      |                 ^~~~~~
../../nginx-rtmp-module/ngx_rtmp_eval.c:170:13: 附注:here
  170 |             case ESCAPE:
      |             ^~~~
cc1:所有的警告都被当作是错误
make[1]: *** [objs/Makefile:1339:objs/addon/nginx-rtmp-module/ngx_rtmp_eval.o] 错误 1
make[1]: 离开目录“/root/rtmp/nginx/nginx-1.17.0”
make: *** [Makefile:8:build] 错误 2

编辑模块rtmp源码下面的ngx_rtmp_eval.c,发现case NAME下面缺少了break语句,将case ESCAPE:移到这个情况下面就行了

145             case NAME:
146                 if (c == '{' && name.data == p) {
147                     ++name.data;
148                     state = SNAME;
149                     continue;
150                 }
151                 if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
152                     continue;
153                 }
154
155                 name.len = p - name.data;
156                 ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);
157                 /* fall through */
158             case ESCAPE:
159                 ngx_rtmp_eval_append(&b, &c, 1, log);
160                 state = NORMAL;
161                 break;
ourfor commented 5 years ago

参考资料

ourfor commented 5 years ago

使用/usr/local/nginx/sbin/nginx就可以启动nginx了,不过更建议你将nginx做成系统服务

ourfor commented 5 years ago

毕竟我是用nginx来推流,所以我要打开1935这个端口,所以我会先在/usr/lib/firewalld/services下面添加rtmp这个文件,其内容为:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>LIVE ON</short>
  <description>RTMP VIDEO PLAYER</description>
  <port protocol="tcp" port="1935"/>
</service>

然后使用firewall-cmd来启用这个服务:

firewall-cmd --zone=public --permanent --add-service=rtmp
firewall-cmd --reload

nginx的配置文件里面添加:

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

           application play {
                live on;
                record off;
           }
   }
}

数据块大小我改成了40m,因为4m可以明显感觉到有点卡顿

ourfor commented 5 years ago

最后使用ffmpeg来推流:

ffmpeg -re -i ./告白气球-周二珂.flv -c copy -f flv rtmp://localhost/play/

可以在vlc里面打开rtmp://$serverIp/play 也可以制作成.m3u8文件,这样IINA也可以播放,比如创建一个名为index.m3u8的文件,其内容为: rtmp://$serverIp/play