视频-摄像机-推流
本文主要介紹使用 WVP+ZLMediaKit+MediaServerUI 實現通過 GB28181 進行海康、大華、宇視等品牌的 IPC、NVR 、DVR 接入,完成攝像頭監控播放,控制,錄制。
一、概念
IPC是(IP Camera 即網絡攝像機)縮寫,由網絡編碼模塊和模擬攝像機組合而成。網絡編碼模塊將模擬攝像機采集到的模擬視頻信號編碼壓縮成數字信號,從而可以直接接入網絡交換及路由設備。
NVR是(Network Video Recorder即網絡硬盤錄像機)縮寫,主要是通過網絡接收IPC設備傳輸的數字視頻碼流, 并進行存儲、管理。 通過Nvr,可同時觀看、瀏覽、回放、管理、存儲多個網絡攝像機。
DVR是(Digital Video Recorder即數字視頻錄像機)縮寫,采用硬盤錄像,被稱為硬盤錄像機。它是一套圖像計算存儲處理的計算機系統,具有對圖像/語音和動態幀等進行長時間錄像、錄音、遠程監視和控制的功能,DVR集合錄像機、畫面分割器、云臺鏡頭控制、報警控制、網絡傳輸等五種功能于一身,用一臺設備就能取代模擬監控系統一大堆設備。
DVR將模擬視頻進行數字化編碼壓縮并儲存在硬盤上,主要涉及編碼及儲存技術,與網絡傳輸關系不大,因此DVR常安裝在模擬攝像機附近。而NVR從網絡上獲取經編碼壓縮的視頻流然后存儲轉發,因此在NVR設備上一般看不到視頻信號的直接連接,其輸入、輸出都是已編碼并添加了網絡協議的IP數據。
二、準備工作
1.服務運行環境,Linux / OS X / Windows 均可,但推薦 Linux
2.海康云臺攝像頭一個
3.運行 sip 服務 WVP https://github.com/swwheihei/wvp-GB28181
4.運行流媒體服務 ZLMediaKit https://github.com/xiongziliang/ZLMediaKit
5.運行前端展示項目 MediaServerUI https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/
三、運行 WVP
3.1 安裝 Redis
WVP 項目中將設備信息等存放在 Redis 中,所以需安裝 Redis。
3.2 配置運行 SIP
首先修改 WVP 項目配置文件:
spring:application:name: iot-vmp-vmanager# 影子數據存儲方式,支持redis、jdbcdatabase: redis# 通信方式,支持kafka、httpcommunicate: httpredis: # Redis服務器IPhost: 127.0.0.1#端口號port: 6379datebase: 0#訪問密碼,若你的redis服務器沒有設置密碼,就不需要用密碼去連接password: 123123#超時時間timeout: 10000datasource: name: eioturl: jdbc:mysql://host.docker.internal:3306/eiot?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=trueusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driver sip:# SIP 所在服務IP,就是本機IPip: 192.168.1.102port: 5060# 根據國標6.1.2中規定,domain宜采用ID統一編碼的前十位編碼。國標附錄D中定義前8位為中心編碼(由省級、市級、區級、基層編號組成,參照GB/T 2260-2007)# 后兩位為行業編碼,定義參照附錄D.3# 3701020049標識山東濟南歷下區 信息行業接入domain: 3701020049id: 37010200492000000002# 默認設備認證密碼,后續擴展使用設備單獨密碼password: 123456 media:# 流媒體服務的IP,內網測試可填內網IP,公網填公網服務器IP并放開端口ip: 177.11.11.111port: 10000然后登錄海康攝像頭管理頁面,修改配置:
平臺接入選擇 28181;傳輸協議可自選,公網建議TCP;協議版本選擇 GB/T28181-2016(目前WVP只支持該協議,2011后會適配)
SIP服務器ID 和 SIP服務器域,密碼 要和 WVP 項目配置的一致。
SIP服務器地址 填寫 WVP 項目的地址,內網寫內網IP地址,云服務器填寫公網IP,端口寫配置文件中配置的端口。
因為攝像頭平臺接入配置好后,攝像頭會請求 SIP 服務,所以這個一定要配置好。
配置完后就可運行項目了!如果 SIP 服務啟動成功后,會看到這個日志 “Sip Server 啟動成功”
如果攝像頭連接到 SIP 服務,項目日志如下,顯示 200 OK(公網服務器記得放開sip端口):
建立好連接后,就可控制查詢攝像頭了。
GET /api/devices 查詢所有設備信息
[{"deviceId":"37010200492000000001","name":"IP DOME","manufacturer":"Hikvision","model":"DS-2DC4223IW-D/GLT","firmware":"V5.6.15","transport":"TCP","host":{"ip":"192.168.1.101","port":1609,"address":"192.168.1.101:1609"},"online":1,"channelMap":{"34020000001320000001":{"channelId":"34020000001320000001","name":"IPdome","manufacture":"Hikvision","model":"IP Camera","owner":"Owner","civilCode":"37010123123","block":null,"address":"Address","parental":0,"parentId":null,"safetyWay":0,"registerWay":1,"certNum":null,"certifiable":0,"errCode":0,"endTime":null,"secrecy":"0","ipAddress":null,"port":0,"password":null,"status":1,"longitude":0,"latitude":0}}} ]POST /api/ptz/{deviceId}/{channelId} 云臺控制指定設備通道
http://127.0.0.1:8080/api/ptz/34020000001320000001/34020000001320000001?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=1
zoomSpeed 的數字不能太大,不然運行不了,無效。
WVP 項目所有接口:https://github.com/swwheihei/wvp-GB28181/wiki/API-%E6%8E%A5%E5%8F%A3
四、運行流媒體服務 ZLMediaKit
4.1 獲取代碼
#國內用戶推薦從同步鏡像網站gitee下載 git clone --depth 1 https://gitee.com/xiahcu/ZLMediaKit cd ZLMediaKit #千萬不要忘記執行這句命令 git submodule update --init4.2 構建項目
項目開發者提供了三個shell腳本在項目根目錄:
- build_docker_images.sh 構建為docker鏡像
- build_for_linux.sh linux下構建項目
- build_for_mac.sh mac下構建項目
打開以后看到是用CMake編譯的,可直接選擇運行shell腳本。
構建好后打開 release/xx/Debug 目錄,看到 config.ini 是項目的配置文件:https://github.com/xiongziliang/ZLMediaKit/blob/master/conf/config.ini
其中需要特別注意的有兩個地方:
一是 [http] 的 port,因為 ZLMediaKit 項目也有很多 API 接口,都要通過這個接口訪問,都是這個端口,可自行配置。
二是 [rtp_proxy] 的 port,是上面 SIP 項目配置的 media.port
4.3 運行項目
Linux 下啟動:
cd ZLMediaKit/release/linux/Debug #通過-h可以了解啟動參數 ./MediaServer -h #以守護進程模式啟動 ./MediaServer -d &使用守護進程模式啟動后,通過 ps -axj 來查看進程
運行成功后有如下日志:
可做推流測試,非必須操作,,具體操作查看文檔:https://github.com/xiongziliang/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95
下載個視頻文件 big_buck_bunny.mp4 放在當前目錄上,用rtp方式推流,在文件所在目錄輸入命令(需要先安裝ffmpeg):
ffmpeg -re -i "big_buck_bunny.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000運行后,查看 ZLMediaKit 項目有類似這樣的日志:
使用可播放流的播放器(如:PotPlayer,IINA)打開 http://服務器IP/rtp/xxxxx.flv 就能播放了。
如 http://服務器IP/rtp/061484E1.flv
項目推流
SIP 服務和流媒體服務就緒了,就可以推流了。用 /api/devices 查到 deviceId 和 channelId,然后調 SIP 服務的播放接口
GET /api/play/37010200492000000001/34020000001320000001 預覽指定設備通道的音視頻
成功調用后會返回ssrc:
{"ssrc":"0102008033"}ssrc 轉換為16進制后為 061484E1
查看流媒體服務的日志如下:
注:公網服務器如沒收到推流日志,記得開放端口并檢查 wvp 項目的 media 配置是否正確。
那怎么拿到播放地址呢?https://github.com/xiongziliang/ZLMediaKit/wiki/%E6%92%AD%E6%94%BEurl%E8%A7%84%E5%88%99
如果公網IP是177.11.11.111,轉換過來就是:
rtsp://177.11.11.111:554/rtp/061484E1?token=abcdefg&field=value
rtmp://177.11.11.111/rtp/061484E1
http://177.11.11.111/rtp/061484E1.flv
http://177.11.11.111/rtp/061484E1/hls.m3u8
此外 ZLMediaKit 還提供錄制,截圖,動態添加拉流代理等功能。
五、運行MediaServerUI
拉下項目代碼:https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/
項目啟動后,SIP 服務調用 play 接口,流媒體服務收到消息,在項目的“視頻廣場”中就能看到視頻了。
該項目需注意配置,本項目和流媒體服務關聯的,調用接口也是流媒體 ZLMediaKit 的 API。
打開項目根目錄下的 global.js:
const serverip="172.16.63.208" const host = 'http://' + serverip + '/index/api'; const secret = '035c73f7-bb6b-4889-a715-d9eb2d1925cc'; const baseMediaUrl='ws://' + serverip + '/'; function genApiUrl(method){return host+method+"?secret="+secret; } export default{serverip,host,secret,genApiUrl,baseMediaUrl }serverip是流媒體服務IP,如果 ZLMediaKit 配置文件中 [http] 配置項的端口改成其它,記得在這里加端口號。
secret 需要和流媒體服務配置一樣。
baseMediaUrl 是拉流的url,可改成如 rtsp,rtmp,http。
六、整個視頻請求的流程圖
其中流媒體模塊指 ZLMediaServer ,接口模塊與信令模塊指 WVP,視頻設備指 IPC、NVR
七、FFmpeg 源碼結構
FFMPEG中結構體很多。最關鍵的結構體分成以下幾類:
a) 解協議(http,rtsp,rtmp,mms)
AVIOContext,URLProtocol,URLContext主要存儲視音頻用的協議類型及狀態。URLProtocol存儲輸入視音頻使用的封裝格式。每種協議都對應個URLProtocol結構。(注意:FFMPEG中文件也被當做一種協議“file”)
| 傳輸方式 | http流 | tcp流 | http | http |
| 視頻封裝格式 | flv | flv tag | Ts文件 | Mp4 3gp webm |
| 延時 | 低 | 低 | 高 | 高 |
| 數據分段 | 連續流 | 連續流 | 切片文件 | 切片文件 |
| Html5播放 | 通過html5解封包播放(flv.js) | 不支持 | 通過html5解封包播放(hls.js) | 如dash文件列表是mp4webm文件,可直接播放 |
-
用HTTP方式: 通過服務器將FLV下到本地,然后通過NetConnection的本地連接播放,這種方法是播放本地視頻,在本地緩存可找到該FLV。
將直播流模擬成FLV文件,通過HTTP協議下載模式實現流媒體傳輸的協議,端口號80。建議用HTTP FLV,實時性和RTMP相等。
優點:服務器下完FLV,服務器就無消耗了,節省服務器消耗,HTTP比RTMP省去協議交互時間,首屏時間更短。HTTP可拓展;
缺點:FLV緩存客戶端,對FLV保密性不好。 -
用RTMP方式: 通過NetConnection連到FMS(Flash Media Server)或Red5服務器,并實時播放服務器FLV文件,可任意選擇視頻播放點,并不象HTTP方式需緩存整個FLV文件到本地才可選擇播放點。
由上可知,Http方式是本地播放,而RTMP方式是服務器實時播放。目前的CDN都是基于RTMP的。端口號1935,網絡用戶均可用,包括非IOS平臺用戶,對非80端口(如1935)無限制的網絡環境用戶。
RTMP(Real Time Messaging Protocol 實時消息傳輸協議),是 Adobe Systems 公司為 Flash 播放器與服務器音頻、視頻和數據傳輸開發的開放流媒體傳輸協議。
RTMP 協議基于 TCP,是個協議族,包括 RTMP 基本協議及 RTMPT/RTMPS/RTMPE 等變種,由Adobe公司為Flash播放器和服務器之間音頻、視頻傳輸開發的實時數據通信的網絡協議。
優點:FLV 不緩存在客戶端,FLV 保密性好,防 HTTP 下載,延時短;
缺點:消耗服務器資源,連接始終是實時的。 -
RTSP: RTSP 1.0標準沒預測到互聯網的快速增長 、IPv4 地址短缺導致的 NAT 技術廣泛使用 及代理服務器大量存在,它在傳輸可靠性和易用性上都有缺陷。雖然各家廠商都有修補,如支持 RTSP over HTTP、NAT 穿透等,但2005 網絡視頻大爆炸時,RTSP 1.0并沒得到youtube, hulu, 土豆,優酷等視頻服務提供商的青睞,相反,Adobe公司的私有流媒體技術 RTMP 以其優秀的易用性和富媒體的一體化集成,得到多數視頻服務提供商追捧,成為事實的標準.
缺點:web端播放rtsp流的話,需寫插件,且對瀏覽器也很挑剔,flash不支持rtsp,需做 activeX 插件
-
HLS(Http Living Streaming): 是蘋果公司實現的基于 HTTP 的流媒體傳輸協議。2010 蘋果在 iOS 設備支持”Live HTTP”的流媒體技術,并不再支持 RTSP 和 Flash 。Live HTTP 本質跟基于 HTTP 的文件分段下載接近。在帶寬充裕時,live HTTP 能實現跟RTSP和RTMP同樣的流媒體播放效果,有更好的易用性,更簡單的控制。在HTML5中,視頻文件的點播也采用HTTP作為其承載協議。
HLS 可支持流媒體的直播和點播,主要應用在 iOS 系統,為 iOS 設備(如 iPhone、iPad)提供音視頻直播和點播方案。
HLS: IOS平臺下的流媒體傳輸協議 ,端口號80
優點:H5瀏覽器支持較好,IOS,安卓原生支持。
缺點:延遲較大。HLS 基本原理是當采集推流端將視頻流推送到流媒體服務器時,服務器將收到的流信息每緩存一段時間就封包成一個新 ts 文件,同時服務器建立個 m3u8 索引文件來維護最新幾個 ts 片段索引。當播放端獲取直播時,它是從 m3u8 索引文件獲取最新 ts 視頻文件片段播放,保證用戶在任何時候都看到較新內容,實現近似直播體驗。相對于常見流媒體直播協議,如 RTMP 協議、RTSP 協議等,HLS 最大不同在于直播客戶端獲取到的并不是個完整的數據流,而是連續的、短時長的媒體文件,客戶端不斷的下載并播放這些小文件。這種方式理論最小延時為一個 ts 文件的時長,一般情況為 2-3 個 ts 文件的時長。HLS 分段策略,基本上推薦是 10 秒一個分片,這就看出了 HLS 的缺點:
- 通常 HLS 直播延時會達到 20-30s,而高延時對需實時互動的直播是不可接受的。
- HLS 基于短連接 HTTP,意味著 HLS 需不斷與服務器建立連接,TCP 每次建立連接時的三次握手、慢啟動過程、斷開連接時的四次揮手都會產生消耗。
不過 HLS 也有它的優點:
- 數據通過 HTTP 協議傳輸,采用 HLS 時不用考慮防火墻或代理問題。
- 使用短時長的分片文件播放,客戶端可平滑的切換碼率,以適應不同帶寬的播放。
- HLS 是蘋果推出的流媒體協議,iOS 平臺獲得天然的支持,采用系統提供的 AVPlayer 就能直接播放,不用開發播放器。
-
HTTP FLV 則是將RTMP封裝在HTTP協議之上,可更好的穿透防火墻等。
目前,有兩種Http-Flv的實現方式:一種是基于文件方式,一種是基于包方式
Http_flv & RTMP
這兩個協議實際傳輸的數據一樣,數據都是flv文件的tag。http_flv是個無限大的http流文件,只能直播,而rtmp還可推流和更多操作。但http的好處是以80端口通信的,穿透性強,且rtmp是非開放協議。
這兩個協議是如今直播平臺主選的直播方式,主要原因是延時極低。
RTMP延遲1s左右,HTTPFLV延遲1-2s左右,可用于對延遲較苛刻的場景,但要注意兼容性。
b) 解封裝(flv、avi、rmvb、mp4)
AVFormatContext 主要存儲視音頻封裝格式中的信息;AVInputFormat 存儲輸入視音頻用的封裝格式。每種視音頻封裝格式都對應個AVInputFormat 結構。
c) 解碼(h264、mpeg2、aac、mp3)
每個 AVStream 存儲一個視頻/音頻流的相關數據;每個 AVStream 對應個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關數據;每個AVCodecContext 中對應一個AVCodec,包含該視頻/音頻對應的解碼器。每種解碼器都對應個AVCodec結構。
d) 存數據
視頻一般每個 AVPacket 是一幀;音頻可能有好幾幀
解碼前數據:AVPacket(h264、aac)
解碼后數據:AVFrame(yuv、pcm)
他們間的對應關系如下:
總結
- 上一篇: 三极管基极串联一个电阻 和并联一个到地电
- 下一篇: matlab 求状态转移矩阵,状态转移矩