国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Qt/C++編寫(xiě)監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)

這篇具有很好參考價(jià)值的文章主要介紹了Qt/C++編寫(xiě)監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

現(xiàn)在各個(gè)監(jiān)控大廠做的設(shè)備,基本上都會(huì)支持通過(guò)rtsp直接取流顯示,而且做的比較好的還支持通過(guò)rtsp回放取流,基本上都會(huì)約定一個(gè)字符串的規(guī)則,每個(gè)廠家都是不一樣的規(guī)則,比如回放對(duì)應(yīng)的rtsp地址還要帶上時(shí)間范圍,回放肯定要指定一個(gè)開(kāi)始時(shí)間和結(jié)束時(shí)間。這里需要特別提示的是,按道理rtsp是實(shí)時(shí)視頻流,一般是沒(méi)有時(shí)長(zhǎng)的,而回放的rtsp視頻流是帶了時(shí)長(zhǎng)的,所以可以通過(guò)seek來(lái)定位播放位置,這個(gè)就很方便用戶(hù)在軟件上任意拖動(dòng)和切換播放位置,以前我一直以為rtsp實(shí)時(shí)視頻流不可能有時(shí)長(zhǎng),原來(lái)是自己孤陋寡聞了,在通過(guò)一個(gè)老萬(wàn)音視頻大佬的指點(diǎn)下才得知這個(gè)特性,這個(gè)特性當(dāng)然需要設(shè)備廠家在后端實(shí)現(xiàn)支持。

有了回放可以切換播放進(jìn)度位置這個(gè)特性,意味著回放這塊不需要用GB28181國(guó)標(biāo)去解析,直接構(gòu)建對(duì)應(yīng)的回放視頻流字符串就可以,目前測(cè)試下來(lái),正常播放和切換進(jìn)度播放一點(diǎn)問(wèn)題沒(méi)有,唯獨(dú)倍速播放有問(wèn)題,目前看下來(lái)還是不支持倍速播放的,不知道是不是還有其他的機(jī)關(guān)要素控制比如參數(shù)啥的。其實(shí)取流回放的核心就是根據(jù)不同廠家拿到對(duì)應(yīng)設(shè)備的rtsp字符串即可,解碼那邊要拿到時(shí)長(zhǎng),并當(dāng)做文件處理,因?yàn)槲募?lèi)型的可以切換播放進(jìn)度。

二、效果圖

Qt/C++編寫(xiě)監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-513540.html

三、體驗(yàn)地址

  1. 國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
  2. 國(guó)際站點(diǎn):https://github.com/feiyangqingyun
  3. 個(gè)人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 體驗(yàn)地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_demo。

