⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 videoclass.cpp

📁 电子监控的网络编程实例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			if(bSaveSuccess)
				return FileName;
		}
	}
	else
	{
	//	ShowMessage("JPG图像压缩因子必须0-100中间",MB_OK);
	}
//	::SaveJPG("")
	return "";
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CVideoClass::CVideoClass()
{
	m_pCapOptions=(CaptOptionsStruc*)(new BYTE[sizeof(CaptOptionsStruc)]);
	memset(m_pCapOptions,0,sizeof(CaptOptionsStruc));
	m_IsCapture=FALSE;	
	m_nFrame=0;
}

CVideoClass::~CVideoClass()
{
	VC_FreeCard();
	GlobalFree(m_hDib);
}

//初始化
int CVideoClass::InitVC(HDC hDC, HWND hWnd, CString Path,BOOL FastMode)
{	
	int iResult;
	DataPath=Path;//avi保存路径
	m_hDC=hDC;
	m_hWnd=hWnd;	
	iResult=VC_InitCard(20,2);	
	return(iResult);

}

void CVideoClass::WriteLog(CString info)
{
	CStdioFile* pTxtFile = new CStdioFile();
	if(!pTxtFile->Open(".\\Log.Txt",CFile::modeReadWrite | CFile::typeText))
	{
		//	MessageBox("Log.Txt文件不存在\n系统将新建该文件!",NULL,MB_OK|MB_ICONEXCLAMATION);
		pTxtFile->Open(".\\Log.Txt",CFile::modeWrite | CFile::modeCreate);
	}
	pTxtFile->SeekToEnd();
	COleDateTime time=COleDateTime::GetCurrentTime();
	CString str;
	str.Format("%4d-%2d-%2d %2d:%2d:%2d",time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());
	pTxtFile->WriteString(str+"------"+info+"\n");
	
	pTxtFile->Close();
	delete pTxtFile;

}

int * CVideoClass::Capture(PBYTE pImage, int iChanel, bool bFull, int CaptureDelay, char *text)
{
	int *iResult;
	try{
		iResult=VC_CaptureImage(pImage,iChanel,bFull,CaptureDelay,text);
		if (!iResult) {
			VC_FreeCard();
			VC_InitCard(20,2);
		}
	}catch(...){
		return NULL;
	}
		
	
	/*
	if (iResult ) {		
		m_hOldDib=CopyDib(m_hDib);
		GlobalFree(m_hDib);
		m_hDib= (HDIB)GlobalAlloc(GMEM_FIXED,768*576*3+54);
		PBYTE pl= (PBYTE)GlobalLock(m_hDib);
		memcpy(pl,pImage,768*576*3+54);
		GlobalUnlock(m_hDib);	
	}
	*/
	
	return iResult;

}

int CVideoClass::DrawImage(PBYTE hImg, HDC hDC, int iLeft, int iTop, int iWidth, int iHeight)
{	
	return VC_DrawImage(hImg,hDC, iLeft,iTop,iWidth,iHeight);
}



long CVideoClass::WriteDIB2AVIFile()
{
	long tick = GetTickCount();
	HRESULT	hr;
	long size,frames,bytes;
	bytes = 0;
	size = 0;
	frames = 0;
	BITMAPINFOHEADER *pbmih;
	PBYTE p=(PBYTE)GlobalLock(m_hDib);    
	pbmih = (BITMAPINFOHEADER *)(p+14);
	GlobalUnlock(m_hDib);
	bytes = pbmih->biSizeImage;
	
	try
	{
		
		if(m_nFrame/m_pCapOptions->aviCompressOpts.dwKeyFrameEvery*m_pCapOptions->aviCompressOpts.dwKeyFrameEvery ==  m_nFrame)
		{
			hr = AVIStreamWrite(m_pWorkingStream,m_nFrame,1,reinterpret_cast<BYTE*>(pbmih) + pbmih->biSize + pbmih->biClrUsed*sizeof(RGBQUAD),bytes,AVIIF_KEYFRAME,&frames,&size);//NULL,NULL);
		}
		else
		{
			hr = AVIStreamWrite(m_pWorkingStream,m_nFrame,1,reinterpret_cast<BYTE*>(pbmih) + pbmih->biSize + pbmih->biClrUsed*sizeof(RGBQUAD),bytes,0,&frames,&size);//NULL,NULL);
		}
	}
	catch(...)
	{
		return -1;
	}
	
	m_nFrame++;	

	if(hr != AVIERR_OK)
	{
		WriteLog("写AVI流对象出错");
		return -1;
	}
	else
	{
		m_SizeAVI+=size;
		if(m_pCapOptions->limit != 0 && (m_pCapOptions->mb*1024*1024-m_SizeAVI) < 3*size)
		{
			m_IsCapture = false;			
			StopAVI();
			WriteLog("文件达到指定大小");	
			SendMessage(m_hWnd,WM_STOP_AVI,0,0);
			return 1;
		}

		TRACE("written %d bytes of %d\n",size,bytes);
	}
	tick = GetTickCount()-tick;
	TRACE("WriteDIB2AVIFile = %dms\n",tick);
	return 1;

}

