bon voilà le code que j'utilise ( qui vient de codeproject) et qui fonctionne
AVIFileInit();
LONG m_curframe = MCIWndGetPosition(m_Video);//ici on récupère l'image courante de la vidéo
//declaration
PAVISTREAM m_avistream = NULL;
AVISTREAMINFO m_streaminfo;
HIC m_decomp = NULL;
long m_fmtlen, //
m_buflen;
//
long m_startframe,
m_endframe;
LPBITMAPINFOHEADER m_srcfmt = NULL;
BYTE* m_rawdata = NULL;
BYTE* m_finaldata = NULL;
PGETFRAME gapgf = NULL;
//Ouverture du fichier
long r;
if (m_avistream)
AVIStreamRelease( m_avistream ), m_avistream=NULL;
r=AVIStreamOpenFromFile( &m_avistream, m_Path,
streamtypeVIDEO, 0, OF_READ | OF_SHARE_EXCLUSIVE, 0 );
TRACE("AVIStreamOpenFromFile: %s\n", r==0 ? "OK" : "failed" );
//»ñµÃ»º³åÇøµÄ³¤¶È
r=AVIStreamFormatSize( m_avistream, 0, &m_fmtlen );
TRACE("AVIStreamFormatSize: %s\n", r==0 ? "OK" : "failed" );
int formatsize=m_fmtlen+sizeof(RGBQUAD)*256;
if (m_srcfmt)
delete [] m_srcfmt;
m_srcfmt = (LPBITMAPINFOHEADER)
new BYTE[formatsize];
ZeroMemory( m_srcfmt, formatsize );
if (m_dstfmt)
delete [] m_dstfmt;
m_dstfmt = (LPBITMAPINFOHEADER)
new BYTE[formatsize];
ZeroMemory( m_dstfmt, formatsize );
r=AVIStreamReadFormat( m_avistream, 0,
m_srcfmt,
&m_fmtlen );
TRACE("AVIStreamReadFormat: %s\n", r==0 ? "OK" : "failed" );
TRACE(" --- %s ---\n", m_Path);
TRACE(" biSize: %d\n", m_srcfmt->biSize );
TRACE(" biWidth x biHeight: %dx%d\n", m_srcfmt->biWidth, m_srcfmt->biHeight );
if (m_srcfmt->biPlanes != 1)
TRACE(" - biPlanes: %d\n", m_srcfmt->biPlanes );
TRACE(" biBitCount: %d\n", m_srcfmt->biBitCount );
CString comp;
switch (m_srcfmt->biCompression)
{
case BI_RGB:
comp="BI_RGB";
break;
case BI_RLE8:
comp="BI_RLE8";
break;
case BI_RLE4:
comp="BI_RLE4";
break;
case BI_BITFIELDS:
comp="BI_BITFIELDS";
break;
}
TRACE(" biCompression: %s\n", comp );
TRACE(" biSizeImage: %d\n", m_srcfmt->biSizeImage );
TRACE(" ------------------\n");
memcpy( m_dstfmt, m_srcfmt, m_fmtlen );
m_startframe = AVIStreamStart( m_avistream );
TRACE("stream start: %d\n", m_startframe);
m_endframe = AVIStreamEnd( m_avistream );
TRACE("stream end: %d\n", m_endframe );
r=AVIStreamInfo( m_avistream, &m_streaminfo,
sizeof(m_streaminfo) );
TRACE("AVIStreamInfo: %s\n", r==0 ? "OK" : "failed" );
m_buflen = m_dstfmt->biSizeImage;
int finalbuflen=((m_dstfmt->biWidth+3) & ~3) * m_dstfmt->biHeight;
if (m_streaminfo.dwSuggestedBufferSize)
if ((LONG)m_streaminfo.dwSuggestedBufferSize < m_buflen)
{
TRACE("adjusting m_buflen to suggested size\n");
m_buflen = (LONG)m_streaminfo.dwSuggestedBufferSize;
}
if (m_decomp)
ICClose( m_decomp );
m_decomp = ICDecompressOpen( ICTYPE_VIDEO, m_streaminfo.fccHandler, m_srcfmt, m_dstfmt );
TRACE("ICDecompressOpen: %s\n", m_decomp ? "OK" : "failed");
if (m_rawdata)
{
TRACE("delete [] m_rawdata...\n");
delete [] m_rawdata;
}
m_rawdata =
new BYTE[m_buflen];
if (m_finaldata)
{
TRACE("delete [] m_finaldata...\n");
delete [] m_finaldata;
}
m_finaldata =
new BYTE[finalbuflen];
gapgf = AVIStreamGetFrameOpen(m_avistream, NULL);
//getframe
LPSTR lpbi = NULL;
if(m_endframe == m_curframe)
m_curframe--;
lpbi = (LPSTR)AVIStreamGetFrame(gapgf, m_curframe);
HBITMAP hbitmap = CreateBitmap((BYTE*)AVI_FindDIBBits(lpbi),(LPBITMAPINFOHEADER)lpbi);
CxImage ima;
ima.CreateFromHBITMAP(hbitmap);
CString filename;
filename.Format("%s_%d.bmp",m_genericfile,m_curframe);//ici le nom du fichier et cur_frame le numéro de l'image
ima.Save(filename, CXIMAGE_FORMAT_BMP);
//création
if (m_avistream)
AVIStreamRelease( m_avistream ), m_avistream = NULL;
if (m_decomp)
ICClose( m_decomp ), m_decomp=NULL;
if (m_srcfmt)
delete [] m_srcfmt, m_srcfmt=NULL;
if (m_dstfmt)
delete [] m_dstfmt, m_dstfmt=NULL;
if (m_rawdata)
{
TRACE("delete [] m_rawdata...\n");
delete [] m_rawdata, m_rawdata=NULL;
}
if (m_finaldata)
{
TRACE("delete [] m_finaldata..\n");
delete [] m_finaldata, m_finaldata=NULL;;
}
if (gapgf)
{
AVIStreamGetFrameClose(gapgf);
gapgf = NULL;
}
AVIFileExit();
celà doit être ta fonction
louis14