AVIStreamGetFrameOpen总是返回NULL AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL); 这句成功了么?用GetLastError看看错误码! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 PAVIFILE pfile; PAVISTREAM pstream; PGETFRAME pget; LPBITMAPINFOHEADER lpbi; AVIFileInit(); if(AVIFileOpen(&pfile,(LPCTSTR)FileName,OF_READ,NULL)) { AVIFileExit(); return(FALSE); } if(AVIFileGetStream(pfile,&pstream,streamtypeVIDEO,0)) { AVIFileRelease(pfile); AVIFileExit(); return(FALSE); } if((pget=AVIStreamGetFrameOpen(pstream,NULL)) == NULL) { AVIStreamRelease(pstream); AVIFileRelease(pfile); AVIFileExit(); return(FALSE); } lpbi=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pget,0); RegionRect.SetRect(RegionRect.left,RegionRect.top, RegionRect.left+lpbi->biWidth-1, RegionRect.top+lpbi->biHeight-1 ); int i; BITMAPINFO *lpbp; CPalette hPal,*hOldPal; LOGPALETTE *lp; BYTE *p; lpbp=(LPBITMAPINFO)lpbi; if(lpbi->biBitCount <= 8) { lp =(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE) +(int)lpbi->biClrUsed* sizeof(PALETTEENTRY)]; lp->palVersion=0x0300; lp->palNumEntries=(unsigned short)lpbi->biClrUsed; for(i=0;i<lp->palNumEntries;i++) { lp->palPalEntry[i].peRed=lpbp->bmiColors[i].rgbRed; lp->palPalEntry[i].peGreen=lpbp->bmiColors[i].rgbGreen; lp->palPalEntry[i].peBlue=lpbp->bmiColors[i].rgbBlue; lp->palPalEntry[i].peFlags=0; } hPal.CreatePalette(lp); hOldPal=pDC->SelectPalette(&hPal,0); pDC->RealizePalette(); } p=(BYTE *)(lpbi)+(long)lpbi->biSize+(long) (lpbi->biClrUsed*sizeof(RGBQUAD)); SetDIBitsToDevice(pDC->m_hDC, RegionRect.left, RegionRect.top, (unsigned int)lpbi->biWidth, (unsigned int)lpbi->biHeight, 0, 0, 0, (unsigned int)lpbi->biHeight, p, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS); if(lpbi->biBitCount <= 8) { pDC->SelectPalette(hOldPal,FALSE); pDC->RealizePalette(); hPal.DeleteObject(); delete lp; } AVIStreamGetFrameClose(pget); AVIStreamRelease(pstream); AVIFileRelease(pfile); AVIFileExit(); 前面说到pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL 我在下面的if判断语句当中加入GetLastError 然后用MessageBox返回 得到的是“操作成功完成” 这是不是说没有错呀~ 这是因为AVI文件格式的关系,因为它不能解压这个AVI文件,AVI是一个封装格式,里面还有一个什么视频格式,它如果里面使用了某种格式,C++不能对它解压,就会返回NULL表示解压失败。你可以尝试用会声会影自己做一个AVI,就可以成功打开了。 pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL在函数AVIStreamGetFrameOpen中,第二个参数不要用NULL,应该传一个BITMAPINFOHEADER类型变量的引用。 我也遇到了这样的问题。原来在XP的时候还能的,换win7后就读取不了,不知道怎么回事?求解! AVIFileInit() ; long lStreamSize; PAVIFILE m_aviFile = NULL; PAVISTREAM m_aviStream = NULL; AVISTREAMINFO m_aviInfo; BITMAPINFO* m_aviVideoInfo = NULL; HRESULT hr; hr = AVIFileOpen(&m_aviFile,L"Output.avi",OF_READ, 0 ); if( hr != 0 ) return 0 ; hr = AVIFileGetStream(m_aviFile,&m_aviStream,streamtypeVIDEO,0); if( hr != 0 ) return 0; hr = AVIStreamInfo(m_aviStream,&m_aviInfo,sizeof(m_aviInfo) ); if( hr != 0 ) return 0; if(m_aviInfo.fccType == streamtypeVIDEO ) { hr = AVIStreamFormatSize( m_aviStream, 0, &lStreamSize ); m_aviVideoInfo = (BITMAPINFO*)new char[lStreamSize]; AVIStreamReadFormat(m_aviStream,0,m_aviVideoInfo,&lStreamSize); } int width, height; width = m_aviVideoInfo->bmiHeader.biWidth; height = m_aviVideoInfo->bmiHeader.biHeight; BITMAPINFOHEADER bih; ZeroMemory(&bih, sizeof(BITMAPINFOHEADER)); bih.biBitCount=32; //24 bit per pixel bih.biClrImportant=0; bih.biClrUsed = 0; bih.biCompression = BI_RGB; bih.biPlanes = 1; bih.biSize = sizeof(BITMAPINFOHEADER); bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biHeight = height; bih.biWidth = width; g_Size = bih.biSize + height * width * 4; g_pDIB = (BYTE*)new char[g_Size]; //根据AVI中BMP图像的信息定义缓冲区 // hr = AVIStreamRead( m_aviStream, 1, 1, pData, cx * cy * 3, NULL, NULL ); int nFrame = AVIStreamLength( m_aviStream ); PGETFRAME pFrame; //pFrame=AVIStreamGetFrameOpen(m_aviStream, &bih /*&m_aviVideoInfo->bmiHeader*/ ); pFrame=AVIStreamGetFrameOpen(m_aviStream, &m_aviVideoInfo->bmiHeader ); for( int i = 0 ; i < nFrame; ++i ) { BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, i ); g_lock.Lock(); if( pDIB ) memcpy( g_pDIB, pDIB, g_Size ); g_lock.Unlock();// CreateFromPackedDIBPointer( pDIB, 1 ); } { CAutoLock t(g_lock); if( g_pDIB ) delete[] g_pDIB; g_pDIB = NULL; } AVIStreamGetFrameClose(pFrame); AVIStreamRelease(m_aviStream); //delete[] pData; AVIStreamRelease(m_aviStream); AVIFileRelease(m_aviFile); if( m_aviVideoInfo ) delete m_aviVideoInfo; AVIFileExit(); return 0; 你生成AVI压缩格式请确定选择为microsoft vedio 1 格式,这样就可以了 我下载的这视频怎嘛没有视频格式也能播放啊?? 线程池一般干嘛用的? 当向列表框添加的时候有点闪 iphlpapi.h的编译问题 如何将字符传以十六进制的形式输出? 做个回调函数的例子,有些不解,请指教。 将数据插入数据库这样为什么不对呢?? 我要学习VC,怎么入手啊? 安装了visual studio 2005 pro 然后选择了C++,可不可以再切换到VB或者别的语言? 数据库中的两个问题,请进,请进!!! 向OpenGL达人求教 VC对话框数据显示不完整 求指教
PAVISTREAM pstream;
PGETFRAME pget;
LPBITMAPINFOHEADER lpbi; AVIFileInit();
if(AVIFileOpen(&pfile,(LPCTSTR)FileName,OF_READ,NULL)) {
AVIFileExit();
return(FALSE);
} if(AVIFileGetStream(pfile,&pstream,streamtypeVIDEO,0)) {
AVIFileRelease(pfile);
AVIFileExit();
return(FALSE);
} if((pget=AVIStreamGetFrameOpen(pstream,NULL)) == NULL) {
AVIStreamRelease(pstream);
AVIFileRelease(pfile);
AVIFileExit();
return(FALSE);
} lpbi=(LPBITMAPINFOHEADER)AVIStreamGetFrame(pget,0);
RegionRect.SetRect(RegionRect.left,RegionRect.top,
RegionRect.left+lpbi->biWidth-1,
RegionRect.top+lpbi->biHeight-1
); int i;
BITMAPINFO *lpbp;
CPalette hPal,*hOldPal;
LOGPALETTE *lp;
BYTE *p;
lpbp=(LPBITMAPINFO)lpbi;
if(lpbi->biBitCount <= 8) {
lp =(LOGPALETTE *)new BYTE[sizeof(LOGPALETTE) +(int)lpbi->biClrUsed* sizeof(PALETTEENTRY)];
lp->palVersion=0x0300;
lp->palNumEntries=(unsigned short)lpbi->biClrUsed;
for(i=0;i<lp->palNumEntries;i++) {
lp->palPalEntry[i].peRed=lpbp->bmiColors[i].rgbRed;
lp->palPalEntry[i].peGreen=lpbp->bmiColors[i].rgbGreen;
lp->palPalEntry[i].peBlue=lpbp->bmiColors[i].rgbBlue;
lp->palPalEntry[i].peFlags=0;
}
hPal.CreatePalette(lp);
hOldPal=pDC->SelectPalette(&hPal,0);
pDC->RealizePalette();
} p=(BYTE *)(lpbi)+(long)lpbi->biSize+(long)
(lpbi->biClrUsed*sizeof(RGBQUAD));
SetDIBitsToDevice(pDC->m_hDC,
RegionRect.left,
RegionRect.top,
(unsigned int)lpbi->biWidth,
(unsigned int)lpbi->biHeight,
0,
0,
0,
(unsigned int)lpbi->biHeight,
p,
(LPBITMAPINFO)lpbi,
DIB_RGB_COLORS);
if(lpbi->biBitCount <= 8)
{
pDC->SelectPalette(hOldPal,FALSE);
pDC->RealizePalette();
hPal.DeleteObject();
delete lp;
}
AVIStreamGetFrameClose(pget);
AVIStreamRelease(pstream);
AVIFileRelease(pfile);
AVIFileExit();
前面说到pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
我在下面的if判断语句当中加入GetLastError 然后用MessageBox返回 得到的是“操作成功完成” 这是不是说没有错呀~
pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
在函数AVIStreamGetFrameOpen中,第二个参数不要用NULL,应该传一个BITMAPINFOHEADER类型变量的引用。
原来在XP的时候还能的,换win7后就读取不了,不知道怎么回事?求解!
long lStreamSize;
PAVIFILE m_aviFile = NULL;
PAVISTREAM m_aviStream = NULL;
AVISTREAMINFO m_aviInfo;
BITMAPINFO* m_aviVideoInfo = NULL;
HRESULT hr; hr = AVIFileOpen(&m_aviFile,L"Output.avi",OF_READ, 0 );
if( hr != 0 )
return 0 ; hr = AVIFileGetStream(m_aviFile,&m_aviStream,streamtypeVIDEO,0);
if( hr != 0 )
return 0; hr = AVIStreamInfo(m_aviStream,&m_aviInfo,sizeof(m_aviInfo) );
if( hr != 0 )
return 0; if(m_aviInfo.fccType == streamtypeVIDEO )
{
hr = AVIStreamFormatSize( m_aviStream, 0, &lStreamSize );
m_aviVideoInfo = (BITMAPINFO*)new char[lStreamSize];
AVIStreamReadFormat(m_aviStream,0,m_aviVideoInfo,&lStreamSize);
} int width, height;
width = m_aviVideoInfo->bmiHeader.biWidth;
height = m_aviVideoInfo->bmiHeader.biHeight; BITMAPINFOHEADER bih;
ZeroMemory(&bih, sizeof(BITMAPINFOHEADER)); bih.biBitCount=32; //24 bit per pixel
bih.biClrImportant=0;
bih.biClrUsed = 0;
bih.biCompression = BI_RGB;
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biHeight = height;
bih.biWidth = width; g_Size = bih.biSize + height * width * 4;
g_pDIB = (BYTE*)new char[g_Size]; //根据AVI中BMP图像的信息定义缓冲区
// hr = AVIStreamRead( m_aviStream, 1, 1, pData, cx * cy * 3, NULL, NULL );
int nFrame = AVIStreamLength( m_aviStream );
PGETFRAME pFrame;
//pFrame=AVIStreamGetFrameOpen(m_aviStream, &bih /*&m_aviVideoInfo->bmiHeader*/ );
pFrame=AVIStreamGetFrameOpen(m_aviStream, &m_aviVideoInfo->bmiHeader ); for( int i = 0 ; i < nFrame; ++i )
{
BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, i );
g_lock.Lock();
if( pDIB ) memcpy( g_pDIB, pDIB, g_Size );
g_lock.Unlock();
// CreateFromPackedDIBPointer( pDIB, 1 );
} {
CAutoLock t(g_lock);
if( g_pDIB )
delete[] g_pDIB;
g_pDIB = NULL;
} AVIStreamGetFrameClose(pFrame);
AVIStreamRelease(m_aviStream);
//delete[] pData; AVIStreamRelease(m_aviStream);
AVIFileRelease(m_aviFile);
if( m_aviVideoInfo ) delete m_aviVideoInfo;
AVIFileExit();
return 0;