AVIStreamGetFrameOpen总是返回NULL

cxh860815 2010-01-18 09:39:21
我用二进制打开AVI文件以后发现AVI视频的图像是MJPG格式的,现在我想用API函数来播放这个AVI文件,写好的代码播放没压缩的AVI是可以的,但是播放这个视频图像是MJPG格式时就出了问题,跟踪以后发现是AVIStreamGetFrameOpen总是返回NULL下面是我的代码
PAVIFILE pfile; //avi文件打开对象
AVIFILEINFO pfi; //文件信息
AVISTREAMINFO aviStrInfo;
PAVISTREAM pavi; //流信息
PGETFRAME pgf; //帧信息
AVIFileInit();
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
AVIFileInfo(pfile,&pfi,sizeof(AVIFILEINFO));
AVIFileGetStream(pfile,&pavi,streamtypeVIDEO,0);
pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
if(NULL == pgf)
{
AVIStreamRelease(pavi);
return NULL;
}
lp=(BYTE *)AVIStreamGetFrame(pgf,shownum);//提取第m_nowshow帧 由于前面返回NULL,接下来的代码就不运行
if(NULL == lp)
{
AVIStreamGetFrameClose(pgf);
AVIStreamRelease(pavi);
return NULL;
}
请高手指点一下,不知道的也请帮顶一下,谢谢啦~~果有描述的不清楚的地方请尽管指出来,我尽力再说详细些~
...全文
832 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰冠残殇 2012-01-11
  • 打赏
  • 举报
回复 1
你生成AVI压缩格式请确定选择为microsoft vedio 1 格式,这样就可以了
flamedll 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 miemiekismet 的回复:]
这是因为AVI文件格式的关系,因为它不能解压这个AVI文件,AVI是一个封装格式,里面还有一个什么视频格式,它如果里面使用了某种格式,C++不能对它解压,就会返回NULL表示解压失败。你可以尝试用会声会影自己做一个AVI,就可以成功打开了。
[/Quote]
那么,具体里面的格式知道的情况下,传入相关参数,可不可以进行解压
saojianbo 2011-09-02
  • 打赏
  • 举报
回复
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;
saojianbo 2011-09-02
  • 打赏
  • 举报
回复
我也遇到了这样的问题。
原来在XP的时候还能的,换win7后就读取不了,不知道怎么回事?求解!
wangchang_zpy 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cxh860815 的回复:]

引用 4 楼 fandh 的回复:
引用 3 楼 cxh860815 的回复:
引用 1 楼 fandh 的回复:
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
这句成功了么?
用GetLastError看看错误码!

成功了的 代码没有语法错误~

呵呵,不是语法错误,是看看执行过程中,哪儿出错……
[/Quote]

pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
在函数AVIStreamGetFrameOpen中,第二个参数不要用NULL,应该传一个BITMAPINFOHEADER类型变量的引用。
miemiekismet 2010-05-19
  • 打赏
  • 举报
回复
这是因为AVI文件格式的关系,因为它不能解压这个AVI文件,AVI是一个封装格式,里面还有一个什么视频格式,它如果里面使用了某种格式,C++不能对它解压,就会返回NULL表示解压失败。你可以尝试用会声会影自己做一个AVI,就可以成功打开了。
wuchuncai 2010-01-19
  • 打赏
  • 举报
回复
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();
fandh 2010-01-19
  • 打赏
  • 举报
回复
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
这句成功了么?
用GetLastError看看错误码!
cxh860815 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fandh 的回复:]
引用 3 楼 cxh860815 的回复:
引用 1 楼 fandh 的回复:
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
这句成功了么?
用GetLastError看看错误码!

成功了的 代码没有语法错误~

呵呵,不是语法错误,是看看执行过程中,哪儿出错!
[/Quote]

前面说到pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
我在下面的if判断语句当中加入GetLastError 然后用MessageBox返回 得到的是“操作成功完成” 这是不是说没有错呀~
fandh 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cxh860815 的回复:]
引用 1 楼 fandh 的回复:
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
这句成功了么?
用GetLastError看看错误码!

成功了的 代码没有语法错误~
[/Quote]
呵呵,不是语法错误,是看看执行过程中,哪儿出错!
cxh860815 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL);
这句成功了么?
用GetLastError看看错误码!
[/Quote]
成功了的 代码没有语法错误~

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