海康SDK截图
程序员文章站
2022-05-27 22:41:18
...
最近使用海康硬盘录像机录像截图,看了其官方使用文档及提供的SDK,不愧是上市公司,使用文档描述很详细,SDK采用C语言描述; SDK没有演示如何通过实时视频流截图,下面是自己通过多次测试后成功截图的代码:
/** *@brief 初始化Playctrl库 */ void InitRealStream() { // 显示组件,在使用过程中发现必须先调用play()方法才能正常截图,而播放必须传入一窗口句柄(myVideo->winId());此时无须显示视频,隐藏界面即可 QWidget *myVideo=new QWidget; // 分配播放端口 PlayM4_GetPort(&pPlayPort); // 获得文件头长度; quint32 nLength= PlayM4_GetFileHeadLength(); char *pFileHead=new char[nLength]; // 设置流模式 PlayM4_SetStreamOpenMode(pPlayPort,STREAME_REALTIME); // 打开流接口 if(!PlayM4_OpenStream(pPlayPort,pFileHead,nLength,1024*100)) { qDebug("错误:PlayM4_OpenStream: %d", PlayM4_GetLastError(pPlayPort)); qApp->quit(); } // 设置显示缓冲区大小 PlayM4_SetDisplayBuf(pPlayPort,15); // 播放 PlayM4_Play(pPlayPort,myVideo->winId()); } /** *@brief 输入实时视频流,调用前需先调用InitRealStream() */ void InputStream() { QByteArray pFrameData; // 接收UDP视频帧,填充缓冲区pFrameData, 省略 .... // 输入实时视频流 PlayM4_InputData(pPlayPort,(unsigned char*)pFrameData.data(),pFrameData.size()); } /** *@brief 调用PlayM4_GetJPEG()截取jpg */ void GetPhoto() { // 图片大小,最好设置为height*width*3/2即可 int nLen=PHOTO_HEIGHT*PHOTO_WIDTH*3/2; char *pByte=new char[nLen]; DWORD pRealSize; // 实际尺寸 if(!PlayM4_GetJPEG(pPlayPort,(unsigned char*)pByte,nLen,&pRealSize)) { qDebug("错误:抓取图片失败[%d]",PlayM4_GetLastError(pPlayPort)); }else { qDebug("信息:截图成功"); // 将图片写入文件 QFile pFile("d:/test.jpg"); pFile.open(QFile::WriteOnly|QFile::Truncate); pFile.write(pByte,nLen); pFile.close(); } // 清理内存 delete []pByte; pByte=NULL; }