一、前言
關於調用海康sdk來進行錄像存儲,整體的框架架構處理流程沿襲了之前vlc內核、ffmpeg內核、mpv內核的做法,定時存儲這塊,開個定時器判斷,到了時間則先關閉原來的錄像存儲,然后在開始一個新的錄像存儲,重新傳入新的文件名,所以這塊的代碼直接拷貝過來就能使用,要做的就是替換兩行代碼即可,一行是開始錄像存儲的函數NET_DVR_SaveRealData,一行是停止錄像存儲的函數NET_DVR_StopSaveRealData,海康sdk的手冊非常詳細,而且命名也比較規范,基本上通過方法函數名字就可以知道大概的意思了,不用去猜測。
和錄像存儲功能同一大類的還有個截圖功能,這個在vlc內核、ffmpeg內核、mpv內核這些內核中都實現了,截圖總結了三種,第一種是句柄模式下的截圖,這個需要調用相關sdk的函數去執行,分辨率大小為原圖;第二種是回調模式下的截圖,這個已經拿到了圖片的數據,直接取窗體對應保存的視頻的圖片即可,分辨率大小為原圖;第三種是窗體的截屏,就是當前視頻窗體來個截屏,分辨率大小為當前窗體的尺寸;
關於打開視頻文件、錄像存儲、截圖保存這三個功能,要特別注意中文路徑,當然如果是只有英文路徑那就無需做任何處理,但是對於國人使用來說,中文路徑肯定是避免不了的,有兩種可能的需要的處理,一個是路徑要轉成utf8格式,還有一種是要用QTextCodec指定gb2312格式重新轉一下路徑才能生效,比如海康sdk內核下,不然很可能路徑失效。
二、功能特點
- 支持播放視頻流和本地MP4文件。
- 支持句柄和回調兩種模式。
- 多線程顯示圖像,不卡主界面。
- 自動重連網絡攝像頭。
- 可設置邊框大小即偏移量和邊框顏色。
- 可設置是否繪制OSD標簽即標簽文本或圖片和標簽位置。
- 可設置兩種OSD位置和風格。
- 可設置是否保存到文件以及文件名。
- 可直接拖曳文件到haikangwidget控件播放。
- 支持h264/h265視頻流。
- 可暫停播放和繼續播放。
- 支持存儲單個視頻文件和定時存儲視頻文件。
- 自定義頂部懸浮條,發送單擊信號通知,可設置是否啟用。
- 可設置畫面拉伸填充或者等比例填充。
- 可設置解碼是速度優先、質量優先、均衡處理。
- 可對視頻進行截圖(原始圖片)和截屏(視頻窗體)。
- 錄像文件存儲為MP4文件。
- 支持焦距控制、雲台控制。
- 可定制功能。
三、效果圖

四、相關站點
- 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
- 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
- 體驗地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心代碼
void HaiKangThread::initSave()
{
if (!saveFile || !isRtsp) {
return;
}
if (saveInterval == 0) {
saveVideo(fileName);
}
}
void HaiKangThread::saveVideo()
{
if (!saveFile || !isRtsp) {
return;
}
//重新設置文件名稱
QString dirName = QString("%1/%2").arg(savePath).arg(QDATE);
newDir(dirName);
fileName = QString("%1/%2_%3.mp4").arg(dirName).arg(fileFlag).arg(STRDATETIME);
saveVideo(fileName);
}
void HaiKangThread::saveVideo(const QString &fileName)
{
if (hand >= 0) {
//轉碼以便支持中文路徑
QTextCodec *codec = QTextCodec::codecForName("gb2312");
QByteArray data = codec->fromUnicode(fileName);
//先停止再設置
NET_DVR_StopSaveRealData(hand);
NET_DVR_SaveRealData(hand, data.data());
}
}
