海康威视SDK控制台程序consoleDemo获取码流
陳拓 2021/08/28-2020/08/28
1. 概述
在《??低昐DK控制臺程序consoleDemo》
https://zhuanlan.zhihu.com/p/403903892
https://blog.csdn.net/chentuo2000/article/details/119939573
一文中我們已經編譯成功了??低昐DK的控制臺程序consoleDemo。
在《??低昐DK控制臺程序consoleDemo獲取視頻通道參數》
https://zhuanlan.zhihu.com/p/404390272
https://blog.csdn.net/chentuo2000/article/details/119963580
一文中我們獲取到了NVR的視頻通道號。
本文我們用獲取的通道號獲取碼流。
2. 重寫GetStream.cpp
將GetStream.cpp原來的全部代碼刪除,替換成下面的代碼:
#include <unistd.h> #include "HCNetSDK.h" #include "public.h" #include <stdio.h> #include <time.h> #include <string.h> #include <iostream> using namespace std;void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser) {printf("pyd---(private_v30)Get data,the size is %ld,%d.\n", time(NULL), dwBufSize);switch (dwDataType) {case NET_DVR_SYSHEAD: //系統頭printf("NET_DVR_SYSHEAD data,the size is %ld,%d.\n", time(NULL), dwBufSize);break; case NET_DVR_STREAMDATA: //碼流數據if (dwBufSize > 0) {printf("NET_DVR_STREAMDATA data,the size is %ld,%d.\n", time(NULL), dwBufSize);}break; default: //其他數據printf("Other data,the size is %ld,%d.\n", time(NULL), dwBufSize);break; } }int Demo_GetStream_V30(LONG lUserID) {long lRealPlayHandle;NET_DVR_PREVIEWINFO struPlayInfo = {0};struPlayInfo.hPlayWnd = 0; // 僅取流不解碼。這是Linux寫法,Windows寫法是struPlayInfo.hPlayWnd = NULL;struPlayInfo.lChannel = 33; // 通道號struPlayInfo.dwStreamType = 0; // 0- 主碼流,1-子碼流,2-碼流3,3-碼流4,以此類推struPlayInfo.dwLinkMode = 0; // 0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTPstruPlayInfo.bBlocked = 1; // 0- 非阻塞取流,1- 阻塞取流//struPlayInfo.dwDisplayBufNum = 1;lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL); // NET_DVR_RealPlay_V40 實時預覽(支持多碼流)。//lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0); // NET_DVR_RealPlay_V30 實時預覽。if (lRealPlayHandle < 0) {printf("NET_DVR_RealPlay_V40 error, %d\n", NET_DVR_GetLastError());return HPR_ERROR;}cout << "取流成功!" << endl;sleep(5); // 取流時間長度 秒NET_DVR_StopRealPlay(lRealPlayHandle); // 停止取流return HPR_OK; }說明:
- 例子使用33號通道
- Linux系統不支持軟解碼功能(僅Windows版本支持),因此需要將窗口句柄傳NULL,設置回調函數,只取流不解碼。
- 設備網絡SDK開發使用手冊 - 預覽錄像抓圖模塊流程
##方式二##:預覽接口NET_DVR_RealPlay_V40中預覽參數的播放窗口句柄(hPlayWnd)可以設置為空值,直接設置回調函數,或者調用預覽接口之后,通過NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack設置回調函數,回調獲取實時流數據(前兩個接口設置的回調獲取的是PS封裝的碼流,后者獲取的是標準RTP封裝的碼流)之后用戶后續自己處理,比如二進制流方式寫入文件保存成錄像或者調用播放庫解碼顯示等操作。
3. 編譯、運行
編譯運行操作見概述中提到的《海康威視SDK控制臺程序consoleDemo》一文。
在菜單中選擇1,運行結果:
在這里我們獲取到了碼流,后續我們將碼流保存為視頻文件。
總結
以上是生活随笔為你收集整理的海康威视SDK控制台程序consoleDemo获取码流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows下C/C++模拟鼠标点击,
- 下一篇: TP5对接免签FM支付接口