借鉴了一下网上的那段分解avi视频逐帧访问的代码,可是发现出了问题,就是当我用黑白色视频时好使,但是当对彩色视频进行分解时,分解的bmp位图上什么都没有,请问高手这是怎么回事,求高手帮忙!

解决方案 »

  1.   

    老兄,看來是沒人幫你了,剛才走了一圈,他們都在討論“火箭VS黃蜂”,如今的csdn已經不如以前了!出結果了通知我一下,小弟也想學習一下!
      

  2.   

    呵呵,同意你,谁让我们现在实力弱呢,等咱们实力强了,自己开个网站,一定帮助客户,不禁让我想起了马云的讲话,客户是第一的,依我看,csdn老是这样,早晚是要黄的!
      

  3.   

    誒呀,這不是老朋友嗎,又碰上難題了,不能怪csdn,誰讓你問的問題這麼難呢?
      

  4.   

    你问的问题不具体吧,现在CSDN都没几个人,我前几天问的AGG 二D图形库 绘制渐变色的,100分,没一个问题,都快一个星期了,我汗呀。
      

  5.   

    代码如下:高手帮调调void CAviVbmpDlg::AVItoBmp(CString strAVIFileName, CString strBmpDir)
    {
    AVIFileInit();
    PAVIFILE avi;
    int res=AVIFileOpen(&avi, strAVIFileName, OF_READ, NULL);
    int n = GetLastError();
    if (res!=AVIERR_OK)
    {
    //an error occures
    if (avi!=NULL)
    AVIFileRelease(avi);
    return ;
    }
    AVIFILEINFO avi_info;
    AVIFileInfo(avi, &avi_info, sizeof(AVIFILEINFO));
    PAVISTREAM pStream;
    res=AVIFileGetStream(avi, &pStream, streamtypeVIDEO /*video stream*/, 
    0/*first stream*/);
    if (res!=AVIERR_OK)
    {
    if (pStream!=NULL)
    AVIStreamRelease(pStream);
    AVIFileExit();
    return ;
    } //do some task with the stream
    int iNumFrames;
    int iFirstFrame;
    iFirstFrame=AVIStreamStart(pStream);
    if (iFirstFrame==-1)
    {
    //Error getteing the frame inside the stream
    if (pStream!=NULL)
    AVIStreamRelease(pStream);
    AVIFileExit();
    return ;
    }
    iNumFrames=AVIStreamLength(pStream);
    if (iNumFrames==-1)
    {
    //Error getteing the number of frames inside the stream
    if (pStream!=NULL)
    AVIStreamRelease(pStream);
    AVIFileExit();
    return ;
    } //getting bitmap from frame
    BITMAPINFOHEADER bih;
    ZeroMemory(&bih, sizeof(BITMAPINFOHEADER)); bih.biBitCount=24; //24 bit per pixel
    bih.biClrImportant=0;
    bih.biClrUsed = 0;
    bih.biCompression = BI_RGB;
    bih.biPlanes = 1;
    bih.biSize = 40;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;
    //calculate total size of RGBQUAD scanlines (DWORD aligned)bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ; PGETFRAME pFrame;
    pFrame=AVIStreamGetFrameOpen(pStream, NULL ); AVISTREAMINFO streaminfo;
    AVIStreamInfo(pStream,&streaminfo,sizeof(AVISTREAMINFO)); //Get the first frame
    BITMAPINFOHEADER bih2;
    long lsize = sizeof(bih2);
    int index=0;
    for (int i=iFirstFrame; i<iNumFrames; i++)
    {
    index= i-iFirstFrame;
    BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, index); //
    AVIStreamReadFormat(pStream,index,&bih2,&lsize);
    BITMAPFILEHEADER stFileHdr; BYTE* Bits=new BYTE[bih2.biSizeImage];
    AVIStreamRead(pStream,index,1,Bits,bih2.biSizeImage,NULL,NULL);
    //RtlMoveMemory(Bits, pDIB + sizeof(BITMAPINFOHEADER), bih2.biSizeImage); bih2.biClrUsed =0;
    stFileHdr.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    stFileHdr.bfSize=sizeof(BITMAPFILEHEADER);
    stFileHdr.bfType=0x4d42;  CString FileName;
    FileName.Format("Frame-%05d.bmp", index);
    CString strtemp = strBmpDir;
    strtemp += "\\";
    strtemp += FileName;
    FILE* fp=_tfopen(strtemp ,_T("wb"));
    fwrite(&stFileHdr,1,sizeof(BITMAPFILEHEADER),fp);
    fwrite(&bih2,1,sizeof(BITMAPINFOHEADER),fp);
    int ff = fwrite(Bits,1,bih2.biSizeImage,fp);
    int e = GetLastError();
    fclose(fp);
    /////
    delete Bits;
    //CreateFromPackedDIBPointer(pDIB, index);
    } AVIStreamGetFrameClose(pFrame); //close the stream after finishing the task
    if (pStream!=NULL)
    AVIStreamRelease(pStream);
    AVIFileExit();
    }
      

  6.   

    we want to get help!