最近使用海康硬盘录像机录像截图,看了其官方使用文档及提供的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;
}