關(guān)鍵詞
支持RTSP協(xié)議的NVR翔横、攝像頭(憾刘危康、大華等主流設(shè)備廠家)
RTSP轉(zhuǎn)FLV
預(yù)覽+回放
工具準(zhǔn)備
- FFmpeg禾唁,推流工具
- Nginx效览,要想實(shí)現(xiàn)Flv還需要安裝模塊nginx-http-flv-module无切,這個(gè)模塊需要編譯,如果是linux環(huán)境很方便丐枉,如果是windows環(huán)境哆键,對(duì)不起,超級(jí)麻煩瘦锹,網(wǎng)上也有教程籍嘹,太復(fù)雜了,還好有網(wǎng)友提供了編譯好的版本弯院,csdn上下載辱士,要幣才能下載,求助萬(wàn)能的淘寶花了5毛錢(qián)下載听绳。
- Flv.js颂碘,網(wǎng)頁(yè)播放所需的文件,
安裝教程
參考了這位大神寫(xiě)的教程
碰到的問(wèn)題
1. nginx-http-flv-module
要想實(shí)現(xiàn)Flv還需要安裝模塊nginx-http-flv-module辫红,這個(gè)模塊需要編譯凭涂,如果是linux環(huán)境很方便,如果是windows環(huán)境贴妻,對(duì)不起,超級(jí)麻煩蝙斜,網(wǎng)上也有教程名惩,太復(fù)雜了,還好有網(wǎng)友提供了編譯好的版本孕荠,csdn上下載娩鹉,要幣才能下載,求助萬(wàn)能的淘寶花了5毛錢(qián)下載稚伍。
2. 實(shí)時(shí)預(yù)覽
FFmpeg命令格式
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/channels/101 -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
參數(shù)解析
-rtsp_transport tcp: 固定寫(xiě)法
user:用戶名
password:密碼
ip:攝像頭或NVR的IP地址
port:攝像頭或NVR的RTSP端口弯予,默認(rèn)是554,具體的RTSP取流規(guī)則可以百度
-c copy: 輸出直接復(fù)制个曙,不轉(zhuǎn)換格式
-f flv:轉(zhuǎn)成flv
rtmp://127.0.0.1:1935/live/mystream:根據(jù)Nginx配置文件生成
攝像頭默認(rèn)參數(shù)配置是h264則不會(huì)報(bào)錯(cuò)锈嫩。如果出現(xiàn)如下報(bào)錯(cuò),是因?yàn)閿z像頭是h265垦搬,F(xiàn)Fmpeg是無(wú)法直接轉(zhuǎn)成flv的
[flv @ 000002b1c6a1d680] Video codec hevc not compatible with flv
Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
這種情況下需要將轉(zhuǎn)碼呼寸,將h265先轉(zhuǎn)成h264,再轉(zhuǎn)成flv猴贰,具體指令如下
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/channels/101 -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream
實(shí)時(shí)預(yù)覽有兩種播放選擇:
- 直接使用子碼流播放对雪,就不需要再進(jìn)行h264的轉(zhuǎn)換,這樣的響應(yīng)速度會(huì)更快米绕,但是畫(huà)質(zhì)會(huì)差點(diǎn)瑟捣;
- 用主碼流播放則需要進(jìn)行h264的轉(zhuǎn)換馋艺,響應(yīng)速度會(huì)慢2、3秒迈套,畫(huà)質(zhì)不影響
3. 錄像回放
正常的RTSP取流規(guī)則如下:
rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z
根據(jù)實(shí)時(shí)回放的FFmpeg規(guī)則捐祠,很容易想到將錄像rtsp取流的url放到指令中
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z&endtime=20200422t101003z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
直接在命令行中輸入回車,會(huì)出現(xiàn)如下
問(wèn)題1:
[tcp @ 00000216b1c116c0] Port missing in uri
rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z: Invalid argument
'endtime' 不是內(nèi)部或外部命令交汤,也不是可運(yùn)行的程序
或批處理文件雏赦。
去掉rtsp取流url中的‘&endtime=20200422t101003z’,至于沒(méi)有了結(jié)束時(shí)間怎么停止播放目前未找到好辦法芙扎。
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c copy -f flv rtmp://127.0.0.1:1935/live/mystream
再次報(bào)錯(cuò)
問(wèn)題2:
[flv @ 000001f285f01bc0] Video codec hevc not compatible with flv
Could not write header for output file #0 (incorrect codec parameters ?): Function not implemented
這次出現(xiàn)的報(bào)錯(cuò)和實(shí)時(shí)預(yù)覽中的一樣星岗,是因?yàn)閿z像頭h265的原因,不同的是實(shí)時(shí)預(yù)覽可以選擇子碼流播放不轉(zhuǎn)碼戒洼,但是回放中只要主碼流俏橘,所以只能進(jìn)行轉(zhuǎn)碼操作
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream
在命令行中輸入回車,會(huì)出現(xiàn)如下
問(wèn)題3:
Input #0, rtsp, from 'rtsp://WSdun:WSdun@123@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
通過(guò)rtsp回放拉流的話會(huì)同時(shí)拉取2個(gè)流音頻流圈浇、視頻流寥掐,就是上面中出現(xiàn)的Stream #0:0
和Stram #0:1
,上面的報(bào)錯(cuò)是找不到音頻流的編碼方式磷蜀,無(wú)法解碼召耘,實(shí)時(shí)預(yù)覽拉流只會(huì)拉取視頻流所以不會(huì)報(bào)錯(cuò)。通過(guò)查看FFmpeg的參數(shù)發(fā)現(xiàn)有個(gè)參數(shù)-an
表示去除音頻褐隆,將它放入到指令中
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -an -f flv rtmp://127.0.0.1:1935/live/mystream
OK污它,能夠正常播放錄像拉。但是到這里還不是最完美的解決了問(wèn)題庶弃,你肯定發(fā)現(xiàn)播放速度非常慢衫贬,從輸入ffmpeg指令到flv輸出至少要等6~8秒。再問(wèn)題3中歇攻,除了直接報(bào)錯(cuò)不能運(yùn)行了外固惯,其實(shí)在控制臺(tái)上方還有個(gè)告警
[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
還是問(wèn)題3中提到的找不到音頻參數(shù)。FFmpeg拉流的時(shí)候會(huì)檢查視頻流參數(shù)和音頻流參數(shù)缴守,視頻流參數(shù)一直找不到葬毫,這中間有個(gè)超時(shí)時(shí)間。當(dāng)時(shí)能想到的是能不能在拉流的時(shí)候和實(shí)施預(yù)覽一樣只拉視頻流斧散,通過(guò)度娘查找了一拳供常,找到了這個(gè)參數(shù)-allowed_media_types video
(只取音頻流的話就填audio),將它代入指令中鸡捐,這時(shí)候可以去掉-an
參數(shù)栈暇,沒(méi)有音頻流也就沒(méi)有所謂的去除音頻
ffmpeg -rtsp_transport tcp -i rtsp://user:password@ip:port/Streaming/tracks/101?starttime=20200422t093812z -c:v libx264 -f flv rtmp://127.0.0.1:1935/live/mystream
這下算是完美了。錄像回放速度就和視頻預(yù)覽一樣了箍镜。
FFmpeg的指令太多太多源祈,還需要細(xì)品