📄 videoclass.cpp
字号:
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 + -