Poskładałem mały programik - ma otwierać avi, w każdej klatce zrobić jakieś zmiany i każdą klatkę zapisać z powrotem do tego pliku. Problem w tym, że nie widać owych zmian, w klatce są jakieś dane, ale chyba nie są one zapisywane. Filmik działa cały czas tak samo, nieskompresowany, otwiera się bez problemu. Czyżby funkcja AVIStreamWrite nie służyła do zapisu klatki, coś namieszałem z parametrami, czy przyczyna może być jeszcze inna?
void modifyFrame1(int frame, cMovie *film)
{
film->grabAviFrame(frame);
film->saveAviFrame(frame);
printf("frame %i",frame);
}
int main()
{
cMovie *film1= new cMovie;
film1->openAvi("movies/bf.avi");
for(int i=5;i<200;i++)
{
modifyFrame1(i,film1);
}
film1->end();
getch();
return 0;
}
.h
class cMovie
{
private:
AVISTREAMINFO psi;
PGETFRAME pgf;
Decoding
long lastframe;
int mpf;
size_t size;
char *pdata;
public:
PAVISTREAM pavi;
char *pdataGPU;
int width;
int height;
cMovie();
void openAvi(LPCSTR szFile);
void grabAviFrame(int frame);
void saveAviFrame(int frame);
void end();
};
.cpp
cMovie::cMovie()
{
}
void cMovie::openAvi(LPCSTR szFile)
{
AVIFileInit();
if (AVIStreamOpenFromFile(&pavi, szFile, streamtypeVIDEO, 0, OF_WRITE, NULL) !=0)
{
printf("Error - cannot open file or wtf!\n");
}
AVIStreamInfo(pavi, &psi, sizeof(psi));
width=psi.rcFrame.right-psi.rcFrame.left;
height=psi.rcFrame.bottom-psi.rcFrame.top;
lastframe=AVIStreamLength(pavi);
mpf=AVIStreamSampleToTime(pavi,lastframe)/lastframe;
pgf=AVIStreamGetFrameOpen(pavi, NULL);
if (pgf==NULL)
{
printf("Failed To Open The AVI Frame!\n");
}
printf("Movie info:\n\tw: %i\n\th: %i\n\tlast: %i\n",width,height,lastframe);
}
void cMovie::grabAviFrame(int frame)
{
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, frame);
pdata=(char *)lpbi+lpbi->biSize+lpbi->biClrUsed * sizeof(RGBQUAD);
}
void cMovie::saveAviFrame(int frame)
{
for(int i=0;i<100000;i++)
pdata[i]=0;
AVIStreamWrite(pavi, frame, 1, pdata, size, AVIIF_KEYFRAME, NULL, NULL);//brak zapisu?
}
void cMovie::end()
{
AVIStreamRelease(pavi);
}