Пытаюсь смастерить свой первый AVI из пяти битмапов RGB24 200x200. При запуске WMPlayer сообщает, что "Требуемый класс отсутствует в ClassFactory". Не совсем понятно размер чего указан в четырех байтах от 0x04 (сразу за RIFF). И еще, правильно ли то, что указываю в AVIStreamHeader fccHandler=0, т.к. сжатия у меня никакого нет? | Код | PDWORD ms=new DWORD[14];//size for(BYTE bb=0;bb<14;bb++) *(ms+bb)=0; PDWORD mo=new DWORD[14];//offset for(bb=0;bb<14;bb++) *(mo+bb)=0; DWORD si=120000;//size image CString s; DWORD d=0; CFile file; file.Open("c:/first.avi",CFile::modeCreate|CFile::modeWrite); file.Write("RIFF",4); *(mo+0)=file.GetPosition(); file.Write(&ms[0],4); file.Write("AVI LIST",8); *(mo+1)=file.GetPosition(); file.Write(&ms[1],4); file.Write("hdrlavih",8); d=56;//s2 file.Write(&d,4); MainAVIHeader mah; mah.dwMicroSecPerFrame=1000000; mah.dwMaxBytesPerSec=120000; mah.dwReserved[0]=0; mah.dwReserved[1]=0; mah.dwReserved[2]=0; mah.dwReserved[3]=0; mah.dwFlags=0x810; mah.dwTotalFrames=5; mah.dwInitialFrames=0; mah.dwStreams=1; mah.dwSuggestedBufferSize=0; mah.dwWidth=200; mah.dwHeight=200; mah.dwPaddingGranularity=0; file.Write(&mah,56); file.Write("LIST",4); *(mo+3)=file.GetPosition(); file.Write(&ms[3],4); file.Write("strlstrh",8); AVIStreamHeader ash; d=56;//s4 file.Write(&d,4); ash.fccType=0x73646976; ash.fccHandler=0; ash.dwFlags=0; ash.wPriority=0; ash.wLanguage=0; ash.dwInitialFrames=0; ash.dwScale=1; ash.dwRate=1; ash.dwStart=0; ash.dwLength=12; ash.dwSuggestedBufferSize=0; ash.dwQuality=0; ash.dwSampleSize=0; ash.rcFrame.left=0; ash.rcFrame.top=0; ash.rcFrame.right=200; ash.rcFrame.bottom=200; file.Write(&ash,56); file.Write("strf",4); d=40;//s5 file.Write(&d,4); LPBITMAPINFO pBMI=(LPBITMAPINFO) new BYTE[40]; pBMI->bmiHeader.biBitCount=24; pBMI->bmiHeader.biClrImportant=0; pBMI->bmiHeader.biClrUsed=256; pBMI->bmiHeader.biCompression=0; pBMI->bmiHeader.biHeight=200; pBMI->bmiHeader.biPlanes=1; pBMI->bmiHeader.biSize=40; pBMI->bmiHeader.biSizeImage=120000; pBMI->bmiHeader.biWidth=200; pBMI->bmiHeader.biXPelsPerMeter=0; pBMI->bmiHeader.biYPelsPerMeter=0; file.Write(pBMI,40); file.Write("strn",4); d=4;//s6 file.Write(&d,4); file.Write("ZEZO",4); file.Write("LIST",4); *(mo+12)=file.GetPosition(); file.Write(&ms[12],4); file.Write("movi",4); DWORD ofs[5]; CFile bf; PBYTE pData=new BYTE[si]; for(bb=0;bb<5;bb++) { s.Format("c:/__1/%i.bmp",bb+1); bf.Open(s,CFile::modeRead); bf.Seek(54,CFile::begin); bf.Read(pData,si); ofs[bb]=file.GetPosition(); file.Write("00db",4); file.Write(&si,4); file.Write(pData,si); bf.Close(); } file.Write("idx1",4); d=20;//s13; file.Write(&d,4); for(bb=0;bb<5;bb++); { file.Write("00db",4); d=16; file.Write(&d,4); file.Write(&ofs[bb],4); file.Write(&si,4); } *(ms+0)=224+8+5*(8+si)+28; file.Seek(*(mo+0),CFile::begin); file.Write(&ms[0],4); *(ms+1)=212; file.Seek(*(mo+1),CFile::begin); file.Write(&ms[1],4); *(ms+3)=128; file.Seek(*(mo+3),CFile::begin); file.Write(&ms[3],4); *(ms+12)=5*(8+si); file.Seek(*(mo+12),CFile::begin); file.Write(&ms[12],4); delete[] pBMI; delete[] pData; file.Close();
|
|