Windows 編譯安裝 nginx 服務器 + rtmp 模塊


Windows 編譯安裝 nginx 服務器 + rtmp 模塊

本人的有關博客:《Windows 編譯安裝 nginx 服務器 + rtmp 模塊》、《Ubuntu 編譯安裝 nginx》、《Arm-Linux 移植 Nginx

背景:

公司產品有使用 nginx+ rtmp 的技術要求,本人在 arm、Ubuntu都配置過。為了配合同事開發,所以嘗試在Windows搭建這樣的生產環境。

注意:雖然官網上有提供編譯好的windows版本的nginx ,但凡需要添加刪除模塊的,都需要通過nginx源碼進行編譯。

Host    :Windows-10,core-i7

MinGW  :網絡版

VS    : VS-2017(Community)

Mercurial  :5.02

pcre    : 8.30

編譯之前的環境搭建

以下軟件的安裝,路徑不要出現中文字符與空格

安裝 MinGW

下載好MinGW以后,安裝時勾選以下選項

  • mingw-devloper-toolkit
  • mingw32-base
  • mingw32-gcc-g++
  • msys-base

安裝完成以后按住Win+R 打開cmd,輸入gcc --version 測試是否成功

C:\Users\Schips>gcc --version

gcc (x86_64-posix-seh, Built by strawberryperl.com project) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

下面是 msys的根目錄,運行 msys.bat可以打開 MinGW 的shell窗口(待會會用到)

img

安裝 mercurial

mercurial用於下載 nginx-win版本的源碼,安裝沒有任何其他需要注意的地方

安裝完成以后按住Win+R 打開cmd,輸入hg 測試是否成功

img

安裝 strawberryperl

Strawberry Perl是Windows環境的一個Perl環境,它的目的是盡可能接近UNIX系統上的Perl環境,在編譯nginx及其依賴庫的時候需要用到。

安裝 nasm

NASM全稱The Netwide Assembler,是一款基於80x86和x86-64平台的匯編語言編譯程序,其設計初衷是為了實現編譯器程序跨平台和模塊化的特性,在編譯nginx的時候可能需要對編譯腳本進行修改的時候會用到。

安裝完成后,需要將其安裝路徑加入到PATH環境變量。

下載有關的源碼

nginx-win32-src 下載

在cmd中執行命令

hg clone http://hg.nginx.org/nginx nginx-win32-src

編譯運行環境依賴

下載這些文件

rcre          : 8.30

zlib         :1.2.11

openssl       : 1.0.2t

nginx 額外的模塊(可選)

nginx-rtmp-module   :zip

編譯nginx

解壓

解壓上面下載的源碼,放置到自己喜歡的地方(建議是放到 msys/1.0/home/$USER/下面)

img

配置

在 MinGW 的 msys程序,來到 nginx-win32-src 源碼根目錄

根據自身的實際情況修改下方配置,並保存為一個.bat腳本文件

auto/configure --with-cc=cl --builddir=objs --prefix= \
--conf-path=conf/nginx.conf --pid-path=logs/nginx.pid \
--http-log-path=logs/access.log --error-log-path=logs/error.log \
--sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp \
--http-proxy-temp-path=temp/proxy_temp \
--http-fastcgi-temp-path=temp/fastcgi_temp \
--with-cc-opt=-DFD_SETSIZE=1024 \
--with-select_module \
--with-debug \
--with-http_ssl_module \
--with-pcre=../pcre-8.30 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2t \
--add-module=../nginx-rtmp-module-1.1.11 

配置成功的結果如下:

img

