Qt音視頻開發20-海康sdk本地播放

2020-08-30 Qt自定義控制項

一、前言

海康sdk中包含了MP4解碼播放庫,對應的API函數都是PlayM4開頭的,顧名思義播放MP4,海康的視頻默認可以保存成MP4文件,可以用通用的播放器來播放,這就是為啥前面好多篇文章講到的各種內核錄像存儲都改成MP4來存儲,vlc、mpv、ffmpeg等,最終錄像存儲都轉換成MP4文件,看來大公司大廠做的也是保存成MP4文件,肯定是有他的道理,至於有多少道理,跟著他學者他這樣處理就行,可以先不用問不用管,直接上手擼代碼就對了,有些東西需要深究原理,而有些東西就沒有必要太過於細緻詢問下去了,折騰下去陷入死胡同,好比知道1+1=2就行,至於為啥=2,交給專門的研究人員去研究就行。

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

關於本地文件請注意以下幾點:

1. 文件方式播放下,不能調用PlayM4_CloseStream。

2. 流播放下,不能調用PlayM4_CloseFile接口。

3. 流開關接口和文件開關接口不能交叉使用。

二、功能特點

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

2. 支持句柄和回調兩種模式。

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

4. 自動重連網絡攝像頭。

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

6. 可設置是否繪製OSD標籤即標籤文本或圖片和標籤位置。

7. 可設置兩種OSD位置和風格。

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

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

10. 支持h264/h265視頻流。

11. 可暫停播放和繼續播放。

12. 支持存儲單個視頻文件和定時存儲視頻文件。

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

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

15. 可設置解碼是速度優先、質量優先、均衡處理。

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

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

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

19. 可定製功能。

三、效果圖



四、相關站點

1. 國內站點:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo)