四、功能特點(diǎn)

  1. 支持各種音視頻文件、本地?cái)z像頭設(shè)備,各種視頻流網(wǎng)絡(luò)流。
  2. 支持開(kāi)始播放、暫停播放、繼續(xù)播放、停止播放、設(shè)置播放進(jìn)度、倍速播放。
  3. 可設(shè)置音量、靜音切換、抓拍圖片、錄像存儲(chǔ)。
  4. 自動(dòng)提取專(zhuān)輯信息比如標(biāo)題、藝術(shù)家、專(zhuān)輯、專(zhuān)輯封面,自動(dòng)顯示專(zhuān)輯封面。
  5. 完美支持音視頻同步和倍速播放。
  6. 解碼策略支持速度優(yōu)先、質(zhì)量?jī)?yōu)先、均衡處理、最快速度。
  7. 支持手機(jī)視頻旋轉(zhuǎn)角度顯示,比如一般手機(jī)拍攝的視頻是旋轉(zhuǎn)了90度的,解碼顯示的時(shí)候需要重新旋轉(zhuǎn)90度才是正的。
  8. 自動(dòng)轉(zhuǎn)換yuv420格式,比如本地?cái)z像頭是yuyv422格式,有些視頻文件是xx格式,統(tǒng)一將非yuv420格式轉(zhuǎn)換,然后再進(jìn)行處理。
  9. 支持硬解碼dxva2、d3d11va等,性能極高尤其是大分辨率比如4K視頻。
  10. 視頻響應(yīng)極低延遲0.2s左右,極速響應(yīng)打開(kāi)視頻流0.5s左右,專(zhuān)門(mén)做了優(yōu)化處理。
  11. 硬解碼和GPU繪制組合,極低CPU占用,比??荡笕A等客戶(hù)端更優(yōu)。
  12. 支持視頻流中的各種音頻格式,AAC、PCM、G.726、G.711A、G.711Mu、G.711ulaw、G.711alaw、MP2L2等都支持,推薦選擇AAC兼容性跨平臺(tái)性最好。
  13. 視頻存儲(chǔ)支持yuv、h264、mp4多種格式,音頻存儲(chǔ)支持pcm、wav、aac多種格式。默認(rèn)視頻mp4格式、音頻aac格式。
  14. 支持分開(kāi)存儲(chǔ)音頻視頻文件,也支持合并到一個(gè)mp4文件,默認(rèn)策略是無(wú)論何種音視頻文件格式存儲(chǔ),最終都轉(zhuǎn)成mp4及aac格式,然后合并成音視頻一起的mp4文件。
  15. 支持本地?cái)z像頭實(shí)時(shí)視頻顯示帶音頻輸入輸出,音視頻錄制合并到一個(gè)mp4文件。
  16. 支持H264/H265編碼(現(xiàn)在越來(lái)越多的監(jiān)控?cái)z像頭是H265視頻流格式)生成視頻文件,內(nèi)部自動(dòng)識(shí)別切換編碼格式。
  17. 自動(dòng)識(shí)別視頻流動(dòng)態(tài)分辨率改動(dòng),重新打開(kāi)視頻流。
  18. 支持用戶(hù)信息中包含特殊字符(比如用戶(hù)信息中包含+#@等字符)的視頻流播放,內(nèi)置解析轉(zhuǎn)義處理。
  19. 純qt+ffmpeg解碼,非sdl等第三方繪制播放依賴(lài),gpu繪制采用qopenglwidget,音頻播放采用qaudiooutput。
  20. 同時(shí)支持ffmpeg2、ffmpeg3、ffmpeg4、ffmpeg5、ffmpeg6以及后續(xù)版本,全部做了兼容處理。如果需要支持xp需要選用ffmpeg3或ffmpeg2。
  21. 支持濾鏡,源頭帶各種水印及圖形效果,可以將OSD標(biāo)簽信息和各種圖形信息寫(xiě)入到MP4文件。

五、相關(guān)代碼

//地址參數(shù)結(jié)構(gòu)體
struct UrlPara {
    QString deviceIP;           //通信地址
    int devicePort;             //通信端口
    QString userName;           //用戶(hù)名稱(chēng)
    QString userPwd;            //用戶(hù)密碼

    int channel;                //通道編號(hào)
    int streamType;             //碼流類(lèi)型
    QString companyName;        //廠家標(biāo)識(shí)
    CompanyType companyType;    //廠家類(lèi)型

    int videoType;              //視頻類(lèi)型(0-實(shí)時(shí)/1-回放)
    QDateTime dateTimeStart;    //開(kāi)始時(shí)間(回放專(zhuān)用)
    QDateTime dateTimeEnd;      //結(jié)束時(shí)間(回放專(zhuān)用)

    UrlPara() {
        devicePort = 0;
        channel = 0;
        streamType = 0;
    }

    //重載打印輸出格式
    friend QDebug operator << (QDebug debug, const UrlPara &urlPara) {
        QStringList list;
        list << QString("通信地址: %1").arg(urlPara.deviceIP);
        list << QString("通信端口: %1").arg(urlPara.devicePort);
        list << QString("用戶(hù)名稱(chēng): %1").arg(urlPara.userName);
        list << QString("用戶(hù)密碼: %1").arg(urlPara.userPwd);

        list << QString("通道編號(hào): %1").arg(urlPara.channel);
        list << QString("碼流類(lèi)型: %1").arg(urlPara.streamType);
        list << QString("廠家標(biāo)識(shí): %1").arg(urlPara.companyName);
        list << QString("廠家類(lèi)型: %1").arg(urlPara.companyType);

#if (QT_VERSION >= QT_VERSION_CHECK(5,4,0))
        debug.noquote() << list.join("\n");
#else
        debug << list.join("\n");
#endif
        return debug;
    }
};

QString UrlHelper::getRtspUrl(const UrlPara &urlPara)
{
    QString url;
    //頭部地址格式完全一致
    QString head = QString("rtsp://%1:%2@%3:554").arg(urlPara.userName).arg(urlPara.userPwd).arg(urlPara.deviceIP);
    if (urlPara.companyType == CompanyType_HaiKang) {
        //實(shí)時(shí)預(yù)覽格式 rtsp://admin:12345@192.168.1.128:554/Streaming/Channels/101?transportmode=unicast
        //視頻回放格式 rtsp://admin:12345@192.168.1.128:554/Streaming/tracks/101?starttime=20120802t063812z&endtime=20120802t064816z
        //流媒體視頻流 rtsp://172.6.24.15:554/Devicehc8://172.6.22.106:8000:0:0?username=admin&password=12345
        //日期時(shí)間格式 ISO 8601 表示Zulu(GMT) 時(shí)間 YYYYMMDD”T”HHmmSS.fraction”Z”,
        //unicast表示單播,multicast表示多播,默認(rèn)單播可以省略
        //101解析: 1是通道號(hào) 01是通道的碼流編號(hào) 也可以是02 03
        QString startTimeISO = urlPara.dateTimeStart.toString(Qt::ISODate);
        startTimeISO.replace("-", "");
        startTimeISO.replace(":", "");
        startTimeISO.toLower();

        QString endTimeISO = urlPara.dateTimeEnd.toString(Qt::ISODate);
        endTimeISO.replace("-", "");
        endTimeISO.replace(":", "");
        endTimeISO.toLower();

        //通道號(hào)和碼流編號(hào)
        QString info = QString("%1%2%3").arg(urlPara.channel).arg(0).arg(urlPara.streamType + 1);
        //回放時(shí)間范圍
        QString time = QString("starttime=%1z&endtime=%2z").arg(startTimeISO).arg(endTimeISO);
        //實(shí)時(shí)和回放地址格式不同
        if (urlPara.videoType == 0) {
            url = QString("%1/Streaming/Channels/%2").arg(head).arg(info);
        } else if (urlPara.videoType == 1) {
            url = QString("%1/Streaming/tracks/%2?%3").arg(head).arg(info).arg(time);
        }
    } else if (urlPara.companyType == CompanyType_DaHua) {
        //實(shí)時(shí)預(yù)覽格式 rtsp://192.168.1.128:554/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif
        //視頻回放格式 rtsp://admin:12345@192.168.1.128:554/cam/playback?channel=1&subtype=0&starttime=2021_03_18_11_36_01&endtime=2021_03_18_12_05_01
        QString startTimeStr = urlPara.dateTimeStart.toString("yyyy_MM_dd_HH_mm_ss");
        QString endTimeStr = urlPara.dateTimeEnd.toString("yyyy_MM_dd_HH_mm_ss");
        //通道號(hào)和碼流編號(hào)
        QString info = QString("channel=%1&subtype=%2").arg(urlPara.channel).arg(urlPara.streamType);
        //回放時(shí)間范圍
        QString time = QString("starttime=%1&endtime=%2").arg(startTimeStr).arg(endTimeStr);
        //實(shí)時(shí)和回放地址格式不同
        if (urlPara.videoType == 0) {
            url = QString("%1/cam/realmonitor?%2&unicast=true&proto=Onvif").arg(head).arg(info);
        } else if (urlPara.videoType == 1) {
            url = QString("%1/cam/playback?%2&%3").arg(head).arg(info).arg(time);
        }
    } else {
        //實(shí)時(shí)預(yù)覽格式 rtsp://admin:12345@192.168.1.128:554/live?channel=1&stream=1
        //視頻回放格式 rtsp://admin:12345@192.168.1.128:554/file?channel=1&start=1494485280&stop=1494485480
        //先轉(zhuǎn)換時(shí)間戳,1970年到該時(shí)間經(jīng)過(guò)的秒數(shù)
        qint64 startTimeSec = urlPara.dateTimeStart.toMSecsSinceEpoch() / 1000;
        qint64 stopTimeSec = urlPara.dateTimeEnd.toMSecsSinceEpoch() / 1000;
        //回放時(shí)間范圍
        QString time = QString("start=%1&stop=%2").arg(startTimeSec).arg(stopTimeSec);
        //實(shí)時(shí)和回放地址格式不同
        if (urlPara.videoType == 0) {
            url = QString("%1/live?channel=%2&stream=%3").arg(head).arg(urlPara.channel).arg(urlPara.streamType);
        } else if (urlPara.videoType == 1) {
            url = QString("%1/file?channel=%2&%3").arg(head).arg(urlPara.channel).arg(time);
        }
    }

    //還有一種通用格式 rtsp://admin:12345@192.168.1.128:554/0  0-主碼流 1-子碼流
    return url;
}

到了這里,關(guān)于Qt/C++編寫(xiě)監(jiān)控實(shí)時(shí)顯示和取流回放工具(回放支持切換進(jìn)度)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue3實(shí)現(xiàn)海康威視根據(jù)??挡寮M(jìn)行監(jiān)控實(shí)時(shí)預(yù)覽和回放功能

    因?yàn)槲业奈恼乱呀?jīng)寫(xiě)過(guò)基于vue實(shí)現(xiàn)??祑eb插件進(jìn)行視頻播放開(kāi)箱即用文章,這個(gè)文章是利用 vite+vue3+js 進(jìn)行編寫(xiě)的,大致內(nèi)容跟vue2一樣,拿過(guò)去能直接用。 至于我為什么要用js而不用ts,因?yàn)楹?堤峁┑娜齻€(gè)腳本為js語(yǔ)言的,ts嘗試過(guò)一次,我道行太淺,沒(méi)搞明白。 這些代碼是

    2024年02月05日
    瀏覽(130)
  • (二)Qt下多線程實(shí)現(xiàn)多個(gè)??倒I(yè)相機(jī)內(nèi)觸發(fā)采集回調(diào)取流顯示

    (二)Qt下多線程實(shí)現(xiàn)多個(gè)海康工業(yè)相機(jī)內(nèi)觸發(fā)采集回調(diào)取流顯示

    提示:這里是該系列文章的所有文章的目錄 第一章:(一)Qt下實(shí)現(xiàn)多個(gè)??倒I(yè)相機(jī)內(nèi)觸發(fā)采集回調(diào)取流顯示 第二章:(二)Qt下多線程實(shí)現(xiàn)多個(gè)??倒I(yè)相機(jī)內(nèi)觸發(fā)采集回調(diào)取流顯示 在本系列的上一篇文章中,我們講述了實(shí)現(xiàn)??倒I(yè)相機(jī)的連接,采用內(nèi)觸發(fā)采集模式,

    2024年02月16日
    瀏覽(116)
  • Qt編寫(xiě)視頻監(jiān)控系統(tǒng)74-懸浮工具欄(半透明/上下左右位置/自定義按鈕)

    Qt編寫(xiě)視頻監(jiān)控系統(tǒng)74-懸浮工具欄(半透明/上下左右位置/自定義按鈕)

    在監(jiān)控系統(tǒng)中一般在視頻實(shí)時(shí)預(yù)覽的時(shí)候,希望提供一個(gè)懸浮工具條,可以顯示一些提示信息比如分辨率、碼率、幀率,提供一堆快捷操作按鈕,可以錄像、抓拍、云臺(tái)控制、關(guān)閉等操作,參考了國(guó)內(nèi)很多監(jiān)控廠商客戶(hù)端軟件,總結(jié)下來(lái)基本就是懸浮條可以半透明懸浮在通道

    2024年02月06日
    瀏覽(22)
  • vue2實(shí)現(xiàn)??低暩鶕?jù)??挡寮M(jìn)行監(jiān)控實(shí)時(shí)預(yù)覽和回放功能,全套代碼,開(kāi)箱即用。

    vue2實(shí)現(xiàn)??低暩鶕?jù)海康插件進(jìn)行監(jiān)控實(shí)時(shí)預(yù)覽和回放功能,全套代碼,開(kāi)箱即用。

    ?這是一套拿到手就能直接用的根據(jù)海康提供的攝像機(jī)節(jié)點(diǎn)實(shí)時(shí)預(yù)覽和回放的全步驟代碼,開(kāi)箱即用。 ?我的是基于vue2寫(xiě)的,vue3可以看我下一篇文章。 很多人在開(kāi)發(fā)vue項(xiàng)目的時(shí)候,不知道怎么去開(kāi)發(fā)視頻實(shí)時(shí)預(yù)覽和回放功能,然后一直查文檔,再去看別人寫(xiě)的項(xiàng)目,就是無(wú)

    2023年04月15日
    瀏覽(23)
  • Qt/C++音視頻開(kāi)發(fā)69-保存監(jiān)控pcm音頻數(shù)據(jù)到mp4文件/監(jiān)控錄像/錄像存儲(chǔ)和回放/264/265/aac/pcm等

    用ffmpeg做音視頻保存到mp4文件,都會(huì)遇到一個(gè)問(wèn)題,尤其是在視頻監(jiān)控行業(yè),就是監(jiān)控?cái)z像頭設(shè)置的音頻是PCM/G711A/G711U,解碼后對(duì)應(yīng)的格式是pcm_s16be/pcm_alaw/pcm_mulaw,將這個(gè)原始的音頻流保存到mp4文件是會(huì)報(bào)錯(cuò)的,在調(diào)用avformat_write_header寫(xiě)文件頭的時(shí)候提示(-22) Invalid argument,

    2024年04月11日
    瀏覽(38)
  • python調(diào)用海康網(wǎng)絡(luò)攝像頭,實(shí)時(shí)顯示監(jiān)控內(nèi)容

    python調(diào)用海康網(wǎng)絡(luò)攝像頭,實(shí)時(shí)顯示監(jiān)控內(nèi)容

    用網(wǎng)線將海康威視攝像頭與電腦連接在一起;(或者用交換機(jī),在一個(gè)交換機(jī)下面) 海康攝像頭的默認(rèn)ip是192.168.1.64 效果:和通過(guò)??禂z像頭網(wǎng)址效果一樣 rtsp://用戶(hù)名:密碼@ip地址/Streaming/Channels/2

    2024年02月16日
    瀏覽(31)
  • Qt編寫(xiě)視頻監(jiān)控系統(tǒng)79-四種界面導(dǎo)航欄的設(shè)計(jì)

    Qt編寫(xiě)視頻監(jiān)控系統(tǒng)79-四種界面導(dǎo)航欄的設(shè)計(jì)

    最初視頻監(jiān)控系統(tǒng)按照二級(jí)菜單的設(shè)計(jì)思路,頂部標(biāo)題欄一級(jí)菜單,左側(cè)對(duì)應(yīng)二級(jí)菜單,最初采用圖片在上面,文字在下面的按鈕方式展示,隨著功能的增加,二級(jí)菜單越來(lái)越多,如果都是這個(gè)圖文上下排列的按鈕,那左側(cè)高度空間不夠,比如在筆記本1366x768的分辨率上,左

    2024年02月09日
    瀏覽(21)
  • Qt編寫(xiě)視頻監(jiān)控系統(tǒng)72-通過(guò)onvif增刪改查OSD

    Qt編寫(xiě)視頻監(jiān)控系統(tǒng)72-通過(guò)onvif增刪改查OSD

    之前監(jiān)控系統(tǒng)中原創(chuàng)的onvif協(xié)議解析機(jī)制,已經(jīng)能夠滿足絕大部分用戶(hù)的需要,比如搜索設(shè)備、獲取視頻流地址并播放、云臺(tái)控制、預(yù)置位管理、圖片亮度色彩飽和度等參數(shù)設(shè)置等,近期又多了一個(gè)需求,那就是通過(guò)onvif國(guó)際標(biāo)準(zhǔn)協(xié)議來(lái)對(duì)攝像頭的OSD進(jìn)行增刪改查,可以通過(guò)協(xié)

    2024年02月08日
    瀏覽(21)
  • docker 部署 sentinel ,包含實(shí)時(shí)監(jiān)控不顯示的解決方案

    docker 部署 sentinel ,包含實(shí)時(shí)監(jiān)控不顯示的解決方案

    對(duì)于實(shí)時(shí)監(jiān)控不顯示的解決方案可以直接看 4. 總結(jié) sentinel-dashboard就是一個(gè)SpringBoot項(xiàng)目,直接使用命令啟動(dòng)即可,所以可以自定義配置docker啟動(dòng)。 如果沒(méi)有特殊需要可以直接下載jar,需要修改源碼則下載源碼包即可,下載地址:https://github.com/alibaba/Sentinel/releases,下載相應(yīng)版

    2024年02月09日
    瀏覽(35)
  • 練習(xí) Qt 實(shí)時(shí)顯示鼠標(biāo)坐標(biāo)位置

    Qt 入門(mén)實(shí)戰(zhàn)教程(目錄) 本文是文章 Qt鼠標(biāo)點(diǎn)擊事件處理:顯示鼠標(biāo)點(diǎn)擊位置(完整示例) 的一個(gè)作業(yè)(下文稱(chēng)之為“前驅(qū)課程”)。 前驅(qū)課程中,我們完整的展示了如何在QtCreator中添加成員函數(shù),并使用重構(gòu)工具添加函數(shù)定義。 只需要模仿前驅(qū)課程,即可完成本文的作業(yè)

    2024年02月10日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包