天天看點

Nginx+FFmpeg 海康、大華NVR實作rtsp轉flv實時預覽+錄像回放

工具準備FFmpeg,推流工具Nginx,要想實作Flv還需要安裝子產品nginx-http-flv-module,這個子產品需要編譯,如果是linux環境很友善,如果是windows環境,對不起,超級麻煩,網上也有教程,太複雜了,還好有網友提供了編譯好的版本,csdn上下載下傳,要币才能下載下傳,求助萬能的淘寶花了5毛錢下載下傳。Flv.js,網頁播放所需的檔案,安裝教程參考了這位大神寫的教程碰到的問題1. nginx-http-flv-module要想實作Flv還需要安裝子產品nginx-http-flv-module,這個子產品需要編譯,如果是linux環境很友善,如果是windows環境,對不起,超級麻煩,網上也有教程,太複雜了,還好有網友提供了編譯好的版本,csdn上下載下傳,要币才能下載下傳,求助萬能的淘寶花了5毛錢下載下傳。2. 實時預覽FFmpeg指令格式ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/channels/101 -c copy -f flv rtmp://127.0.0.1:1935/live/mystream

參數解析

-rtsp_transport tcp: 固定寫法

user:使用者名

password:密碼

ip:攝像頭或NVR的IP位址

port:攝像頭或NVR的RTSP端口,預設是554,具體的RTSP取流規則可以百度

-c copy: 輸出直接複制,不轉換格式

-f flv:轉成flv

rtmp://127.0.0.1:1935/live/mystream:根據Nginx配置檔案生成

攝像頭預設參數配置是h264則不會報錯。如果出現如下報錯,是因為攝像頭是h265,FFmpeg是無法直接轉成flv的[flv @ 000002b1c6a1d680] Video codec hevc not compatible with flv

Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented

這種情況下需要将轉碼,将h265先轉成h264,再轉成flv,具體指令如下ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/channels/101 -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream

實時預覽有兩種播放選擇:直接使用子碼流播放,就不需要再進行h264的轉換,這樣的響應速度會更快,但是畫質會差點;用主碼流播放則需要進行h264的轉換,響應速度會慢2、3秒,畫質不影響3. 錄像回放正常的RTSP取流規則如下:rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z

根據實時回放的FFmpeg規則,很容易想到将錄像rtsp取流的url放到指令中ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream

直接在指令行中輸入回車,會出現如下

問題1:[tcp @ 00000216b1c116c0] Port missing in uri

rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z: Invalid argument

'endtime' 不是内部或外部指令,也不是可運作的程式

或批處理檔案。

去掉rtsp取流url中的‘&endtime=20200422t101003z’,至于沒有了結束時間怎麼停止播放目前未找到好辦法。ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream

再次報錯

問題2:[flv @ 000001f285f01bc0] Video codec hevc not compatible with flv

Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented

這次出現的報錯和實時預覽中的一樣,是因為攝像頭h265的原因,不同的是實時預覽可以選擇子碼流播放不轉碼,但是回放中隻要主碼流,是以隻能進行轉碼操作ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream

在指令行中輸入回車,會出現如下

問題3:Input #0, rtsp, from 'rtsp://WSdun:[email protected]@172.16.2.200:554/Streaming/tracks/201?starttime=20200422t093812z':

Metadata:

title : HIK Media Server V3.4.93

comment : HIK Media Server Session Description : standard

Duration: -187967:-4:-22.-32, start: 0.040000, bitrate: N/A

Stream #0:0: Video: hevc (Main), yuvj420p(pc, bt709), 1920x1080, 25 fps, 25 tbr, 90k tbn, 90k tbc

Stream #0:1: Audio: none, 16000 Hz, mono

Stream mapping:

Stream #0:0 -> #0:0 (hevc (native) -> h264 (libx264))

Stream #0:1 -> #0:1 (? (?) -> mp3 (libmp3lame))

Decoder (codec none) not found for input stream #0:1

通過rtsp回放拉流的話會同時拉取2個流音頻流、視訊流,就是上面中出現的Stream #0:0和Stram #0:1,上面的報錯是找不到音頻流的編碼方式,無法解碼,實時預覽拉流隻會拉取視訊流是以不會報錯。通過檢視FFmpeg的參數發現有個參數-an表示去除音頻,将它放入到指令中ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -an -f flv rtmp://127.0.0.1:1935/live/mystream

OK,能夠正常播放錄像拉。但是到這裡還不是最完美的解決了問題,你肯定發現播放速度非常慢,從輸入ffmpeg指令到flv輸出至少要等6~8秒。再問題3中,除了直接報錯不能運作了外,其實在控制台上方還有個告警[rtsp @ 000001d6cf7108c0] Could not find codec parameters for stream 1 (Audio: none, 16000 Hz, 1 channels): unknown codec

Consider increasing the value for the 'analyzeduration' and 'probesize' options

Guessed Channel Layout for Input Stream #0.1 : mono

還是問題3中提到的找不到音頻參數。FFmpeg拉流的時候會檢查視訊流參數和音頻流參數,視訊流參數一直找不到,這中間有個逾時時間。當時能想到的是能不能在拉流的時候和實施預覽一樣隻拉視訊流,通過度娘查找了一拳,找到了這個參數-allowed_media_types video(隻取音頻流的話就填audio),将它代入指令中,這時候可以去掉-an參數,沒有音頻流也就沒有所謂的去除音頻ffmpeg -rtsp_transport tcp -i rtsp://user:[email protected]:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream

這下算是完美了。錄像回放速度就和視訊預覽一樣了。