Nginx+FFmpeg實現RTSP轉RTMP
阿新 • • 發佈:2021-01-14
### RTSP轉RTMP
本次轉流採用Centos+Nginx+FFmpeg實現,具體實現如下:
#### 1. 安裝Ngxin
安裝詳細略(可以選擇安裝阿里的Tengine,官方[下載路徑]([Download - The Tengine Web Server (taobao.org)](http://tengine.taobao.org/download.html)) )
#### 2. 安裝Nginx Rtmp模組
> nginx預設不支援rtmp流的轉換,需要通過第三方擴充套件模組來實現轉流。
##### 2.1 檢視
``` shell
# 檢視當前Nginx的編譯安裝使用了那些模組
/usr/local/nginx/sbin/nginx -V
[root@otwb-app03-uat //]# /usr/local/nginx/sbin/nginx -V
Tengine version: Tengine/2.3.1
nginx version: nginx/1.16.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.1.1a 20 Nov 2018
TLS SNI support enabled
configure arguments: --with-http_ssl_module
```
可以看出編譯安裝使用了configure arguments:**--with-http_ssl_module** 模組,還沒有rtmp的模組。
##### 2.2 安裝
```sh
# 獲取
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
# 解壓
unzip master.zip
# 進入Nginx的解壓(原始檔)目錄,不是執行目錄
cd /u01/nginx/tengine-2.3.1
# 增加下載好的模組,將上面查詢的arguments複製下來,加上: --add-module=/home/work/software/nginx-rtmp-module-master,(注意模組的路徑)
# 執行以下命令
./configure --with-http_ssl_module --add-module=/home/work/software/nginx-rtmp-module-master
# 接著執行make命令 注意:千萬不要make install
make
# 替換nginx的執行檔案,上面編譯之後執行檔案已經改變了,需要將修改後的替換當前系統的nginx執行檔案
# 進入nginx執行目錄
cd /usr/local/nginx/sbin/nginx
# 備份
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# 替換,從安裝tengine的解壓目錄中objs中複製到系統執行目錄
cp /u01/nginx/tengine-2.3.1/objs/nginx /usr/local/nginx/sbin/nginx
# 重啟nginx,檢視,configure arguments已經多了rtmp的模組了。
/usr/local/nginx/sbin/nginx -V
[root@otwb-app03-uat //]# /usr/local/nginx/sbin/nginx -V
Tengine version: Tengine/2.3.1
nginx version: nginx/1.16.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.1.1a 20 Nov 2018
TLS SNI support enabled
configure arguments: --with-http_ssl_module --add-module=/u01/nginx/nginx-rtmp-module-master
```
##### 2.3 修改Nginx配置檔案
修改nginx配置檔案,新增如下內容並重新載入配置檔案,rtmp標籤和http同級
```sh
rtmp {
# 第一個轉流地址
server {
listen 1935; #監聽的埠號
application hik01 { #自定義的名字
live on;
}
}
# 第二個轉流地址
server {
listen 1936; #監聽的埠號
application hik02 { #自定義的名字
live on;
}
}
# 第N個轉流地址
server {
listen xxxx; #監聽的埠號
application xxxx { #自定義的名字
live on;
}
}
}
```
修改之後reload nginx檔案。沒問題即可下一步。
#### 3. 安裝FFmpeg
##### 3.1 安裝FFmpeg需要先安裝其依賴:yasm
```sh
yum install yasm -y
```
也可以從[官網]([Download - The Yasm Modular Assembler Project (tortall.net)](http://yasm.tortall.net/Download.html))原始碼安裝
```sh
# 原始碼安裝方式
# 編譯
./configure
# 安裝
make && make install
```
##### 3.2 安裝FFmpeg
```sh
# 獲取
wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2
# 解壓
tar -xjvf ffmpeg-4.1.tar.bz2
# 檢視
cd ffmpeg-4.1
# 編譯
./configure
# 安裝
make && make install
```
#### 4. 測試驗證
##### 4.1 啟用ffmpeg進行推流
> 以下命令需要修改rtsp流地址,rtmp地址以伺服器實際配置為準,其他命令暫時複製即可。
>
> -rtsp_transport tcp 是將預設的udp協議轉為tcp協議,可以一定程度上解決花屏(丟包)的問題。
>
> 詳細的命令介紹,請看附錄1
```sh
# 命令
ffmpeg -rtsp_transport tcp -i [rtsp流地址] flv -r 25 -s 1920*1080 -an [轉換後的rtmp流地址]
# 例項
ffmpeg -rtsp_transport tcp -i rtsp://admin:[email protected] -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/
# 後臺執行,在命令前加nohup,後加 &
nohup ffmpeg -rtsp_transport tcp -i rtsp://admin:[email protected] -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/ &
```
![image-20210114120033159](https://gitee.com/pongyc/picgo/raw/master/image-20210114120033159.png)
##### 4.2 利用VLC等視訊工具驗證rtmp流是否可用,VLC[下載]([Downloads - VideoLAN](http://get.videolan.org/vlc/3.0.11/win64/vlc-3.0.11-win64.exe))
![image-20210114120614452](https://gitee.com/pongyc/picgo/raw/master/image-20210114120614452.png)
![image-20210114120635212](https://gitee.com/pongyc/picgo/raw/master/image-20210114120635212.png)
![image-20210114120736334](https://gitee.com/pongyc/picgo/raw/master/image-20210114120736334.png)
#### 5. 網頁端展示
https://github.com/pyuancheng/rtmpShow.git
#### 附錄1 FFmpeg命令引數詳解
##### 壓縮視訊
```sh
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4
```
##### 獲取封面
```sh
ffmpeg -ss 00:00:10 -i test1.flv -f image2 -y test1.jpg
```
##### 螢幕型別
```sh
普屏4:3 320*240 640*480
寬屏16:9 480*272 640*360 672*378 720*480 1024*600 1280*720 1920*1080
```
**ffmpeg命令引數如下:**
| 引數名稱 | 輸入值 | 備註 |
| -------------------- | ------------------------------------ | ------------------------------------------------------------ |
| -i | ffmpmg -i pingcap-xxx.mp4 | 輸入您要處理的視訊檔案路徑 |
| -b:v $k -bufsize $k | -b:v 64k -bufsize 64k | 要將輸出檔案的視訊位元率設定為64 kbit / s |
| -r | ffmpeg -i input.avi -r 24 output.avi | 要強制輸出檔案的幀頻為24 fps |
| -c:v | -c:v libx264 | ffmpeg -i input -c:v libx264 -preset slow -crf 22-c:a copy output.mkv |
##### 通用選項
```sh
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協議的。。。
-f fmt 強迫採用格式fmt
-I filename 輸入檔案
-y 覆蓋輸出檔案
-t duration 設定紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支援
-ss position 搜尋到指定的時間 [-]hh:mm:ss[.xxx]的格式也支援
-title string 設定標題
-author string 設定作者
-copyright string 設定版權
-comment string 設定評論
-target type 設定目標檔案型別(vcd,svcd,dvd) 所有的格式選項(位元率,編解碼以及緩衝區大小)自動設定 ,只需要輸入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 啟用高質量設定
-itsoffset offset 設定以秒為基準的時間偏移,該選項影響所有後面的輸入檔案。該偏移被加到輸入檔案的時戳,定義一個正偏移意味著相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支援
```
##### 視訊選項
```sh
-b bitrate 設定位元率,預設200kb/s
-r fps 設定幀頻 預設25
-s size 設定幀大小 格式為WXH 預設160X128.下面的簡寫也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設定橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設定頂部切除帶大小 畫素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設定頂部補齊的大小 畫素單位
-padbottom size –padleft size –padright size –padcolor color 設定補齊條顏色(hex,6個16進位制的數,紅:綠:蘭排列,比如 000000代表黑色)
-vn 不做視訊記錄
-bt tolerance 設定視訊位元速率容忍度kbit/s
-maxrate bitrate設定最大視訊位元速率容忍度
-minrate bitreate 設定最小視訊位元速率容忍度
-bufsize size 設定位元速率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼資料必須被拷貝。
-sameq 使用同樣視訊質量作為源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計資訊,第二遍生成精確的請求的位元速率
-passlogfile file 選擇兩遍的紀錄檔名為file
```
##### 高階選項
```sh
-g gop_size 設定影象組大小
-intra 僅適用幀內編碼
-qscale q 使用固定的視訊量化標度(VBR)
-qmin q 最小視訊量化標度(VBR)
-qmax q 最大視訊量化標度(VBR)
-qdiff q 量化標度間最大偏差 (VBR)
-qblur blur 視訊量化標度柔化(VBR)
-qcomp compression 視訊量化標度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始複雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp偏差
-i_qoffset offset 在p和i幀間的qp偏差
-rc_eq equation 設定位元速率控制方程 預設tex^qComp
-rc_override override 特定間隔下的速率控制過載
-me method 設定運動估計的方法 可用方法有 zero phods log x1 epzs(預設) full
-dct_algo algo 設定dct的演算法 可用的有 0 FF_DCT_AUTO 預設的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設定idct演算法。可用的有 0 FF_IDCT_AUTO 預設的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設定錯誤殘留為n 1 FF_ER_CAREFULL 預設 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設定錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支援mpeg1,mpeg2,mpeg4
-mbd mode 巨集塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動向量 僅用於mpeg4
-part 使用資料劃分 僅用於mpeg4
-bug param 繞過沒有被自動監測到編碼器的問題
-strict strictness 跟標準的嚴格性
-aic 使能高階幀內編碼 h263+
-umv 使能無限運動向量 h263+
-deinterlace 不採用交織方法
-interlace 強迫交織法編碼 僅對mpeg2和mpeg4有效。當你的輸入是交織的並且你想要保持交織以最小影象損失的時候採用該選項。可選的方法是不交織,但是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視訊編碼統計到vstats_hhmmss.log
-vhook module 插入視訊處理模組 module 包括了模組名和引數,用空格分開
```
##### 音訊選項
```sh
-ab bitrate 設定音訊位元速率
-ar freq 設定音訊取樣率
-ac channels 設定通道 預設為1
-an 不使能音訊紀錄
-acodec codec 使用codec編解碼
```
##### 音視訊捕獲選項
```sh
-vd device 設定視訊捕獲裝置。比如/dev/video0
-vc channel 設定視訊捕獲通道 DV1394專用
-tvstd standard 設定電視標準 NTSC PAL(SECAM)
-dv1394 設定DV1394捕獲
-av device 設定音訊裝置 比如/dev/dsp
```
##### 高階選項
```sh
-map file:stream 設定輸入流對映
-debug 列印特定除錯資訊
-benchmark 為基準測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確演算法 用於編解碼測試
-ps size 設定包大小,以bits為單位
-re 以本地幀頻讀資料,主要用於模擬捕獲裝置
-loop 迴圈輸入流。只工作於影象流,用於ffserver測試
```
#### 參考部落格
[Linux-Nginx+rtmp+ffmpeg搭建流媒體伺服器 - 別來無恙- - 部落格園 (cnblogs.com)](https://www.cnblogs.com/yanjieli/archive/2019/03/28/10615638.html)
[ffmpeg命令引數詳解 - 簡書 (jianshu.com)](https://www.jianshu.com/p/049d03705a81)
[CentOS6.8--安裝Tengine_shx1133的專欄-CSDN部落格](https://blog.csdn.net/shx1133/article/details/80876059)
[Linux 安裝 ffmpeg | 溫欣爸比的部落格 (wxnacy.com)](https://wxnacy.com/2018/11/27/linux-install-ffmpeg/)