AVIs erstellen und komprimieren
-
Hallo,
ich habe ein weiteres Problem beim aufnehmen von AVIs, nämlich bei der komprimierung. Das Aufnehmen ohne Komprimierung hat geklappt, jetzt wollte ich aber keine 30 GB-Videos aufnehmen, deswegen versuche ich es einzubauen.
Nach AVIMakeCompressedStream ist mein Streampointer 0, sodass die weiteren Funktionen fehlschlagen.
Das Prüfen ob es der richtige Driver ist hab ich weggelassen, weil es eigentlich egal ist. Ich vermute aber, dass das Problem bei dem Kompressor von ICOpen liegt, in zusammenhang mit icinfo.Mein betroffener Code:
#pragma comment(lib, "Vfw32.lib") #include <Windows.h> #include <time.h> #include <stdio.h> #include <vfw.h> 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; } //check if it is the driver you want //if not ICClose(hic); } } if (ICQueryConfigure(hic)) ICConfigure(hic,NULL); AVICOMPRESSOPTIONS Coptions={asi.fccType,asi.fccHandler,0,asi.dwQuality,0,0,(LPVOID)&bi,bi.biSize,&icinfo,4,0}; AVIMakeCompressedStream(&pstream,pstreamUC,&Coptions,NULL); AVIStreamSetFormat(pstream,0,(LPVOID)&bi,bi.biSize);ich bedanke mich für jede Hilfe