#pragma comment(lib, "Vfw32.lib") #include #include #include #include int main(int args,char** arg) { //Variablen char* datei; int fehler=0,vidfps,sltime=1000; int screenw,screenh,screenx,screeny; HDC sourcedc,destdc; HBITMAP hbmp; clock_t timer; AVIFileInit(); //Parameter /*if (args<=6) return -1; datei=arg[1]; screenx=(int)arg[2]; screeny=(int)arg[3]; screenw=(int)arg[4]; screenh=(int)arg[5]; vidfps=(int)arg[6];*/ datei="D:\\Downloads\\avi.avi"; screenx=0; screeny=0; screenw=1024; screenh=768; vidfps=25; //Vorbereiten sltime/=vidfps; sourcedc=GetDC(0); destdc=CreateCompatibleDC(sourcedc); hbmp=CreateCompatibleBitmap(sourcedc,screenw,screenh); SelectObject(destdc,hbmp); PAVIFILE pfile; AVIFileOpen(&pfile,datei,OF_CREATE | OF_WRITE,0); AVISTREAMINFO asi={streamtypeVIDEO,mmioFOURCC('M','P','G','4'),0,0,0,0,1,vidfps,0,0,0,0,-1,0,{screenx,screeny,screenx+screenw,screeny+screenh},0,0,"Video #1"}; int stride=(((screenw*24+31)&~31)/8); int sizeimage=stride*screenh; BITMAPINFOHEADER bi={sizeof(BITMAPINFOHEADER),screenw,screenh,1,24,BI_RGB,sizeimage ,0,0,0,0}; PAVISTREAM pstreamUC; AVIFileCreateStream(pfile,&pstreamUC,&asi); PAVISTREAM pstream; LPBITMAPINFOHEADER lpbi=&bi; HIC hic; ICINFO icinfo; int fccType = ICTYPE_VIDEO; for (int i=0; ICInfo(fccType, i ,&icinfo); i++) { hic=ICOpen(icinfo.fccType, icinfo.fccHandler, ICMODE_QUERY); if (hic) { ICGetInfo(hic, &icinfo, sizeof(icinfo)); if (fccType==ICTYPE_VIDEO && lpbi!=NULL && ICCompressQuery(hic,lpbi,NULL)!=ICERR_OK) { ICClose(hic); continue; } else { if (MessageBox(NULL,"Benutzen?","",MB_YESNO)==IDYES) break; ICClose(hic); continue; } //check if it is the driver you want //if not ICClose(hic); } } if (ICQueryConfigure(hic)) ICConfigure(hic,NULL); //icinfo.fccHandler=mmioFOURCC('M', 'P', 'G', '4'); AVICOMPRESSOPTIONS Coptions={asi.fccType,asi.fccHandler,0,asi.dwQuality,0,0,(LPVOID)&bi,bi.biSize,&icinfo,icinfo.dwSize/*sizeof(icinfo)*/,0}; HRESULT r=AVIMakeCompressedStream(&pstream,pstreamUC,&Coptions,NULL); switch (r) { case AVIERR_OK: MessageBox(NULL,"AVIERR_OK","",MB_OK); break; case AVIERR_NOCOMPRESSOR: MessageBox(NULL,"AVIERR_NOCOMPRESSOR","",MB_OK); exit(0); break; case AVIERR_MEMORY: MessageBox(NULL,"AVIERR_MEMORY","",MB_OK); break; case AVIERR_UNSUPPORTED: MessageBox(NULL,"AVIERR_UNSUPPORTED","",MB_OK); break; default: MessageBox(NULL,"Other","",MB_OK); break; } AVIStreamSetFormat(pstream,0,(LPVOID)&bi,bi.biSize); long frames=0; //Schleife bool loop=true; int check,wtime; char buffer[2]; BYTE *bits=new BYTE[sizeimage]; timer=clock(); while (loop) { //Bild gleich wie vorher? //check=BitBlt(destdc,screenx,screeny,screenw,screenh,sourcedc,0,0,SRCINVERT); //if (check==0) fehler=GetLastError(); // //Bild kopieren check=BitBlt(destdc,screenx,screeny,screenw,screenh,sourcedc,0,0,SRCCOPY|CAPTUREBLT); if (check==0) fehler=GetLastError(); //In Video speichern GetDIBits(destdc,hbmp,0,abs(bi.biHeight),bits,(LPBITMAPINFO)&bi,0); AVIStreamWrite(pstream,frames,1,bits,sizeimage,0x00000010,NULL,NULL); frames+=1; //Warten zum FPS regulieren wtime=sltime-(timer-clock()); Sleep(wtime); timer=clock(); //Prüfen ob ein Ende im StdIn steht fgets(buffer,1,stdin); if (buffer[0]=='E') loop=false; } //Bereinigen und beenden delete bits; ICClose(hic); AVIStreamRelease(pstream); AVIStreamRelease(pstreamUC); AVIFileRelease(pfile); AVIFileExit(); ReleaseDC(0,sourcedc); DeleteDC(destdc); DeleteObject(hbmp); return fehler; }