日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

视频-摄像机-推流

發(fā)布時間:2024/3/26 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 视频-摄像机-推流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要介紹使用 WVP+ZLMediaKit+MediaServerUI 實現(xiàn)通過 GB28181 進行海康、大華、宇視等品牌的 IPC、NVR 、DVR 接入,完成攝像頭監(jiān)控播放,控制,錄制。

一、概念

IPC是(IP Camera 即網(wǎng)絡(luò)攝像機)縮寫,由網(wǎng)絡(luò)編碼模塊和模擬攝像機組合而成。網(wǎng)絡(luò)編碼模塊將模擬攝像機采集到的模擬視頻信號編碼壓縮成數(shù)字信號,從而可以直接接入網(wǎng)絡(luò)交換及路由設(shè)備。

NVR是(Network Video Recorder即網(wǎng)絡(luò)硬盤錄像機)縮寫,主要是通過網(wǎng)絡(luò)接收IPC設(shè)備傳輸?shù)臄?shù)字視頻碼流, 并進行存儲、管理。 通過Nvr,可同時觀看、瀏覽、回放、管理、存儲多個網(wǎng)絡(luò)攝像機。

DVR是(Digital Video Recorder即數(shù)字視頻錄像機)縮寫,采用硬盤錄像,被稱為硬盤錄像機。它是一套圖像計算存儲處理的計算機系統(tǒng),具有對圖像/語音和動態(tài)幀等進行長時間錄像、錄音、遠程監(jiān)視和控制的功能,DVR集合錄像機、畫面分割器、云臺鏡頭控制、報警控制、網(wǎng)絡(luò)傳輸?shù)任宸N功能于一身,用一臺設(shè)備就能取代模擬監(jiān)控系統(tǒng)一大堆設(shè)備。

DVR將模擬視頻進行數(shù)字化編碼壓縮并儲存在硬盤上,主要涉及編碼及儲存技術(shù),與網(wǎng)絡(luò)傳輸關(guān)系不大,因此DVR常安裝在模擬攝像機附近。而NVR從網(wǎng)絡(luò)上獲取經(jīng)編碼壓縮的視頻流然后存儲轉(zhuǎn)發(fā),因此在NVR設(shè)備上一般看不到視頻信號的直接連接,其輸入、輸出都是已編碼并添加了網(wǎng)絡(luò)協(xié)議的IP數(shù)據(jù)。

二、準(zhǔn)備工作

1.服務(wù)運行環(huán)境,Linux / OS X / Windows 均可,但推薦 Linux

2.海康云臺攝像頭一個

3.運行 sip 服務(wù) WVP https://github.com/swwheihei/wvp-GB28181

4.運行流媒體服務(wù) ZLMediaKit https://github.com/xiongziliang/ZLMediaKit

5.運行前端展示項目 MediaServerUI https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/

三、運行 WVP

3.1 安裝 Redis

WVP 項目中將設(shè)備信息等存放在 Redis 中,所以需安裝 Redis。

3.2 配置運行 SIP

首先修改 WVP 項目配置文件:

spring:application:name: iot-vmp-vmanager# 影子數(shù)據(jù)存儲方式,支持redis、jdbcdatabase: redis# 通信方式,支持kafka、httpcommunicate: httpredis: # Redis服務(wù)器IPhost: 127.0.0.1#端口號port: 6379datebase: 0#訪問密碼,若你的redis服務(wù)器沒有設(shè)置密碼,就不需要用密碼去連接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 所在服務(wù)IP,就是本機IPip: 192.168.1.102port: 5060# 根據(jù)國標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國標(biāo)附錄D中定義前8位為中心編碼(由省級、市級、區(qū)級、基層編號組成,參照GB/T 2260-2007)# 后兩位為行業(yè)編碼,定義參照附錄D.3# 3701020049標(biāo)識山東濟南歷下區(qū) 信息行業(yè)接入domain: 3701020049id: 37010200492000000002# 默認(rèn)設(shè)備認(rèn)證密碼,后續(xù)擴展使用設(shè)備單獨密碼password: 123456 media:# 流媒體服務(wù)的IP,內(nèi)網(wǎng)測試可填內(nèi)網(wǎng)IP,公網(wǎng)填公網(wǎng)服務(wù)器IP并放開端口ip: 177.11.11.111port: 10000

然后登錄海康攝像頭管理頁面,修改配置:

平臺接入選擇 28181;傳輸協(xié)議可自選,公網(wǎng)建議TCP;協(xié)議版本選擇 GB/T28181-2016(目前WVP只支持該協(xié)議,2011后會適配)

SIP服務(wù)器ID 和 SIP服務(wù)器域,密碼 要和 WVP 項目配置的一致。

SIP服務(wù)器地址 填寫 WVP 項目的地址,內(nèi)網(wǎng)寫內(nèi)網(wǎng)IP地址,云服務(wù)器填寫公網(wǎng)IP,端口寫配置文件中配置的端口。

因為攝像頭平臺接入配置好后,攝像頭會請求 SIP 服務(wù),所以這個一定要配置好。

配置完后就可運行項目了!如果 SIP 服務(wù)啟動成功后,會看到這個日志 “Sip Server 啟動成功”

如果攝像頭連接到 SIP 服務(wù),項目日志如下,顯示 200 OK(公網(wǎng)服務(wù)器記得放開sip端口):

建立好連接后,就可控制查詢攝像頭了。

GET /api/devices 查詢所有設(shè)備信息

[{"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} 云臺控制指定設(shè)備通道

http://127.0.0.1:8080/api/ptz/34020000001320000001/34020000001320000001?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=1

zoomSpeed 的數(shù)字不能太大,不然運行不了,無效。

WVP 項目所有接口:https://github.com/swwheihei/wvp-GB28181/wiki/API-%E6%8E%A5%E5%8F%A3

四、運行流媒體服務(wù) ZLMediaKit

4.1 獲取代碼

#國內(nèi)用戶推薦從同步鏡像網(wǎng)站gitee下載 git clone --depth 1 https://gitee.com/xiahcu/ZLMediaKit cd ZLMediaKit #千萬不要忘記執(zhí)行這句命令 git submodule update --init

4.2 構(gòu)建項目

項目開發(fā)者提供了三個shell腳本在項目根目錄:

  • build_docker_images.sh 構(gòu)建為docker鏡像
  • build_for_linux.sh linux下構(gòu)建項目
  • build_for_mac.sh mac下構(gòu)建項目

打開以后看到是用CMake編譯的,可直接選擇運行shell腳本。

構(gòu)建好后打開 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可以了解啟動參數(shù) ./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 放在當(dāng)前目錄上,用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://服務(wù)器IP/rtp/xxxxx.flv 就能播放了。

如 http://服務(wù)器IP/rtp/061484E1.flv

項目推流

SIP 服務(wù)和流媒體服務(wù)就緒了,就可以推流了。用 /api/devices 查到 deviceId 和 channelId,然后調(diào) SIP 服務(wù)的播放接口

GET /api/play/37010200492000000001/34020000001320000001 預(yù)覽指定設(shè)備通道的音視頻

成功調(diào)用后會返回ssrc:

{"ssrc":"0102008033"}

ssrc 轉(zhuǎn)換為16進制后為 061484E1

查看流媒體服務(wù)的日志如下:

注:公網(wǎng)服務(wù)器如沒收到推流日志,記得開放端口并檢查 wvp 項目的 media 配置是否正確。

那怎么拿到播放地址呢?https://github.com/xiongziliang/ZLMediaKit/wiki/%E6%92%AD%E6%94%BEurl%E8%A7%84%E5%88%99

如果公網(wǎng)IP是177.11.11.111,轉(zhuǎn)換過來就是:

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 還提供錄制,截圖,動態(tài)添加拉流代理等功能。

五、運行MediaServerUI

拉下項目代碼:https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/

項目啟動后,SIP 服務(wù)調(diào)用 play 接口,流媒體服務(wù)收到消息,在項目的“視頻廣場”中就能看到視頻了。

該項目需注意配置,本項目和流媒體服務(wù)關(guān)聯(lián)的,調(diào)用接口也是流媒體 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是流媒體服務(wù)IP,如果 ZLMediaKit 配置文件中 [http] 配置項的端口改成其它,記得在這里加端口號。

secret 需要和流媒體服務(wù)配置一樣。

baseMediaUrl 是拉流的url,可改成如 rtsp,rtmp,http。

六、整個視頻請求的流程圖

其中流媒體模塊指 ZLMediaServer ,接口模塊與信令模塊指 WVP,視頻設(shè)備指 IPC、NVR

七、FFmpeg 源碼結(jié)構(gòu)

FFMPEG中結(jié)構(gòu)體很多。最關(guān)鍵的結(jié)構(gòu)體分成以下幾類:

a) 解協(xié)議(http,rtsp,rtmp,mms)

AVIOContext,URLProtocol,URLContext主要存儲視音頻用的協(xié)議類型及狀態(tài)。URLProtocol存儲輸入視音頻使用的封裝格式。每種協(xié)議都對應(yīng)個URLProtocol結(jié)構(gòu)。(注意:FFMPEG中文件也被當(dāng)做一種協(xié)議“file”)

協(xié)議httpflvrtmphlsdash
傳輸方式http流tcp流httphttp
視頻封裝格式flvflv tagTs文件Mp4 3gp webm
延時
數(shù)據(jù)分段連續(xù)流連續(xù)流切片文件切片文件
Html5播放通過html5解封包播放(flv.js)不支持通過html5解封包播放(hls.js)如dash文件列表是mp4webm文件,可直接播放
  • 用HTTP方式: 通過服務(wù)器將FLV下到本地,然后通過NetConnection的本地連接播放,這種方法是播放本地視頻,在本地緩存可找到該FLV。

    將直播流模擬成FLV文件,通過HTTP協(xié)議下載模式實現(xiàn)流媒體傳輸?shù)膮f(xié)議,端口號80。建議用HTTP FLV,實時性和RTMP相等。

    優(yōu)點:服務(wù)器下完FLV,服務(wù)器就無消耗了,節(jié)省服務(wù)器消耗,HTTP比RTMP省去協(xié)議交互時間,首屏?xí)r間更短。HTTP可拓展;
    缺點:FLV緩存客戶端,對FLV保密性不好。

  • 用RTMP方式: 通過NetConnection連到FMS(Flash Media Server)或Red5服務(wù)器,并實時播放服務(wù)器FLV文件,可任意選擇視頻播放點,并不象HTTP方式需緩存整個FLV文件到本地才可選擇播放點。

    由上可知,Http方式是本地播放,而RTMP方式是服務(wù)器實時播放。目前的CDN都是基于RTMP的。端口號1935,網(wǎng)絡(luò)用戶均可用,包括非IOS平臺用戶,對非80端口(如1935)無限制的網(wǎng)絡(luò)環(huán)境用戶。

    RTMP(Real Time Messaging Protocol 實時消息傳輸協(xié)議),是 Adobe Systems 公司為 Flash 播放器與服務(wù)器音頻、視頻和數(shù)據(jù)傳輸開發(fā)的開放流媒體傳輸協(xié)議。

    RTMP 協(xié)議基于 TCP,是個協(xié)議族,包括 RTMP 基本協(xié)議及 RTMPT/RTMPS/RTMPE 等變種,由Adobe公司為Flash播放器和服務(wù)器之間音頻、視頻傳輸開發(fā)的實時數(shù)據(jù)通信的網(wǎng)絡(luò)協(xié)議。

    優(yōu)點:FLV 不緩存在客戶端,FLV 保密性好,防 HTTP 下載,延時短;
    缺點:消耗服務(wù)器資源,連接始終是實時的。

  • RTSP: RTSP 1.0標(biāo)準(zhǔn)沒預(yù)測到互聯(lián)網(wǎng)的快速增長 、IPv4 地址短缺導(dǎo)致的 NAT 技術(shù)廣泛使用 及代理服務(wù)器大量存在,它在傳輸可靠性和易用性上都有缺陷。雖然各家廠商都有修補,如支持 RTSP over HTTP、NAT 穿透等,但2005 網(wǎng)絡(luò)視頻大爆炸時,RTSP 1.0并沒得到y(tǒng)outube, hulu, 土豆,優(yōu)酷等視頻服務(wù)提供商的青睞,相反,Adobe公司的私有流媒體技術(shù) RTMP 以其優(yōu)秀的易用性和富媒體的一體化集成,得到多數(shù)視頻服務(wù)提供商追捧,成為事實的標(biāo)準(zhǔn).

    缺點:web端播放rtsp流的話,需寫插件,且對瀏覽器也很挑剔,flash不支持rtsp,需做 activeX 插件

  • HLS(Http Living Streaming): 是蘋果公司實現(xiàn)的基于 HTTP 的流媒體傳輸協(xié)議。2010 蘋果在 iOS 設(shè)備支持”Live HTTP”的流媒體技術(shù),并不再支持 RTSP 和 Flash 。Live HTTP 本質(zhì)跟基于 HTTP 的文件分段下載接近。在帶寬充裕時,live HTTP 能實現(xiàn)跟RTSP和RTMP同樣的流媒體播放效果,有更好的易用性,更簡單的控制。在HTML5中,視頻文件的點播也采用HTTP作為其承載協(xié)議。

    HLS 可支持流媒體的直播和點播,主要應(yīng)用在 iOS 系統(tǒng),為 iOS 設(shè)備(如 iPhone、iPad)提供音視頻直播和點播方案。

    HLS: IOS平臺下的流媒體傳輸協(xié)議 ,端口號80
    優(yōu)點:H5瀏覽器支持較好,IOS,安卓原生支持。
    缺點:延遲較大。

    HLS 基本原理是當(dāng)采集推流端將視頻流推送到流媒體服務(wù)器時,服務(wù)器將收到的流信息每緩存一段時間就封包成一個新 ts 文件,同時服務(wù)器建立個 m3u8 索引文件來維護最新幾個 ts 片段索引。當(dāng)播放端獲取直播時,它是從 m3u8 索引文件獲取最新 ts 視頻文件片段播放,保證用戶在任何時候都看到較新內(nèi)容,實現(xiàn)近似直播體驗。相對于常見流媒體直播協(xié)議,如 RTMP 協(xié)議、RTSP 協(xié)議等,HLS 最大不同在于直播客戶端獲取到的并不是個完整的數(shù)據(jù)流,而是連續(xù)的、短時長的媒體文件,客戶端不斷的下載并播放這些小文件。這種方式理論最小延時為一個 ts 文件的時長,一般情況為 2-3 個 ts 文件的時長。HLS 分段策略,基本上推薦是 10 秒一個分片,這就看出了 HLS 的缺點:

    • 通常 HLS 直播延時會達到 20-30s,而高延時對需實時互動的直播是不可接受的。
    • HLS 基于短連接 HTTP,意味著 HLS 需不斷與服務(wù)器建立連接,TCP 每次建立連接時的三次握手、慢啟動過程、斷開連接時的四次揮手都會產(chǎn)生消耗。

    不過 HLS 也有它的優(yōu)點:

    • 數(shù)據(jù)通過 HTTP 協(xié)議傳輸,采用 HLS 時不用考慮防火墻或代理問題。
    • 使用短時長的分片文件播放,客戶端可平滑的切換碼率,以適應(yīng)不同帶寬的播放。
    • HLS 是蘋果推出的流媒體協(xié)議,iOS 平臺獲得天然的支持,采用系統(tǒng)提供的 AVPlayer 就能直接播放,不用開發(fā)播放器。
  • HTTP FLV 則是將RTMP封裝在HTTP協(xié)議之上,可更好的穿透防火墻等。

    目前,有兩種Http-Flv的實現(xiàn)方式:一種是基于文件方式,一種是基于包方式

    Http_flv & RTMP

    這兩個協(xié)議實際傳輸?shù)臄?shù)據(jù)一樣,數(shù)據(jù)都是flv文件的tag。http_flv是個無限大的http流文件,只能直播,而rtmp還可推流和更多操作。但http的好處是以80端口通信的,穿透性強,且rtmp是非開放協(xié)議。

    這兩個協(xié)議是如今直播平臺主選的直播方式,主要原因是延時極低。

    RTMP延遲1s左右,HTTPFLV延遲1-2s左右,可用于對延遲較苛刻的場景,但要注意兼容性。

b) 解封裝(flv、avi、rmvb、mp4)

AVFormatContext 主要存儲視音頻封裝格式中的信息;AVInputFormat 存儲輸入視音頻用的封裝格式。每種視音頻封裝格式都對應(yīng)個AVInputFormat 結(jié)構(gòu)。

c) 解碼(h264、mpeg2、aac、mp3)

每個 AVStream 存儲一個視頻/音頻流的相關(guān)數(shù)據(jù);每個 AVStream 對應(yīng)個AVCodecContext,存儲該視頻/音頻流使用解碼方式的相關(guān)數(shù)據(jù);每個AVCodecContext 中對應(yīng)一個AVCodec,包含該視頻/音頻對應(yīng)的解碼器。每種解碼器都對應(yīng)個AVCodec結(jié)構(gòu)。

d) 存數(shù)據(jù)

視頻一般每個 AVPacket 是一幀;音頻可能有好幾幀

解碼前數(shù)據(jù):AVPacket(h264、aac)
解碼后數(shù)據(jù):AVFrame(yuv、pcm)

他們間的對應(yīng)關(guān)系如下:

總結(jié)

以上是生活随笔為你收集整理的视频-摄像机-推流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。