這篇文章主要講解了“Qt音視頻開(kāi)發(fā)怎么設(shè)置Onvif時(shí)間”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Qt音視頻開(kāi)發(fā)怎么設(shè)置Onvif時(shí)間”吧!
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括果洛州網(wǎng)站建設(shè)、果洛州網(wǎng)站制作、果洛州網(wǎng)頁(yè)制作以及果洛州網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,果洛州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到果洛州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
對(duì)設(shè)備設(shè)置時(shí)間很有必要,這個(gè)是必備的功能,畢竟大部分的前端設(shè)備比如攝像機(jī)本身不帶BIOS電池的,所以沒(méi)法存儲(chǔ)時(shí)間,要么設(shè)置了NTP地址來(lái)同步時(shí)間,要么其他設(shè)備主動(dòng)對(duì)他進(jìn)行設(shè)置時(shí)間,如果時(shí)間不正確了,意味著本地畫(huà)面顯示的時(shí)間字符串,本地存儲(chǔ)的視頻錄像文件等,都可能是不正確的,所以一般的處理是NVR一旦連上攝像機(jī)設(shè)備以后,立馬將攝像機(jī)的時(shí)間設(shè)置成NVR的時(shí)間,這樣就保持了一致。
用onvif進(jìn)行時(shí)間設(shè)置主要由兩種,一種是通過(guò)設(shè)置NTP服務(wù)地址以后,主動(dòng)調(diào)用NTP同步來(lái)進(jìn)行,另外一種就是發(fā)送日期時(shí)間的數(shù)據(jù)包給設(shè)備,讓他自己解析處理,這里要注意的是,數(shù)據(jù)包中的日期時(shí)間是UTC格式的,即倫敦時(shí)間,所以在使用的時(shí)候需要自己本地先轉(zhuǎn)換成UTC時(shí)間在發(fā)送,Qt內(nèi)置了轉(zhuǎn)換成UTC時(shí)間的方法 QDateTime::currentDateTime().toUTC()。
onvif主要的功能:
搜索設(shè)備,獲取設(shè)備的信息比如廠家、型號(hào)等。
獲取設(shè)備的多個(gè)配置文件信息profile。
獲取對(duì)應(yīng)配置文件的視頻流地址rtsp,以及分辨率等參數(shù)。
云臺(tái)控制,上下左右移動(dòng),焦距放大縮小,相對(duì)和絕對(duì)移動(dòng)。
獲取預(yù)置位信息,觸發(fā)預(yù)置位。
訂閱事件,接收設(shè)備的各種消息尤其是報(bào)警事件比如IO口的報(bào)警。
抓圖,獲取設(shè)備當(dāng)前的圖片。
獲取、創(chuàng)建、刪除用戶信息。
獲取和設(shè)備網(wǎng)絡(luò)配置信息比如IP地址等。
獲取和設(shè)置NTP時(shí)間同步以及設(shè)置設(shè)備時(shí)間。
獲取和設(shè)置視頻參數(shù)和圖片參數(shù)(亮度、色彩、飽和度)。
重啟設(shè)備。
onvif的處理流程:
綁定組播IP(239.255.255.250)和端口(3702),發(fā)送固定的xml格式的數(shù)據(jù)搜索設(shè)備。
接收到的xml格式的數(shù)據(jù)解析,得到設(shè)備的Onvif地址。
對(duì)Onvif地址發(fā)送對(duì)應(yīng)的數(shù)據(jù),收到數(shù)據(jù)取出對(duì)應(yīng)的節(jié)點(diǎn)數(shù)據(jù)。
請(qǐng)求Onvif地址獲取Media地址和Ptz地址,Media地址用來(lái)獲取詳細(xì)的配置文件,Ptz地址用來(lái)云臺(tái)控制。
ptz控制是對(duì)Ptz地址發(fā)送對(duì)應(yīng)的數(shù)據(jù)即可。
設(shè)置了用戶認(rèn)證的需要組織用戶token信息一塊發(fā)送,每次都需要作鑒權(quán)處理。
接收到的數(shù)據(jù)不是標(biāo)準(zhǔn)的xml數(shù)據(jù),沒(méi)法按照正常的節(jié)點(diǎn)解析來(lái)處理,只能用QXmlQuery來(lái)做。
每個(gè)廠家設(shè)備返回的數(shù)據(jù)未必完全一致,基本上都不一致,需要進(jìn)行模糊查找節(jié)點(diǎn)值。
特意采用底層協(xié)議解析,因?yàn)閟oap太臃腫函數(shù)名稱(chēng)太另類(lèi),特意做的輕量級(jí)的。
兩個(gè)必備工具,Onvif Device Manager 和 Onvif Device Test Tool。
廣播搜索設(shè)備,支持IPC和NVR,依次返回,可選擇不同的網(wǎng)卡IP。
依次獲取Onvif地址、Media地址、Profile文件、Rtsp地址。
可對(duì)指定的Profile獲取視頻流Rtsp地址,比如主碼流子碼流地址。
可對(duì)每個(gè)設(shè)備設(shè)置Onvif用戶信息,用于認(rèn)證獲取詳細(xì)信息。
可實(shí)時(shí)預(yù)覽攝像機(jī)圖像。
支持云臺(tái)控制,可上下左右調(diào)節(jié)云臺(tái),支持絕對(duì)移動(dòng)和相對(duì)移動(dòng),可放到和縮小圖像遠(yuǎn)近。
支持Qt4和Qt5任意Qt版本,親測(cè)Qt4.7.0到Qt5.14.2。
支持任意編譯器,親測(cè)mingw、msvc、gcc、clang。
支持任意操作系統(tǒng),親測(cè)xp、win7、win10、android、linux、嵌入式linux、樹(shù)莓派全志H3等。
支持任意Onvif攝像機(jī)和NVR,親測(cè)???、大華、宇視、華為、海思芯片內(nèi)核等,可定制開(kāi)發(fā)。
支持對(duì)指定IP地址及onvif地址進(jìn)行單播搜索,比如跨網(wǎng)段情況下非常有用。
支持指定過(guò)濾條件過(guò)濾搜索設(shè)備。
支持搜索間隔設(shè)置,保證所有設(shè)備搜索回來(lái),在大量設(shè)備現(xiàn)場(chǎng)很有用。
可對(duì)圖片參數(shù)(亮度、色彩度、飽和度)進(jìn)行設(shè)置。
支持NTP校時(shí)和時(shí)間同步設(shè)置。
純Qt編寫(xiě),超級(jí)小巧輕量,總共約2000行代碼,不依賴(lài)任何第三方的庫(kù)和組件,跨平臺(tái)。
封裝好了通用的數(shù)據(jù)發(fā)送和接收解析的函數(shù),可以非常方便的自行拓展其他Onvif處理。
工具上提供了收發(fā)數(shù)據(jù)文本框,顯示收發(fā)的數(shù)據(jù),方便查看和分析。
支持所有Onvif設(shè)備,代碼工整,接口友好,直接引入pri即可使用。
QString OnvifOther::getDateTime() { QString result = writeData("GetSystemDateAndTime", "tt:Year|tt:Month|tt:Day|tt:Hour|tt:Minute|tt:Second|tt:TZ", "獲取時(shí)間", true, true); QStringList list = result.split(ResultSplit); if (list.count() != 7) { return result; } QString year = list.at(0).split(":").last(); QString month = list.at(1).split(":").last(); QString day = list.at(2).split(":").last(); QString hour = list.at(3).split(":").last(); QString min = list.at(4).split(":").last(); QString sec = list.at(5).split(":").last(); //計(jì)算時(shí)區(qū)并賦值 QString timezone = list.at(6); timezone = timezone.mid(6, timezone.length() - 6); device->timezone = timezone; //將日期根據(jù)時(shí)區(qū)進(jìn)行運(yùn)算 QString str = QString("%1-%2-%3 %4:%5:%6").arg(year).arg(month).arg(day).arg(hour).arg(min).arg(sec); QDateTime dt = QDateTime::fromString(str, "yyyy-M-d h:m:s"); if (!device->timezone.contains("GMT-08")) { dt = dt.addSecs(8 * 60 * 60); } //不足兩位補(bǔ)零 list = dt.toString("yyyy-M-d-h-m-s").split("-"); result = QString("%1-%2-%3 %4:%5:%6 %7").arg(list.at(0)).arg(list.at(1), 2, '0').arg(list.at(2), 2, '0') .arg(list.at(3), 2, '0').arg(list.at(4), 2, '0').arg(list.at(5), 2, '0').arg(timezone); return result; } bool OnvifOther::setDateTime(const QDateTime &datetime, bool ntp) { QStringList temp = datetime.toString("yyyy-M-d-h-m-s").split("-"); QString wsdl = "http://www.onvif.org/ver10/device/wsdl"; QString schema = "http://www.onvif.org/ver10/schema"; QStringList list; list << QString(" <SetSystemDateAndTime xmlns=\"%1\">").arg(wsdl); list << QString(" <DateTimeType>%1</DateTimeType>").arg(ntp ? "NTP" : "Manual"); list << QString(" <DaylightSavings>%1</DaylightSavings>").arg("false"); list << QString(" <TimeZone>"); list << QString(" <TZ xmlns=\"%1\">%2</TZ>").arg(schema).arg(ntp ? device->timezone : "CST-8"); list << QString(" </TimeZone>"); if (!ntp) { list << QString(" <UTCDateTime>"); list << QString(" <Date xmlns=\"%1\">").arg(schema); list << QString(" <Year>%1</Year>").arg(temp.at(0)); list << QString(" <Month>%1</Month>").arg(temp.at(1)); list << QString(" <Day>%1</Day>").arg(temp.at(2)); list << QString(" </Date>"); list << QString(" <Time xmlns=\"%1\">").arg(schema); list << QString(" <Hour>%1</Hour>").arg(temp.at(3)); list << QString(" <Minute>%1</Minute>").arg(temp.at(4)); list << QString(" <Second>%1</Second>").arg(temp.at(5)); list << QString(" </Time>"); list << QString(" </UTCDateTime>"); } list << QString(" </SetSystemDateAndTime>"); QString result = writeData(list.join("\r\n"), "SetSystemDateAndTimeResponse", "設(shè)置時(shí)間", false); return result.contains("SetSystemDateAndTimeResponse"); } QString OnvifOther::writeData(const QString &key, const QString &value, const QString &flag, bool xmlns, bool value4, quint8 type) { if (device->deviceUrl.isEmpty()) { return QString(); } QString file = device->request->getSendData(key, true, xmlns); QByteArray dataSend = file.toUtf8(); //最后參數(shù)表示超時(shí)時(shí)間 一般請(qǐng)求都是很快的 除非對(duì)方不在線則卡很久 需要設(shè)置下超時(shí)時(shí)間 QNetworkReply *reply = device->request->post(device->deviceUrl, dataSend, 3000); emit sendData(dataSend, device->deviceUrl); QStringList results; QByteArray dataReceive; bool ok = device->checkData(reply, dataReceive, flag); if (ok) { OnvifQuery query; query.setData(dataReceive); if (type == 0) { if (!value.isEmpty()) { //可能有多個(gè)關(guān)鍵字需要獲取 QStringList list = value.split("|"); foreach (QString str, list) { QString result = value4 ? query.getValue4(str) : query.getValue3(str); if (result != "-1") { results << QString("%1:%2").arg(str).arg(result); } } } } else if (type == 1) { results = query.getVideoSource(); } } return results.join(ResultSplit); }
感謝各位的閱讀,以上就是“Qt音視頻開(kāi)發(fā)怎么設(shè)置Onvif時(shí)間”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Qt音視頻開(kāi)發(fā)怎么設(shè)置Onvif時(shí)間這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
本文題目:Qt音視頻開(kāi)發(fā)怎么設(shè)置Onvif時(shí)間
文章路徑:http://jinyejixie.com/article12/ggeggc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、品牌網(wǎng)站建設(shè)、商城網(wǎng)站、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)