2. 國際站點:[https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

3. 個人主頁:[https://blog.csdn.net/feiyangqingyun](https://blog.csdn.net/feiyangqingyun)

4. 知乎主頁:[https://www.zhihu.com/people/feiyangqingyun/](https://www.zhihu.com/people/feiyangqingyun/)

5. 體驗地址:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)

五、核心代碼

bool HaiKangThread::playLocal(){ //轉碼以便支持中文路徑 QtextCodec *codec = QTextCodec::codecForName(&34;); QByteArray data = codec->fromUnicode(url); PlayM4_GetPort(&port); bool ok = PlayM4_OpenFile(port, data.data()); if (ok) { //設置文件播放完畢回調函數 PlayM4_SetFileEndCallback(port, FileEndCallback, this); //回調則可以拿到音視頻數據,否則就直接句柄播放 if (callback) { PlayM4_SetDecCallBackMend(port, DecCallBack, (quser)this); PlayM4_Play(port, NULL); } else { PlayM4_Play(port, (HWND)playWidget->winId()); } //同時播放聲音 PlayM4_PlaySound(port); //倒放 //PlayM4_ReversePlay(port); //快進播放,多次調用速度更快 //PlayM4_Fast(port); //PlayM4_Fast(port); ok = true; qDebug() << TIMEMS << &34; << url; } else { qDebug() << TIMEMS << &34; << url << PlayM4_GetLastError(port); } return ok;}void HaiKangThread::free(){ if (isRtsp) { //停止播放+登出設備 NET_DVR_StopRealPlay(hand); NET_DVR_Logout(hand); hand = -1; } else { //停止播放+關閉文件+釋放埠 PlayM4_Stop(port); PlayM4_StopSound(); PlayM4_CloseFile(port); PlayM4_FreePort(port); port = -1; }}

相關焦點

  • Qt音視頻開發17-海康sdk解碼
    一、前言在視頻監控行業領域,海康當之無愧是老大,穩坐第一的寶座很多年了,近期需要將視頻監控系統改成採用海康sdk的內核,於是特意去查閱了sdk的使用手冊,sdk相關的文檔和文件可以直接官網下載到,而且是經常更新的,目前提供了windows和linux上的,win上的sdk還是更新比較快而且完整的,但是在linux上的就不得不吐槽下了
  • Qt音視頻開發18-海康sdk回調
    一、前言海康sdk顯示實時視頻流除了支持句柄方式以外,也支持回調的方式拿到每一張圖片自己繪製處理,當然回調除了拿到視頻數據,其實音頻數據也一塊拿到了,自行調用音頻設備播放就行,關於海康sdk回調這塊,還著實折騰了一陣子才搞定,可能最開始沒有參照提供的demo以及沒有徹底的搜索吧,只是單單看sdk的文檔折騰來折騰去的,搞了一星期居然沒搞定
  • Qt音視頻開發19-海康sdk錄像存儲
    一、前言關於調用海康sdk來進行錄像存儲,整體的框架架構處理流程沿襲了之前vlc內核、ffmpeg內核、mpv內核的做法,定時存儲這塊,開個定時器判斷,到了時間則先關閉原來的錄像存儲,然後在開始一個新的錄像存儲,重新傳入新的文件名
  • Qt音視頻開發26-ffmpeg播放器
    一、前言用ffmpeg來實現自己的播放器,這是一直以來的一個目標,之前的難點卡在音視頻同步以及如何播放聲音這兩點(儘管之前已經進行過不少的嘗試和探索,但是問題還是挺多,比如音視頻同步不完美,有些文件正常而有些文件不準,聲音播放採用的
  • Qt音視頻開發23-通用視頻控制項
    一、前言在之前做的視頻監控系統中,根據不同的用戶需要,做了好多種視頻監控內核,有ffmpeg內核的,有vlc內核的,有mpv內核的,還有海康sdk內核的,為了做成通用的功能,不同內核很方便的切換,比如pro直接改一個DEFINE的變量名,所以需要將各種內核的使用方法做成一樣的接口,這樣看起來就很整齊,所以後面特意提煉了一個通用的視頻控制項
  • Qt音視頻開發21-通用硬解碼
    目前主流的播放器都支持硬解碼,沒有硬解碼的播放器都是耍流氓,現在越來越多2K 4K甚至8K的高清視頻,沒有硬解碼只用軟解碼的話,會大量消耗CPU資源,很不可取,需要專門交給GPU繪製和解碼,這樣可以大大減低CPU的壓力,讓CPU可以幹其他的活,之前寫過的視頻監控系統中,就用到過硬解碼和GPU繪製,沒有用到這兩個一切都是空談,根本沒法承受64路通道實時顯示,vlc、
  • Qt音視頻開發1-vlc解碼播放
    一、前言最開始接觸視頻監控這塊的時候,用的就是vlc作為解碼的內核,主要是因為vlc使用簡單方便,直接傳入一個句柄即可,簡單幾行代碼就可以實現一個視頻流播放,很適合初學者使用,也推薦初學者用qt+vlc來做播放器,提供的接口還是非常友好的,而且門類特別多,想要獲取媒體文件的各種信息比如寬高,設置寬高比等,直接調用接口函數傳入參數就能設置
  • Qt音視頻開發24-ffmpeg音視頻同步
    ,要麼根本沒法同步歪七八糟的,要麼進度跳過去直接蹦蹦蹦崩潰的,其實最完美的音視頻同步處理demo就是ffplay,我親測過幾十種各種各樣的音視頻本地文件,數十種視頻流文件,都是非常完美,當然啦這是親生的啦,不完美還玩個屁。
  • Qt音視頻開發6-ffmpeg解碼處理
    一、前言採用ffmpeg解碼,是所有視頻監控開發人員必備的技能,繞不過去的一個玩意,甚至可以說是所有音視頻開發人員的必備技能。FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源電腦程式。
  • Qt音視頻開發10-ffmpeg控制播放
    一、前言很多人在用ffmpeg做視頻流解碼的時候,都會遇到一個問題,如何暫停,如果打開的是本地視頻文件,暫停你只需要停止解碼即可,但是視頻流你會發現根本沒用,一旦你停止了解碼,下次重新解碼的時候,居然還是以前的圖片,他是從你最後暫停開始的地方重新解碼的,這就懵逼了,為啥呢?
  • Qt音視頻開發33-ffmpeg安卓版
    多線程實時播放視頻流+本地視頻+USB攝像頭等。2. 支持windows+linux+mac,支持ffmpeg3和ffmpeg4,支持32位和64位。3. 多線程顯示圖像,不卡主界面。4. 自動重連網絡攝像頭。5. 可設置邊框大小即偏移量和邊框顏色。6. 可設置是否繪製OSD標籤即標籤文本或圖片和標籤位置。7.
  • Qt音視頻開發7-ffmpeg音頻播放
    一、前言之前用ffmpeg解碼出來了音頻,只是做了存儲部分,比如存儲成aac文件,播放的話早期用的是sdl來播放音頻,自從Qt5以後提供了QAudioOutput來播放輸入的音頻數據,就更加方便了,可以直接將解碼好的音頻數據寫入就能播放了
  • Qt音視頻開發12-mpv解碼播放
    mpv是一款基於MPlayer和MPlayer2的多平臺開源播放器,是一個開源的,跨平臺視頻播放器,帶有極簡的 GUI 界面以及豐富的命令行控制。其在Linux上擁有廣泛的輸出設備支持,內置ffmpeg解碼器,支持絕大部分的視頻和音頻格式,支持本地播放和網絡播放,支持ass特效字幕,GPU解碼能力十分出色。
  • Qt音視頻開發25-ffmpeg音量設置
    一、前言音視頻的播放、關閉、暫停、繼續這幾個基本功能,絕大部分人都是信手拈來的搞定,關於音量調節還是稍微饒了下彎彎,最開始打算採用各個系統的api來處理,坐下來發現不大好,系統的支持不完美,比如有些api限定了win7,而xp確沒有,而且這玩意控制的是全局的音量,不好,大部分時候需要控制的是當前播放的媒體的音量,估計vlc
  • Qt音視頻開發13-mpv錄像存儲
    嵌入式linux,記得vlc想要在嵌入式linux上交叉編譯成功的話,難於上青天,各種插件的依賴實在是太多了,直到你放棄為止,在X86的linux系統還是比較方便一些的,而在這塊,mpv簡直是完爆vlc啊,直接命令行都可以在嵌入式linux上安裝呢,內置的ffmpeg超強解碼器,使得你可以直接命令行調用mpv來播放音視頻,這在一些嵌入式linux
  • Qt音視頻開發22-通用GPU顯示
    一、前言採用GPU來繪製實時視頻一直以來都是個難點,如果是安防行業的做視頻監控開發這塊的人員,這個坎必須邁過去,本人一直從事的是安防行業的電子圍欄這個相當小眾的細分市場的開發,視頻監控這塊僅僅是周邊技術玩一玩探討一下,關於GPU繪製這塊著實走了不少的彎路。
  • Qt音視頻開發40-人臉識別離線版
    ## 一、前言上一篇文章寫了在線調用人臉識別api進行處理,其實很多的客戶需求是要求離線使用的,尤其是一些事業單位,嚴禁這些刷臉數據外洩上傳到伺服器,儘管各個廠家號稱嚴格保密這些數據,但要阻止這些擔心,唯一的解決辦法就是設備離線使用,連個屁的網,不聯網看你怎麼上傳,於是離線的人臉識別應用應運而生,比如我們手機上的識別就是本地庫在運算
  • Qt音視頻開發16-mpv通用接口
    一、前言前面幾篇文章,依次講了解碼播放、錄像存儲、讀取和控制、事件訂閱等,其實這些功能的實現都離不開封裝的通用的接口,最開始本人去調用一些設置的時候,發現多參數的不好實現,原來需要用mpv_node處理,而Qt中如何轉成mpv_node需要特殊的處理才行,後來在開源主頁看到了官方提供的demo例子,直接用qt封裝好了多個接口
  • Qt音視頻開發28-Onvif信息獲取
    ## 一、前言嚴格意義上來說,Onvif處理這塊算不上音視頻開發的內容,為何重新整理放在音視頻開發這個類別,主要是為了方便統一管理,而且在視頻監控處理這塊,通過onvif來拿到音視頻流這是必經的階段,也算是搭邊的東西。
  • Qt音視頻開發27-Onvif設備搜索
    ## 一、前言最近業餘時間主要研究音視頻開發這塊,前面的文章寫了好多種視頻監控內核,一旦將這些內核搞定以後,視頻監控的相關功能水到渠成。做視頻監控系統,繞不過onvif這玩意,這玩意主要就是為了統一一個大概的標準,能夠對各個廠家的監控設備進行常用的一些操作,比如搜索、獲取信息、雲臺控制、事件訂閱、抓拍圖片等,如果沒有這個規範,那麼各個廠家都各自為政,需要用私有的sdk去處理,這樣就很麻煩很慘了,幾十個廠家就需要幾十個sdk,對於程式設計師來說簡直是災難,想想就很恐怖的事情,哪個程式設計師不想多活幾年!