溫馨提示×

溫馨提示×

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

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

Qt如何實(shí)現(xiàn)??祍dk本地播放

發(fā)布時(shí)間:2021-12-15 10:02:28 來源:億速云 閱讀:654 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“Qt如何實(shí)現(xiàn)海康sdk本地播放”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Qt如何實(shí)現(xiàn)??祍dk本地播放”吧!

一、前言

??祍dk中包含了MP4解碼播放庫,對應(yīng)的API函數(shù)都是PlayM4開頭的,顧名思義播放MP4,??档囊曨l默認(rèn)可以保存成MP4文件,可以用通用的播放器來播放,這就是為啥前面好多篇文章講到的各種內(nèi)核錄像存儲都改成MP4來存儲,vlc、mpv、ffmpeg等,最終錄像存儲都轉(zhuǎn)換成MP4文件,看來大公司大廠做的也是保存成MP4文件,肯定是有他的道理,至于有多少道理,跟著他學(xué)者他這樣處理就行,可以先不用問不用管,直接上手?jǐn)]代碼就對了,有些東西需要深究原理,而有些東西就沒有必要太過于細(xì)致詢問下去了,折騰下去陷入死胡同,好比知道1+1=2就行,至于為啥=2,交給專門的研究人員去研究就行。

海康sdk的MP4解碼庫,即支持自身的MP4文件,也支持常規(guī)的MP4文件,而且最新版本還支持AVI文件格式,隨便試了本地的MP4文件,也都是支持的,如果需要拿到音視頻數(shù)據(jù),只需要調(diào)用PlayM4_SetDecCallBackMend設(shè)置下解碼回調(diào)函數(shù)即可,比視頻流的回調(diào)流程簡單很多,少了設(shè)置回調(diào)處理函數(shù)一大堆處理,只需要解碼轉(zhuǎn)換成QImage即可。本地文件還需要增加一個(gè)文件結(jié)束回調(diào),這樣能知道什么時(shí)候文件播放完成了,發(fā)出對應(yīng)的信號進(jìn)行處理,可以調(diào)用PlayM4_SetFileEndCallback設(shè)置文件播放完畢回調(diào)函數(shù),在FileEndCallback回調(diào)函數(shù)中,通過異步執(zhí)行QMetaObject::invokeMethod停止函數(shù)來通知界面。

關(guān)于本地文件請注意以下幾點(diǎn):

  1. 文件方式播放下,不能調(diào)用PlayM4_CloseStream。

  2. 流播放下,不能調(diào)用PlayM4_CloseFile接口。

  3. 流開關(guān)接口和文件開關(guān)接口不能交叉使用。

二、功能特點(diǎn)

  1. 支持播放視頻流和本地MP4文件。

  2. 支持句柄和回調(diào)兩種模式。

  3. 多線程顯示圖像,不卡主界面。

  4. 自動(dòng)重連網(wǎng)絡(luò)攝像頭。

  5. 可設(shè)置邊框大小即偏移量和邊框顏色。

  6. 可設(shè)置是否繪制OSD標(biāo)簽即標(biāo)簽文本或圖片和標(biāo)簽位置。

  7. 可設(shè)置兩種OSD位置和風(fēng)格。

  8. 可設(shè)置是否保存到文件以及文件名。

  9. 可直接拖曳文件到haikangwidget控件播放。

  10. 支持h364/h365視頻流。

  11. 可暫停播放和繼續(xù)播放。

  12. 支持存儲單個(gè)視頻文件和定時(shí)存儲視頻文件。

  13. 自定義頂部懸浮條,發(fā)送單擊信號通知,可設(shè)置是否啟用。

  14. 可設(shè)置畫面拉伸填充或者等比例填充。

  15. 可設(shè)置解碼是速度優(yōu)先、質(zhì)量優(yōu)先、均衡處理。

  16. 可對視頻進(jìn)行截圖(原始圖片)和截屏(視頻窗體)。

  17. 錄像文件存儲為MP4文件。

  18. 支持焦距控制、云臺控制。

  19. 可定制功能。

三、效果圖

Qt如何實(shí)現(xiàn)??祍dk本地播放

四、核心代碼

bool HaiKangThread::playLocal()
{
    //轉(zhuǎn)碼以便支持中文路徑
    QTextCodec *codec = QTextCodec::codecForName("gb2312");
    QByteArray data = codec->fromUnicode(url);

    PlayM4_GetPort(&port);
    bool ok = PlayM4_OpenFile(port, data.data());
    if (ok) {
        //設(shè)置文件播放完畢回調(diào)函數(shù)
        PlayM4_SetFileEndCallback(port, FileEndCallback, this);

        //回調(diào)則可以拿到音視頻數(shù)據(jù),否則就直接句柄播放
        if (callback) {
            PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this);
            PlayM4_Play(port, NULL);
        } else {
            PlayM4_Play(port, (HWND)playWidget->winId());
        }

        //同時(shí)播放聲音
        PlayM4_PlaySound(port);

        //倒放
        //PlayM4_ReversePlay(port);

        //快進(jìn)播放,多次調(diào)用速度更快
        //PlayM4_Fast(port);
        //PlayM4_Fast(port);

        ok = true;
        qDebug() << TIMEMS << "打開視頻文件成功" << url;
    } else {
        qDebug() << TIMEMS << "打開視頻文件失敗" << url << PlayM4_GetLastError(port);
    }

    return ok;
}

void HaiKangThread::free()
{
    if (isRtsp) {
        //停止播放+登出設(shè)備
        NET_DVR_StopRealPlay(hand);
        NET_DVR_Logout(hand);
        hand = -1;
    } else {
        //停止播放+關(guān)閉文件+釋放端口
        PlayM4_Stop(port);
        PlayM4_StopSound();
        PlayM4_CloseFile(port);
        PlayM4_FreePort(port);
        port = -1;
    }
}

感謝各位的閱讀,以上就是“Qt如何實(shí)現(xiàn)??祍dk本地播放”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Qt如何實(shí)現(xiàn)??祍dk本地播放這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI