请教海康威视DS-4004HC视频卡视频录像问题 我只知道可通过回调函数来实现录像RegisterStreamDirectReadCallback但我不知道 回调函数里面 对文件的操作如何处理在使用回调函数前 先创建.264文件,回调函数里面如何写这个.264文件呢?请大侠 指点一下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 海康官方网站上有DS-40xxHC、DS-40xxHC+、DS-40xxMD SDK的文档和示例程序包下载的,楼主可去下载一个看看。RegisterStreamDirectReadCallback函数所设置的回调函数有四个参数:STREAM_DIRECT_READ_CALLBACK(ULONG channelNumber, void* DataBuf, DWORD Length, int FrameType, void* context)要根据FrameType进行相应的处理的,以下是摘录自官方示例的代码:int __cdecl StreamDirectReadCallback(ULONG channelNum,void *DataBuf,DWORD Length,int frameType,void *context){ BOOL breakable; int nframetype =0; CHKVisionDlg *hkdlg = (CHKVisionDlg *)context; if(frameType >0) { if (frameType == PktSysHeader) { memcpy(FileHeader[channelNum],DataBuf,Length); FileHeaderLen = Length; } else if (frameType == PktSubSysHeader) { memcpy(FileHeaderQcif[channelNum],DataBuf,Length); FileHeaderLen = Length; } if (frameType == PktMotionDetection) { int result[4]; if(bOverlayMode) { hkdlg->m_VideoWin.DrawVectEx(channelNum, (char *)DataBuf); } else { hkdlg->m_bMoving[channelNum] = TRUE; memcpy(motionData[channelNum],(char*)DataBuf,Length); } MotionAnalyzer(ChannelHandle[channelNum],(char*)DataBuf,15,result); if((result[0] + result[1] + result[2] + result[3])) { if (channelNum ==0) TRACE("!!!!!!!!!!!!!!!!CH=%d motion detect result is %d %d %d %d\n",channelNum,result[0],\ result[1],result[2],result[3]); // Triggerº¯ÊýµÄ×÷ÓÃÊǰѱ¨¾¯Ç°µÄÊý¾Ý°´setupÀïÃæµÄÉèÖ㬰ÑÏàÓ¦µÄ¾¯Ç°Ö¡Ð´ÈëÎļþ if(!hkdlg->baftermotion[channelNum]) alarmFile[channelNum].Trigger(gFileHandle[channelNum]); //ÿ´ÎÓÐÒƶ¯Õì²âÖ¡ÉÏÀ´£¬×Ô¶¯°Ñualreadywriteframes[channelNum]ÇåΪ0 £¬ÎªÐ´È뾯ºóÖ¡×÷×¼±¸ hkdlg->ualreadywriteframes[channelNum]=0; hkdlg->baftermotion[channelNum]=TRUE; } return 0; } if (frameType == PktIFrames || frameType ==PktSubIFrames) breakable = TRUE; else breakable = FALSE; } gChannelTotalLength[channelNum].QuadPart +=Length; gCurrentFileLen[channelNum] +=Length; if ((gCurrentFileLen[channelNum] > gFileSize*1000*1000) && (breakable) ) { char fileName[256]; CTime m_StartTime1=CTime::GetCurrentTime(); CString csStartTime=m_StartTime1.Format("%Y%m%d%H%M%S"); if (gFileHandle[channelNum]) { _close(gFileHandle[channelNum]); sprintf(fileName, "ch%02d_%s.264", channelNum,csStartTime); gFileHandle[channelNum] = _open(fileName,_O_CREAT|_O_BINARY|_O_WRONLY|_O_TRUNC,_S_IREAD|_S_IWRITE); _write(gFileHandle[channelNum],FileHeader[channelNum],FileHeaderLen); } if (gFileHandleQcif[channelNum]) { _close(gFileHandleQcif[channelNum]); sprintf(fileName, "ch%02d_%s_sub.264", channelNum,csStartTime); gFileHandleQcif[channelNum] = _open(fileName,_O_CREAT|_O_BINARY|_O_WRONLY|_O_TRUNC,_S_IREAD|_S_IWRITE); _write(gFileHandleQcif[channelNum],FileHeaderQcif[channelNum],FileHeaderLen); } gCurrentFileLen[channelNum] -=gFileSize*1000*1000; } if(bAlarmFileSave) { if(frameType == PktSysHeader) _write(gFileHandle[channelNum],DataBuf,Length); else { //ͳ¼ÆÒƶ¯Õì²âÖ¡ÉÏÀ´Ö®ºóµÄÒôÊÓƵÊý¾Ý£¬Í³¼ÆËüÃÇ £¬²¢°ÑËüÃÇдÈëÎļþ£¬Ã¿Ò»´ÎÓРеÄÒƶ¯Õì²âÊý¾ÝÉÏÀ´£¬ //ualreadywriteframes¶¼»áÏÈÇå0£¬È»ºóͳ¼ÆдÈëÎļþµÄÒôÊÓƵÊý¾Ý hkdlg->ualreadywriteframes[channelNum] += hkdlg->TypeToFrames((FrameType_t)frameType); if (hkdlg->ualreadywriteframes[channelNum] <6*(25+25)) //¼ÖÆÒƶ¯Õì²âÖ¡ÉÏÀ´Ö®ºó 6ÃëÖÓµÄÒôÊÓƵÊý¾Ý£¬Ò²¾ÍÊǾ¯ºóÊý¾Ý _write(gFileHandle[channelNum],DataBuf,Length); else { // Èç¹ûÒƶ¯Õì²âÉÏÀ´Ö®ºó£¬Ð´ÈëÎļþµÄÒôÊÓƵÊý¾ÝÒѾ×ã¹»£¬ÄÇô°Ñ½ÓÏÂÀ´ÉÏÀ´µÄÒôÊÓƵÊý¾Ýѹ»º³å£¬ // ѹÈ뻺³åµÄÊý¾ÝÓÐÁ½ÖÖ´¦Àí·½Ê½£º£±¡¡Èç¹û»º³åÂúÁË£¬×Ô¶¯±»É¾³ý£»£²¡¡×÷ΪÏ´α¨¾¯ÉÏÀ´µÄ¾¯Ç°Ö¡Ð´ÈëÎļþ£»¡¡ alarmFile[channelNum].FramePush(gFileHandle[channelNum],(unsigned char *)DataBuf,Length,(FrameType_t)frameType,breakable); hkdlg->baftermotion[channelNum] = FALSE; } } } else { if(frameType ==PktAudioFrames) { _write(gFileHandle[channelNum],DataBuf,Length); _write(gFileHandleQcif[channelNum],DataBuf,Length); }else if (frameType ==PktSubIFrames || frameType ==PktSubPFrames || frameType == PktSubBBPFrames || frameType == PktSubSysHeader) { _write(gFileHandleQcif[channelNum],DataBuf,Length); }else { _write(gFileHandle[channelNum],DataBuf,Length); } } return 0;} 看不懂 C++啊 老兄, 其实我只要 1个通道的视频录像就可以了StartVideoCapture(ChannelHandle[0]);兄弟 能不能 用DELPHI 翻译下 具体的视频录像操作啊 实际上把DataBuf传过来的数据流直接保存起来就可以了。但是注意一下,海康视频文件有个文件头,每个文件前面的40个字节用来描述这个视频文件的格式,所以一定不能漏下,剩下的直接写就是了。当frameType == PktSubSysHeader时,DataBuf里的数据就是文件头。 点击任务栏使窗体最小化触发了什么消息 excel_tlb.pas,office_tlb.pas,vbide_tlb.pas从什么地方可以免费下载啊? RichText中实现类似MSN固定字符替换成图标的问题!!1 困惑我N久的ValueListEditor问题 如何打印webbrowser中的内容 如何在英文版的delphi6中添加新的类型库?? TnmHttp控件,怎么有问题 撤销已经绘制的图形 怎样使用api生成windows标准打开文件夹(目录浏览窗口)窗口 BDE问题 tcxDBTreeList 一格显示多行文本? fpspread为只写特性
STREAM_DIRECT_READ_CALLBACK(ULONG channelNumber, void* DataBuf, DWORD Length, int FrameType, void* context)要根据FrameType进行相应的处理的,以下是摘录自官方示例的代码:
int __cdecl StreamDirectReadCallback(ULONG channelNum,void *DataBuf,DWORD Length,int frameType,void *context)
{ BOOL breakable; int nframetype =0;
CHKVisionDlg *hkdlg = (CHKVisionDlg *)context; if(frameType >0)
{
if (frameType == PktSysHeader)
{
memcpy(FileHeader[channelNum],DataBuf,Length);
FileHeaderLen = Length;
}
else if (frameType == PktSubSysHeader)
{
memcpy(FileHeaderQcif[channelNum],DataBuf,Length);
FileHeaderLen = Length;
}
if (frameType == PktMotionDetection)
{
int result[4]; if(bOverlayMode)
{
hkdlg->m_VideoWin.DrawVectEx(channelNum, (char *)DataBuf);
}
else
{
hkdlg->m_bMoving[channelNum] = TRUE;
memcpy(motionData[channelNum],(char*)DataBuf,Length);
}
MotionAnalyzer(ChannelHandle[channelNum],(char*)DataBuf,15,result);
if((result[0] + result[1] + result[2] + result[3]))
{
if (channelNum ==0)
TRACE("!!!!!!!!!!!!!!!!CH=%d motion detect result is %d %d %d %d\n",channelNum,result[0],\
result[1],result[2],result[3]);
// Triggerº¯ÊýµÄ×÷ÓÃÊǰѱ¨¾¯Ç°µÄÊý¾Ý°´setupÀïÃæµÄÉèÖ㬰ÑÏàÓ¦µÄ¾¯Ç°Ö¡Ð´ÈëÎļþ
if(!hkdlg->baftermotion[channelNum])
alarmFile[channelNum].Trigger(gFileHandle[channelNum]);
//ÿ´ÎÓÐÒƶ¯Õì²âÖ¡ÉÏÀ´£¬×Ô¶¯°Ñualreadywriteframes[channelNum]ÇåΪ0 £¬ÎªÐ´È뾯ºóÖ¡×÷×¼±¸
hkdlg->ualreadywriteframes[channelNum]=0;
hkdlg->baftermotion[channelNum]=TRUE;
}
return 0;
}
if (frameType == PktIFrames || frameType ==PktSubIFrames)
breakable = TRUE;
else
breakable = FALSE; }
gChannelTotalLength[channelNum].QuadPart +=Length;
gCurrentFileLen[channelNum] +=Length;
if ((gCurrentFileLen[channelNum] > gFileSize*1000*1000) && (breakable) )
{
char fileName[256];
CTime m_StartTime1=CTime::GetCurrentTime();
CString csStartTime=m_StartTime1.Format("%Y%m%d%H%M%S");
if (gFileHandle[channelNum])
{
_close(gFileHandle[channelNum]);
sprintf(fileName, "ch%02d_%s.264", channelNum,csStartTime);
gFileHandle[channelNum] = _open(fileName,_O_CREAT|_O_BINARY|_O_WRONLY|_O_TRUNC,_S_IREAD|_S_IWRITE);
_write(gFileHandle[channelNum],FileHeader[channelNum],FileHeaderLen);
}
if (gFileHandleQcif[channelNum])
{
_close(gFileHandleQcif[channelNum]);
sprintf(fileName, "ch%02d_%s_sub.264", channelNum,csStartTime);
gFileHandleQcif[channelNum] = _open(fileName,_O_CREAT|_O_BINARY|_O_WRONLY|_O_TRUNC,_S_IREAD|_S_IWRITE);
_write(gFileHandleQcif[channelNum],FileHeaderQcif[channelNum],FileHeaderLen);
}
gCurrentFileLen[channelNum] -=gFileSize*1000*1000;
}
if(bAlarmFileSave)
{
if(frameType == PktSysHeader)
_write(gFileHandle[channelNum],DataBuf,Length);
else
{
//ͳ¼ÆÒƶ¯Õì²âÖ¡ÉÏÀ´Ö®ºóµÄÒôÊÓƵÊý¾Ý£¬Í³¼ÆËüÃÇ £¬²¢°ÑËüÃÇдÈëÎļþ£¬Ã¿Ò»´ÎÓРеÄÒƶ¯Õì²âÊý¾ÝÉÏÀ´£¬
//ualreadywriteframes¶¼»áÏÈÇå0£¬È»ºóͳ¼ÆдÈëÎļþµÄÒôÊÓƵÊý¾Ý
hkdlg->ualreadywriteframes[channelNum] += hkdlg->TypeToFrames((FrameType_t)frameType);
if (hkdlg->ualreadywriteframes[channelNum] <6*(25+25)) //¼ÖÆÒƶ¯Õì²âÖ¡ÉÏÀ´Ö®ºó 6ÃëÖÓµÄÒôÊÓƵÊý¾Ý£¬Ò²¾ÍÊǾ¯ºóÊý¾Ý
_write(gFileHandle[channelNum],DataBuf,Length);
else
{
// Èç¹ûÒƶ¯Õì²âÉÏÀ´Ö®ºó£¬Ð´ÈëÎļþµÄÒôÊÓƵÊý¾ÝÒѾ×ã¹»£¬ÄÇô°Ñ½ÓÏÂÀ´ÉÏÀ´µÄÒôÊÓƵÊý¾Ýѹ»º³å£¬
// ѹÈ뻺³åµÄÊý¾ÝÓÐÁ½ÖÖ´¦Àí·½Ê½£º£±¡¡Èç¹û»º³åÂúÁË£¬×Ô¶¯±»É¾³ý£»£²¡¡×÷ΪÏ´α¨¾¯ÉÏÀ´µÄ¾¯Ç°Ö¡Ð´ÈëÎļþ£»¡¡
alarmFile[channelNum].FramePush(gFileHandle[channelNum],(unsigned char *)DataBuf,Length,(FrameType_t)frameType,breakable);
hkdlg->baftermotion[channelNum] = FALSE;
}
}
}
else
{
if(frameType ==PktAudioFrames)
{
_write(gFileHandle[channelNum],DataBuf,Length);
_write(gFileHandleQcif[channelNum],DataBuf,Length);
}else if (frameType ==PktSubIFrames || frameType ==PktSubPFrames || frameType == PktSubBBPFrames || frameType == PktSubSysHeader)
{
_write(gFileHandleQcif[channelNum],DataBuf,Length);
}else
{
_write(gFileHandle[channelNum],DataBuf,Length);
}
}
return 0;
}