亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt音視頻開發怎么設置Onvif時間

發布時間:2021-12-15 10:00:59 來源:億速云 閱讀:138 作者:iii 欄目:互聯網科技

這篇文章主要講解了“Qt音視頻開發怎么設置Onvif時間”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Qt音視頻開發怎么設置Onvif時間”吧!

一、前言

對設備設置時間很有必要,這個是必備的功能,畢竟大部分的前端設備比如攝像機本身不帶BIOS電池的,所以沒法存儲時間,要么設置了NTP地址來同步時間,要么其他設備主動對他進行設置時間,如果時間不正確了,意味著本地畫面顯示的時間字符串,本地存儲的視頻錄像文件等,都可能是不正確的,所以一般的處理是NVR一旦連上攝像機設備以后,立馬將攝像機的時間設置成NVR的時間,這樣就保持了一致。

用onvif進行時間設置主要由兩種,一種是通過設置NTP服務地址以后,主動調用NTP同步來進行,另外一種就是發送日期時間的數據包給設備,讓他自己解析處理,這里要注意的是,數據包中的日期時間是UTC格式的,即倫敦時間,所以在使用的時候需要自己本地先轉換成UTC時間在發送,Qt內置了轉換成UTC時間的方法 QDateTime::currentDateTime().toUTC()。

onvif主要的功能:

  1. 搜索設備,獲取設備的信息比如廠家、型號等。

  2. 獲取設備的多個配置文件信息profile。

  3. 獲取對應配置文件的視頻流地址rtsp,以及分辨率等參數。

  4. 云臺控制,上下左右移動,焦距放大縮小,相對和絕對移動。

  5. 獲取預置位信息,觸發預置位。

  6. 訂閱事件,接收設備的各種消息尤其是報警事件比如IO口的報警。

  7. 抓圖,獲取設備當前的圖片。

  8. 獲取、創建、刪除用戶信息。

  9. 獲取和設備網絡配置信息比如IP地址等。

  10. 獲取和設置NTP時間同步以及設置設備時間。

  11. 獲取和設置視頻參數和圖片參數(亮度、色彩、飽和度)。

  12. 重啟設備。

onvif的處理流程:

  1. 綁定組播IP(239.255.255.250)和端口(3702),發送固定的xml格式的數據搜索設備。

  2. 接收到的xml格式的數據解析,得到設備的Onvif地址。

  3. 對Onvif地址發送對應的數據,收到數據取出對應的節點數據。

  4. 請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的配置文件,Ptz地址用來云臺控制。

  5. ptz控制是對Ptz地址發送對應的數據即可。

  6. 設置了用戶認證的需要組織用戶token信息一塊發送,每次都需要作鑒權處理。

  7. 接收到的數據不是標準的xml數據,沒法按照正常的節點解析來處理,只能用QXmlQuery來做。

  8. 每個廠家設備返回的數據未必完全一致,基本上都不一致,需要進行模糊查找節點值。

  9. 特意采用底層協議解析,因為soap太臃腫函數名稱太另類,特意做的輕量級的。

  10. 兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool。

二、功能特點

  1. 廣播搜索設備,支持IPC和NVR,依次返回,可選擇不同的網卡IP。

  2. 依次獲取Onvif地址、Media地址、Profile文件、Rtsp地址。

  3. 可對指定的Profile獲取視頻流Rtsp地址,比如主碼流子碼流地址。

  4. 可對每個設備設置Onvif用戶信息,用于認證獲取詳細信息。

  5. 可實時預覽攝像機圖像。

  6. 支持云臺控制,可上下左右調節云臺,支持絕對移動和相對移動,可放到和縮小圖像遠近。

  7. 支持Qt4和Qt5任意Qt版本,親測Qt4.7.0到Qt5.14.2。

  8. 支持任意編譯器,親測mingw、msvc、gcc、clang。

  9. 支持任意操作系統,親測xp、win7、win10、android、linux、嵌入式linux、樹莓派全志H3等。

  10. 支持任意Onvif攝像機和NVR,親測海康、大華、宇視、華為、海思芯片內核等,可定制開發。

  11. 支持對指定IP地址及onvif地址進行單播搜索,比如跨網段情況下非常有用。

  12. 支持指定過濾條件過濾搜索設備。

  13. 支持搜索間隔設置,保證所有設備搜索回來,在大量設備現場很有用。

  14. 可對圖片參數(亮度、色彩度、飽和度)進行設置。

  15. 支持NTP校時和時間同步設置。

  16. 純Qt編寫,超級小巧輕量,總共約2000行代碼,不依賴任何第三方的庫和組件,跨平臺。

  17. 封裝好了通用的數據發送和接收解析的函數,可以非常方便的自行拓展其他Onvif處理。

  18. 工具上提供了收發數據文本框,顯示收發的數據,方便查看和分析。

  19. 支持所有Onvif設備,代碼工整,接口友好,直接引入pri即可使用。

三、效果圖

Qt音視頻開發怎么設置Onvif時間

四、核心代碼

QString OnvifOther::getDateTime()
{
    QString result = writeData("GetSystemDateAndTime", "tt:Year|tt:Month|tt:Day|tt:Hour|tt:Minute|tt:Second|tt:TZ", "獲取時間", 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();

    //計算時區并賦值
    QString timezone = list.at(6);
    timezone = timezone.mid(6, timezone.length() - 6);
    device->timezone = timezone;

    //將日期根據時區進行運算
    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);
    }

    //不足兩位補零
    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", "設置時間", 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();
    //最后參數表示超時時間 一般請求都是很快的 除非對方不在線則卡很久 需要設置下超時時間
    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()) {
                //可能有多個關鍵字需要獲取
                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音視頻開發怎么設置Onvif時間”的內容了,經過本文的學習后,相信大家對Qt音視頻開發怎么設置Onvif時間這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

象州县| 揭阳市| 泊头市| 泰兴市| 松原市| 和田县| 江口县| 连江县| 航空| 营山县| 绩溪县| 图木舒克市| 济源市| 大兴区| 桂阳县| 阜康市| 龙陵县| 乌苏市| 额济纳旗| 五台县| 沁阳市| 合阳县| 江孜县| 望都县| 天津市| 彩票| 阿勒泰市| 吉隆县| 大姚县| 菏泽市| 兴山县| 宁德市| 抚顺县| 罗源县| 敦化市| 肥城市| 兴仁县| 芦溪县| 固安县| 沂南县| 双江|