AVIFileOpen(&pfile,path,OF_READ | OF_SHARE_EXCLUSIVE,NULL); 
这句成功了么?
用GetLastError看看错误码!

解决方案 »

  1.   

    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();
      

  2.   


    前面说到pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL 
    我在下面的if判断语句当中加入GetLastError 然后用MessageBox返回 得到的是“操作成功完成” 这是不是说没有错呀~
      

  3.   

    这是因为AVI文件格式的关系,因为它不能解压这个AVI文件,AVI是一个封装格式,里面还有一个什么视频格式,它如果里面使用了某种格式,C++不能对它解压,就会返回NULL表示解压失败。你可以尝试用会声会影自己做一个AVI,就可以成功打开了。
      

  4.   


    pgf = AVIStreamGetFrameOpen(pavi, NULL);//总是返回NULL
    在函数AVIStreamGetFrameOpen中,第二个参数不要用NULL,应该传一个BITMAPINFOHEADER类型变量的引用。
      

  5.   

    我也遇到了这样的问题。
    原来在XP的时候还能的,换win7后就读取不了,不知道怎么回事?求解!
      

  6.   

    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;
      

  7.   

    你生成AVI压缩格式请确定选择为microsoft vedio 1 格式,这样就可以了