nginx + nginx-rtmp 媒體服務器搭建
- (微信小程序開發) 組件: liver-pusher
- 環境 nginx + nginx-rtmp-module + CentOS8
前序
1.需求
微信小程序端,醫療軟件,需要上傳患者拍攝視頻,拍攝時間大於一分鍾
2.調研結果
微信小程序提供了兩個拍攝視頻的接口,但是都不超過一分鍾以上.但是小程序提供了直播推流的接口,通過調研發現,可以通過直播推流Live-push可以實現以上需求
3.實現方法
使用live-push需要搭建媒體服務器. 以下是本人在搭建媒體服務器所采用的版本號,以及在搭建過程中所碰見的問題
5.重點
- nginx 媒體服務器搭建,實現 推流,拉流的過程
- 媒體服務器權限認證
4.媒體服務器搭建前須知.
微信小程序live-push需要使用公網IP地址才能訪問, 如果其它的話視情況而定
使用微信小程序組件 live-pusher 和 live-player 需要開放固定的類目並申請權限
媒體服務器搭建過程
1.實現思路:
- 首先用戶在錄制視頻的時候需要將流推向媒體服務器, 將流以m3u8的格式文件保存下來到一個臨時路勁,這個臨時路徑中文件可以通過流的形式推送給客戶
- 但是這里做的是錄制的視頻,需要對文件進行永久保存. 所以在用戶確保視頻需要保存提交的時候需要對臨時文件進行永久保存, 為了保持性能,以及程序的響應速度, 采用視頻文件和永久存儲的文件在一個盤中,當用戶確保完成,可以將臨時文件中的文件移動到永久目錄中,這樣不會對同樣的文件進行重復的讀寫.速度也快
2.搭建 nginx + nginx-rtmp-module + CentOS8:
下載安裝CentOS8 系統
CentOS 版本 CentOS 8.1.1911 http://isoredirect.centos.org/centos/8/isos/x86_64/CentOS-8.1.1911-x86_64-dvd1.iso 我選擇的是第一個阿里雲下載的(下載完之后安裝的時候默認選擇安裝桌面服務版本的,可以只安裝server版本)
總共7G,需要花幾分鍾的時間
安裝nginx 前工具包下載
net-tool 查本地IP
wget 下載安裝包
unzip 解壓zip包
gcc gcc-c++ perl 編譯軟件包用
yum install -y net-tools wget unzip gcc gcc-c++ perl
安裝nginx 和 rtmp包
如果是在虛擬機中,使用wget 連接失敗,可以使用以下方法修改安裝源
#備份yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #下載阿里源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #清空緩存 yum makecache
切換到home文件下,准備下載壓縮文件
將當前目錄切換的 /home 下 切換的homme目錄 cd /home
下載pcre包
下載地址 https://sourceforge.net/projects/pcre/files/pcre 可以選擇版本,這里選擇 /8.44/ 版本
wget https://sourceforge.net/projects/pcre/files/pcre/8.44/pcre-8.44.tar.gz
下載 zlib 包
下載地址 http://www.zlib.net/ 可查看最新版本
wget http://www.zlib.net/zlib-1.2.11.tar.gz
下載 openssl 包
下載地址 wget https://www.openssl.org/source/
wget https://www.openssl.org/source/openssl-1.0.2t.tar.gz
下載 nginx-rtmp-module 包
下載地址 wget https://github.com/arut/nginx-rtmp-module
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
nginx 下載
nginx 下載 http://nginx.org/en/download.html 這里我選擇的是 1.17.10 版本 (nginx-1.17.10.tar.gz)
wget http://nginx.org/download/nginx-1.17.10.tar.gz
下載完成之后 如圖:
解壓文件
其中 master.zip 使用以下命令解壓
unzip master.zip
其它以 .tar.gz 結尾的使用以下命令解壓
tar -zxvf xxxx.tar.gz
解壓完成之后可以將壓縮文件移除到其它目錄,最終目錄顯示如下
編譯文件
依次執行以下命令
cd openssl-1.0.2t #切換目錄 ./config #編譯配置文件 make && make install #編譯並安裝文件 cd nginx-1.17.10 #切換到 解壓后的 nginx 目錄下 執行以下命令, 配置 nginx ./configure --prefix=/usr/local/nginx --with-pcre=/home/pcre-8.44 --with-zlib=/home/zlib-1.2.11 --with-openssl=/home/openssl-1.0.2t --add-module=/home/nginx-rtmp-module-master make && make install #編譯並安裝,
如果執行完最后一個命令,即編譯安裝nginx時, 如果出現類似以下bug
(可能由於各個版本不一致,會導致報錯不一樣可以嘗試以下方案解決)
使用以下解決方案(再nginx目錄下依次執行以下命令)
make CFLAGS='-Wno-implicit-fallthrough' #編譯的時候執行該命令 make install #安裝
檢查是否安裝成功
cd /usr/local/nginx #切換到該目錄 ./sbin/nginx #啟動nginx
在瀏覽器中輸入 ip 訪問是否安裝成功
如果在局域網內訪問ip訪問不到, 嘗試以下方法解決
firewall-cmd --state #查看liunx防火牆是否開啟, 如果開啟,執行以下命令 firewall-cmd --query-port=80/tcp #查看防火牆是否開啟了 80 的端口, 如果沒有,再執行以下命令 firewall-cmd --add-port=80/tcp --permanent #為80開放永久端口 firewall-cmd --reload #重新啟動防火牆
rtmp 配置
rtmp 各個屬性詳情配置請參考 https://github.com/arut/nginx-rtmp-module/wiki/Directives
worker_processes 1; user root; #指定root用戶,否則推流對文件沒有寫入的權限,也可以制定其它用戶並設置文件讀寫的權限 error_log logs/error.log; #錯誤日志輸出 error_log logs/error.log debug; #錯誤日志輸出修改 debug 模式, 可以查看推流和認證接口過程中出現的問題 pid logs/nginx.pid; events { worker_connections 1024; } rtmp{ server { #監聽推流端口 listen 1935; chunk_size 4096; #hls配置 application hls { live on; hls on; wait_key on; hls_path /usr/data/video/hls; #推流文件存儲的臨時目錄 hls_nested on; hls_fragment 5s; hls_playlist_length 900s; hls_continuous on; notify_method get; # 設置認證接口請求方法為 get # 本地測試接口 # on_publish http://localhost/media/auth; # 也可以使用其它接口進行認證,如果不需要認證, 注解掉即可, # 在推流之前,會請求該方法,如果返回狀態為 200 則認證成功, 如果返回 500 則認證失敗 # on_publish http://111.229.248.28:80/YCX/userInfo/authSessionKey; } } } http { autoindex on; include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; server { listen 8080; server_name localhost; location / { root html; index index.html index.htm; } #### 配置m3u8臨時文件讀取 location /hls { types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } root /usr/data/video; add_header Cache-Control no-cache; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
檢測推流
下載 obs 進行推流測試, 推流的時候可以 到目錄 /usr/data/video/hls 查看生成的臨時文件
推流地址
http://host:1935/hls/textName #推流地址 #http://host:1935/hls/textName?sessionKey={{sessionKey}} #如果需要認證, 可以將sessionKey 添加到這里
拉流地址,可以使用支持 m3u8 格式的播放器測試以下,網上很多有很多下載的,可以下載查看
http://xxx:8080/hls/testName.m3u8
微信小程序使用 video 播放m3u8 出現的 bug(無進度條,不從0秒開始播放等)
很多問題都是因為寫入的 m3u8 文件沒有結束符導致的, 所以需要再推流結束后給文件加上結束符 "#EXT-X-ENDLIST" 導致的
m3u8 文件格式 字段屬性查看 https://www.cnblogs.com/bugutian/p/4490912.html