這里會發現有一個異樣的提示,auto/cc/msvc: line 117: [: : integer expression expected ,只要修改文件 $nginx源碼目錄\auto\cc\msvc 即可,

echo " + cl version: $NGX_MSVC_VER" 的前面加入一行 NGX_MSVC_VER=15.00 ,當然不修改也不會影響后續的編譯。

如果需要指定后續編譯nginx時禁用優化,則將其中的 CFLAGS="$CFLAGS -O2"修改為 CFLAGS="$CFLAGS -Od"

到此為止,不再需要 msys(如果此后的步驟依舊使用msys的話,會出現找不到頭文件等問題)

修修補補

修改一處會導致編譯異常的錯誤

打開文件 $nginx源碼目錄\auto\lib\openssl\makefile.msvc,修改如下地方:

ms\do_ms  👉  ms\do_nasm

添加 一個環境變量

找到 vs ide中用到sed.exe添加到系統環境變量中,例如是在:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\usr\bin\sed.exe

img

使用IDE進行編譯

打開VS的命令行提示符窗口

img

切換到 nginx源碼所在位置,並 在指定objs/Makefile以后 nmake

cd /d c:\MinGW\msys\1.0\home\Schips\nginx_on_windows\source\nginx-win32-src
nmake /f objs\MakeFile

成功編譯之后,最終會有以下打印信息,並且在nginx源碼目錄的objs目錄中可以看到最終生成的nginx.exe文件。

img

構建有關的目錄結構

拷貝 objs/nginx.exeobjs/nginx.pdb(可選的調試項目)

拷貝 conf目錄, docs/html目錄

手動創建logstemp目錄

最終效果如下圖:

# /cygdrive/c/MinGW/msys/1.0/home/Schips/nginx_output
$ tree
.
├── conf
│   ├── fastcgi.conf
│   ├── fastcgi_params
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types
│   ├── nginx.conf
│   ├── scgi_params
│   ├── uwsgi_params
│   └── win-utf
├── html
│   ├── 50x.html
│   └── index.html
├── logs
│   ├── access.log
│   ├── error.log
│   └── nginx.pid
├── nginx.exe
├── nginx.pdb
└── temp

測試:

通過cmd命令行運行nginx

start /b nginx.exe -c conf\nginx.conf

瀏覽器輸入 localhost,能夠看到這些信息

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

輸入 nginx.exe -s stop 關閉nginx 服務

添加 rtmp 配置

辛辛苦苦完成了對nginx的編譯。

編輯 nginx運行時需要使用的 配置文件 conf/nginx.conf

(有關的配置可以參考 nginx-rtmp-module-1.1.11\test\nginx.conf)

添加以下內容

rtmp {
    server {
        listen 1935;  #監聽的端口號

        application myapp { #自定義的名字
            live on;

        }
    }
}

保存,重新運行 nginx服務

測試RTMP服務

使用FFMPEG 作為流的解析

FFMPEG的編譯本人在這里跳過,直接在網上找到了別人編譯好的程序

  這里有下載地址: https://dl.pconline.com.cn/download/406611-1.html

隨便找一個視頻,使用以下命令:

./ffmpeg.exe -i test.mp4 -acodec aac -strict experimental -ar 44100 -ac 2  -r 25   -f flv rtmp://192.168.10.213:1935/myapp/23
-i 要處理視頻文件的路徑,可以是其他的流(如rtsp)
-f 強迫采用flv格式
最后是輸出到的地址
rtmp://192.168.1.11:1935/myapp/23  說明:rtmp://IP:PORT/ myapp指nginx配置文件中自定義的,23指輸出文件的名字

使用VLC 作為 流的獲取(在視頻還沒播放完之前)

媒體(M)-> 打開網絡串流
    rtmp://192.168.10.213:1935/myapp/23

最終效果

img

附錄:

編譯rtmp 遇到 以下錯誤:

ngx_rtmp_core_module.c
../nginx-rtmp-module-1.1.11/ngx_rtmp_core_module.c(611): error C2220: 警告被視為錯誤 - 沒有生成“object”文件
../nginx-rtmp-module-1.1.11/ngx_rtmp_core_module.c(611): warning C4456: “sa”的聲明隱藏了上一個本地聲明
../nginx-rtmp-module-1.1.11/ngx_rtmp_core_module.c(506): note: 參見“sa”的聲明
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86\cl.EXE"”: 返回 代碼“0x2”
Stop.

錯誤分析:

  編譯rtmp時,Makefile中應該是指定了類似 -Werror 的參數,所以會把 警告視為錯誤 最終導致了 編譯中斷

  那么只需要找到有關代碼進行修改即可。從錯誤的情況來看,只需要找到 rtmp模塊目錄下的ngx_rtmp_core_module.c,注釋掉 611 行即可。

img

nginx支持 rtsp

nginx 沒有處理 rtsp 的模塊,所以可以使用第三方工具(如 ffmpeg)進行轉推

ffmpeg -rtsp_transport tcp -i <rtsp流地址> -vcodec -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 1280x720 -q 10 rtmp://<本機ip>/myapp/testav

正文完。

參考鏈接:https://www.cnblogs.com/lidabo/p/9077938.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM