Nginx+FFmpeg實現RTSP轉RTMP


RTSP轉RTMP

本次轉流采用Centos+Nginx+FFmpeg實現,具體實現如下:

1. 安裝Ngxin

安裝詳細略(可以選擇安裝阿里的Tengine,官方[下載路徑](Download - The Tengine Web Server (taobao.org)) )

2. 安裝Nginx Rtmp模塊

nginx默認不支持rtmp流的轉換,需要通過第三方擴展模塊來實現轉流。

2.1 查看
# 查看當前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 安裝
# 獲取
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同級

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
yum install yasm -y

也可以從[官網](Download - The Yasm Modular Assembler Project (tortall.net))源碼安裝

# 源碼安裝方式
# 編譯
./configure
# 安裝
make && make install
3.2 安裝FFmpeg
# 獲取
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

# 命令
ffmpeg -rtsp_transport tcp -i [rtsp流地址] flv -r 25 -s 1920*1080 -an [轉換后的rtmp流地址]
# 實例
ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/
# 后台運行,在命令前加nohup,后加 &
nohup ffmpeg -rtsp_transport tcp -i rtsp://admin:123456@192.168.00.00 -f flv -r 25 -s 1920*1080 -an rtmp://localhost:1935/hik01/ &

image-20210114120033159

4.2 利用VLC等視頻工具驗證rtmp流是否可用,VLC[下載](Downloads - VideoLAN)

image-20210114120614452

image-20210114120635212

image-20210114120736334

5. 網頁端展示

https://github.com/pyuancheng/rtmpShow.git

附錄1 FFmpeg命令參數詳解

壓縮視頻
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4
獲取封面
ffmpeg -ss 00:00:10 -i test1.flv -f image2 -y test1.jpg
屏幕類型
普屏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
通用選項
-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]的格式也支持
視頻選項
-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
高級選項
-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 包括了模塊名和參數,用空格分開
音頻選項
-ab bitrate 設置音頻碼率

-ar freq 設置音頻采樣率

-ac channels 設置通道 缺省為1

-an 不使能音頻紀錄

-acodec codec 使用codec編解碼
音視頻捕獲選項
-vd device 設置視頻捕獲設備。比如/dev/video0

-vc channel 設置視頻捕獲通道 DV1394專用

-tvstd standard 設置電視標准 NTSC PAL(SECAM)

-dv1394 設置DV1394捕獲

-av device 設置音頻設備 比如/dev/dsp
高級選項
-map file:stream 設置輸入流映射

-debug 打印特定調試信息

-benchmark 為基准測試加入時間

-hex 傾倒每一個輸入包

-bitexact 僅使用位精確算法 用於編解碼測試

-ps size 設置包大小,以bits為單位

-re 以本地幀頻讀數據,主要用於模擬捕獲設備

-loop 循環輸入流。只工作於圖像流,用於ffserver測試

參考博客

Linux-Nginx+rtmp+ffmpeg搭建流媒體服務器 - 別來無恙- - 博客園 (cnblogs.com)

ffmpeg命令參數詳解 - 簡書 (jianshu.com)

CentOS6.8--安裝Tengine_shx1133的專欄-CSDN博客

Linux 安裝 ffmpeg | 溫欣爸比的博客 (wxnacy.com)


免責聲明!

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



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