Witam,
Mam problem z funkcją ICOpen. Mam jakieś tam filmy w avi. MediaPlayer bez problemu je otwiera. We właściwościach pliku w MP w polu Koder-dekoder najpierw nie było nic. Więc pewnie przez DirectShow szło. Zainstalowałem kodeki K_Lite'a i teraz pokazuje ffdshow. A ICOpen dalej zwraca mi NULL'a.
Z video, AVI.. to mój pierwszy program.
A, ICInfo też mi nie działa - ujęte w /**/ w kodzie.
Globalne zmienne:
PAVIFILE pfile;
PAVISTREAM avistr;
unsigned int ulDlugosc;
Funkcja otwierająca plik AVI
bool OtworzPlik(char * xplik){
LONG hres;
AVIFileInit(); // opens AVIFile library
hres = AVIFileOpen(&pfile, xplik, OF_READ/*OF_SHARE_DENY_WRITE*/, 0L);
if (hres != 0){
return false;
}
if(AVIFileGetStream(pfile, &avistr, streamtypeVIDEO, 0) != AVIERR_OK){
if(pfile)
AVIFileRelease(pfile);
return false;
}
AVIFILEINFO fileinfo;
if(AVIFileInfo(pfile, &fileinfo, sizeof(AVIFILEINFO))){
return false;
}
ulDlugosc = fileinfo.dwLength;
return true;
}
Funkcja zapisująca klatki AVI do podanej lokalizacji:
bool Klatki_NaDyskSkompresowane(char * xplikout, TProgressBar * xprogr){
BITMAPINFOHEADER * bif;
AnsiString plik;
unsigned long ile = ulDlugosc;
xprogr->Position = 0;
xprogr->Max = ulDlugosc;
int ioffset = 0;
HBITMAP hBmp;
HDC hdc = CreateDC("DISPLAY", 0, 0, 0);
Graphics::TBitmap* nowaBmp = new Graphics::TBitmap();
if(!nowaBmp || !hdc){
ShowMessage("Brak pamieci");
return false;
}
bool res = true;
AVISTREAMINFO info;
if(AVIStreamInfo(avistr, &info, sizeof(AVISTREAMINFO)) == 0){
//char b[40];
LONG size;
/*ICINFO icnf;
if(ICInfo(info.fccType, info.fccHandler, &icnf)){
AnsiString co = (AnsiString)icnf.szName + " " + (AnsiString)icnf.szDescription;
ShowMessage(co);
}*/
if(AVIStreamReadFormat(avistr, 0, 0, &size)==0){
bif =(BITMAPINFOHEADER*)new (nothrow) BYTE[size];
if(AVIStreamReadFormat(avistr, 0, (void*)bif, &size)==0){
long bpl = ScanBytes(bif->biWidth, bif->biBitCount);
long maxSize = bpl * bif->biHeight;
BYTE * buffer = new BYTE[maxSize];
LONG read;
LONG nSample;
HIC hic = ICOpen(mmioFOURCC('V','I','D','C'), info.fccHandler, ICMODE_DECOMPRESS);
if(hic){
BITMAPINFO * binfo;
BYTE * dBuffer = new (nothrow) BYTE[maxSize];
if(!dBuffer){
ShowMessage("Brak pamieci");
return false;
}
for(unsigned long i = 0; i < ulDlugosc; i++){
if(AVIStreamRead(avistr, i, 1, buffer, maxSize, &read, &nSample)==0){
binfo = (BITMAPINFO*)bif;
BITMAPINFOHEADER * dHeader=(BITMAPINFOHEADER*)new (nothrow) BYTE[size];
MoveMemory((BYTE*)dHeader, (BYTE*)bif, size);
dHeader->biCompression=BI_RGB;
//memset(dBuffer, 0, maxSize); // blad - dlaczego??
if(ICDecompress(hic, ICDECOMPRESS_HURRYUP, bif, buffer, dHeader, dBuffer)==ICERR_OK){
hBmp = CreateDIBitmap(hdc, dHeader, CBM_INIT, dBuffer, (BITMAPINFO*)dHeader, DIB_RGB_COLORS);
if(hBmp){
nowaBmp->Handle = hBmp;
plik = xplikout;
if(i < 1000){
plik += "0";
}
if(i < 100){
plik += "0";
}
if(i < 10){
plik += "0";
}
plik += IntToStr(i) + ".bmp";
nowaBmp->SaveToFile(plik);
DeleteObject(hBmp);
hBmp = 0;
xprogr->Position = i + 1;
}else{
res = false;
ShowMessage("6");
break;
}
}else{
res = false;
ShowMessage("decompress");
break;
}
delete [] dBuffer;
delete (BYTE*)dHeader;
}else{
res = false;
ShowMessage("5");
break;
}
}
}else{
res = false;
ShowMessage("4");
}
ICClose(hic);
delete buffer;
}else{
res = false;
ShowMessage("3");
}
delete (BYTE*)bif;
}else{
res = false;
ShowMessage("2");
}
}else{
res = false;
ShowMessage("1");
}
AVIStreamRelease(avistr);
return res;
}
Ma ktoś jakiś pomysł?
Szukałem, googliłem..