long CVideoClass::OpenAVIFile(CaptOptionsStruc *pCapOptions)
{
	m_pCapOptions = pCapOptions;
/* Check,  that file is already exist, and delete it before overwrite!!! */	
	HRESULT result;
    BITMAPINFOHEADER *pbmih;
	PBYTE lock_pbmih;
	lock_pbmih=(PBYTE)GlobalLock(m_hDib);
	pbmih = (BITMAPINFOHEADER *)(lock_pbmih + 14);
	if (!pbmih) {
		return -1;
	}else{
	
		GlobalUnlock(m_hDib);
		int width = pbmih->biWidth;
		int height = pbmih->biHeight;
			
		result = AVIFileOpen(&m_pAVIFile, pCapOptions->fileName,OF_CREATE|OF_WRITE,NULL);
		if(result != AVIERR_OK)
		{
			//char strMes[MAX_PATH],strCap[MAX_PATH];
			CString strErr;
			strErr.Format("创建%s失败",pCapOptions->fileName);
			WriteLog(strErr);
	//		delete pbmih;
			return -1;
		}
		
		AVISTREAMINFO streaminfo;
		memset(&streaminfo,0,sizeof(AVISTREAMINFO));
		streaminfo.fccType = streamtypeVIDEO;
		streaminfo.dwScale = 1;
		streaminfo.dwRate = pCapOptions->fps;//FPS!!!
		SetRect(&streaminfo.rcFrame,0,0,width,height);//Width and Height of Frame;
		result = AVIFileCreateStream(m_pAVIFile, &m_pAVIStream, &streaminfo);
		if(result != AVIERR_OK)
		{
			
			AVIFileRelease(m_pAVIFile);
			m_pAVIFile = NULL;
	//		delete pbmih;
			WriteLog("创建AVI流失败");
			return -1;
		}


		HIC	hic;
		m_pCompressedAVIStream=NULL;
		hic = ICOpen(mmioFOURCC('V','I','D','C'),pCapOptions->aviCompressOpts.fccHandler,ICMODE_QUERY);
		if(hic)
		{
			result = AVIMakeCompressedStream(&m_pCompressedAVIStream,m_pAVIStream,&pCapOptions->aviCompressOpts,NULL);
			if(result != AVIERR_OK)
			{
				WriteLog("AVI压缩出错");
				WriteLog("AVI压缩出错");
				m_pCompressedAVIStream = NULL;
				AVIStreamRelease(m_pAVIStream);
				m_pAVIStream = NULL;
				AVIFileRelease(m_pAVIFile);
				m_pAVIFile = NULL;
				::DeleteFile(pCapOptions->fileName);
	//			delete pbmih;
				return -1;
			}
			DWORD ii=pbmih->biSize+pbmih->biClrUsed*sizeof(RGBQUAD);
			result = AVIStreamSetFormat(m_pCompressedAVIStream,0,pbmih,ii);
			if(result != AVIERR_OK)
			{
				WriteLog("AVI压缩出错");
				AVIStreamRelease(m_pCompressedAVIStream);
				m_pCompressedAVIStream = NULL;
				AVIStreamRelease(m_pAVIStream);
				m_pAVIStream = NULL;
				AVIFileRelease(m_pAVIFile);
				m_pAVIFile = NULL;
				::DeleteFile(pCapOptions->fileName);
	//			delete pbmih;
				return -1;
			}
			m_pWorkingStream = m_pCompressedAVIStream;
		}
		else
		{
			result = AVIStreamSetFormat(m_pAVIStream,0,pbmih,pbmih->biSize+pbmih->biClrUsed*sizeof(RGBQUAD));
			if(result != AVIERR_OK)
			{
				WriteLog("AVI压缩出错");
				WriteLog("AVI压缩出错");
				AVIStreamRelease(m_pAVIStream);
				m_pAVIStream = NULL;
				AVIFileRelease(m_pAVIFile);
				m_pAVIFile = NULL;
				::DeleteFile(pCapOptions->fileName);
	//			delete pbmih;
				return -1;
			}
			m_pWorkingStream = m_pAVIStream;
		}

		m_SizeAVI = 0;
		m_IsCapture = true;
	//	delete pbmih;
		return 1;
	}

}

long CVideoClass::CloseAVIFile(CaptOptionsStruc *pCapOptions)
{
	
	AVICOMPRESSOPTIONS* aopts[1] = {&pCapOptions->aviCompressOpts};
	AVISaveOptionsFree(1,(LPAVICOMPRESSOPTIONS *)&aopts);
	
	if(m_pAVIStream)
	{
		AVIStreamRelease(m_pAVIStream);
		m_pAVIStream = NULL;
	}
	if(m_pCompressedAVIStream)
	{
		AVIStreamRelease(m_pCompressedAVIStream);
		m_pCompressedAVIStream = NULL;
	}
	m_pWorkingStream = NULL;
	if(m_pAVIFile)
	{
		AVIFileRelease(m_pAVIFile);
		m_pAVIFile = NULL;
		if(m_nFrame == 0)
		{
			
			if(pCapOptions->fileName && strlen(pCapOptions->fileName) != 0)
			{
				::DeleteFile(pCapOptions->fileName);
			}
		}
		m_nFrame = 0;
	}	
	m_IsCapture = false;
	m_nFrame = 0;
	return 1;

}

CString CVideoClass::StartAVI(DWORD dwSize,DWORD nChanel)
{
	COleDateTime tm=COleDateTime::GetCurrentTime();
	CString str,str1;
	if (!m_IsCapture) {
		VC_FreeCard();
		VC_InitCard(10,2,8,".\\Log.txt",384,288);
		
		
		m_nChanel=nChanel;
		DWORD a=GetTickCount();
		str1.Format("%d%d%d%d%d%dB%ld.avi",tm.GetYear(),tm.GetMonth(),tm.GetDay(),tm.GetHour(),tm.GetMinute(),tm.GetSecond(),a);
		str=DataPath+"\\"+str1;
		
		strcpy(m_pCapOptions->fileName,str.GetBuffer(0));
		m_pCapOptions->fps=5;
		m_pCapOptions->aviCompressOpts.fccType=streamtypeVIDEO;
		m_pCapOptions->aviCompressOpts.fccHandler=1668707181;//mmioFOURCC('V','I','D','C');
		m_pCapOptions->aviCompressOpts.dwKeyFrameEvery=5;
		m_pCapOptions->aviCompressOpts.dwFlags=1;
		m_pCapOptions->aviCompressOpts.dwBytesPerSecond=100;
		m_pCapOptions->aviCompressOpts.dwQuality=7800;
		if (dwSize>0)
		{
			m_pCapOptions->limit=1;
			m_pCapOptions->mb=dwSize;
		}

		int * iResult;
		PBYTE p=new BYTE[384*288*3+54];
		iResult=VC_CaptureImage(p,nChanel,true,10);
		if (iResult ) {
			GlobalFree(m_hDib);
			m_hDib= (HDIB)GlobalAlloc(GMEM_FIXED,384*288*3+54);
			PBYTE pl= (PBYTE)GlobalLock(m_hDib);
			memcpy(pl,p,384*288*3+54);
			GlobalUnlock(m_hDib);	
			delete[] p;
			if(OpenAVIFile(m_pCapOptions))
				return str1;
			else
				return "";
		}
		delete[] p;		
	}
	else
		return "";

}

void CVideoClass::ShowVideo(HDC hDC, int iLeft, int iTop, int iWidth, int iHeight)
{
	if (m_IsCapture) {
		int * iResult;
		PBYTE pImage=new byte[384*288*3+54];
		HDIB	hDib;
		iResult=VC_CaptureImage(pImage,m_nChanel,true,0);
		if (iResult) {
			try{
				hDib= (HDIB)GlobalAlloc(GMEM_FIXED,384*288*3+40);
				PBYTE pl= (PBYTE)GlobalLock(hDib);
				memcpy(pl,pImage+14,384*288*3+40);
				GlobalUnlock(hDib);	
				DrawDIB(hDC,hDib, iLeft,iTop,iWidth,iHeight);
				GlobalFree(hDib);				
				
				GlobalFree(m_hDib);
				m_hDib=(HDIB)GlobalAlloc(GMEM_FIXED,384*288*3+54);
				PBYTE p= (PBYTE)GlobalLock(m_hDib);
				memcpy(p,pImage,384*288*3+54);
				GlobalUnlock(m_hDib);	
				
				//avi
				WriteDIB2AVIFile();
			}catch (...) {
			}
			
		}
		else{
			VC_FreeCard();
			VC_InitCard(10,2,8,".\\Log.txt",384,288);
		}
		delete[] pImage;
	}
	
}

bool CVideoClass::IsRecording()
{
	return m_IsCapture;
}

void CVideoClass::StopAVI()
{
	m_IsCapture=false;
	CloseAVIFile(m_pCapOptions);
	VC_FreeCard();
	VC_InitCard(20,2);
}




























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -