110,539
社区成员
发帖
与我相关
我的任务
分享
解决了!!!结贴
//typedef int (*STREAM_DIRECT_READ_CALLBACK)(ULONG channelNumber,void *DataBuf,DWORD Length,int FrameType,void *context);
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
{
// 如果移动侦测上来之后,写入文件的音视频数据已经足够,那么把接下来上来的音视频数据压缓冲,
// 压入缓冲的数据有两种处理方式:1 如果缓冲满了,自动被删除;2 作为下次报警上来的警前帧写入文件;
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;
}