欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

海康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;
}