我用的是http://www.codeproject.com/bitmap/createmovie.asp 的CAviFile类,但是在我压缩
我的HBITMAP对象时总是
if (FAILED(AVISaveOptions(NULL, 0, 1, &m_pAviStream, (LPAVICOMPRESSOPTIONS FAR *) &m_AviStreamInfo)))
{
goto TerminateInit;
}报错不知道什么原因,我压得是16位色函数的具体代码如下:
HRESULT CAviFile::AppendFrameFirstTime(HBITMAP hBitmap)
{
int nMaxWidth=GetSystemMetrics(SM_CXSCREEN),nMaxHeight=GetSystemMetrics(SM_CYSCREEN); BITMAPINFO bmpInfo; m_hAviDC=CreateCompatibleDC(NULL);
if(m_hAviDC==NULL)
{
//MessageBox(NULL,"Unable to Create Compatible DC","Error",MB_OK|MB_ICONERROR);
goto TerminateInit;
} ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

GetDIBits(m_hAviDC,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); bmpInfo.bmiHeader.biCompression=BI_RGB;

if(bmpInfo.bmiHeader.biHeight>nMaxHeight) nMaxHeight=bmpInfo.bmiHeader.biHeight;
if(bmpInfo.bmiHeader.biWidth>nMaxWidth) nMaxWidth=bmpInfo.bmiHeader.biWidth; m_hHeap=HeapCreate(HEAP_NO_SERIALIZE,nMaxWidth*nMaxHeight*2,0);
if(m_hHeap==NULL)
{
//MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
goto TerminateInit;
}

m_lpBits=HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE,nMaxWidth*nMaxHeight*2);
if(m_lpBits==NULL)
{
//MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
goto TerminateInit;
} if(FAILED(AVIFileOpen(&m_pAviFile,m_szFileName,OF_CREATE|OF_WRITE,NULL)))
{
//MessageBox(NULL,"Unable to Create the Movie File","Error",MB_OK|MB_ICONERROR);
goto TerminateInit;
} ZeroMemory(&m_AviStreamInfo,sizeof(AVISTREAMINFO));
m_AviStreamInfo.fccType=streamtypeVIDEO;
m_AviStreamInfo.fccHandler=mmioFOURCC('M','P','G','4');
m_AviStreamInfo.dwScale=1;
m_AviStreamInfo.dwRate=1; //15fps
m_AviStreamInfo.dwQuality=-1; //Default Quality
m_AviStreamInfo.dwSuggestedBufferSize=nMaxWidth*nMaxHeight*2;
    SetRect(&m_AviStreamInfo.rcFrame,0,0,bmpInfo.bmiHeader.biWidth,bmpInfo.bmiHeader.biHeight);
strcpy(m_AviStreamInfo.szName,"Video Stream"); if(FAILED(AVIFileCreateStream(m_pAviFile,&m_pAviStream,&m_AviStreamInfo)))
{
//MessageBox(NULL,"Unable to Create Stream","Error",MB_OK|MB_ICONERROR);
goto TerminateInit; } ZeroMemory(&m_AviCompressOptions,sizeof(AVICOMPRESSOPTIONS));
m_AviCompressOptions.fccType=streamtypeVIDEO;
m_AviCompressOptions.fccHandler=m_AviStreamInfo.fccHandler;
//m_AviCompressOptions.dwFlags   =   AVICOMPRESSF_KEYFRAMES;
m_AviCompressOptions.dwFlags=AVICOMPRESSF_KEYFRAMES|AVICOMPRESSF_VALID;//|AVICOMPRESSF_DATARATE;
m_AviCompressOptions.dwKeyFrameEvery=1;
// m_AviCompressOptions.dwBytesPerSecond=1000/8;
// m_AviCompressOptions.dwQuality=dwQuality*100;
//HRESULT hr=FALSE; hr = AVIMakeCompressedStream(&m_pAviCompressedStream,m_pAviStream,&m_AviCompressOptions,NULL);

if (FAILED(AVISaveOptions(NULL, 0, 1, &m_pAviStream, (LPAVICOMPRESSOPTIONS FAR *) &m_AviStreamInfo)))
{
goto TerminateInit;
} if(FAILED(AVIMakeCompressedStream(&m_pAviCompressedStream,m_pAviStream,&m_AviCompressOptions,NULL)))
{
//MessageBox(NULL,"Unable to Create Compressed Stream","Error",MB_OK);
goto TerminateInit;
} if(FAILED(AVIStreamSetFormat(m_pAviCompressedStream,0,(LPVOID)&bmpInfo,bmpInfo.bmiHeader.biSize)))
{
//MessageBox(NULL,"Unable to Set Format","Error",MB_OK);
goto TerminateInit;
} nAppendFuncSelector=2; //Point to UsualAppend Function return AppendFrameUsual(hBitmap);TerminateInit: ReleaseMemory(); MessageBox(NULL,"Error Occured While Rendering the Movie","Error",MB_OK|MB_ICONERROR); return E_FAIL;
}

解决方案 »

  1.   

    顶一下,我压缩的是24位RGB数据,也出现这种情况,望高手帮忙!
      

  2.   

    24位 rgb 直接 用就 可以了,,不用压缩...
    我也正在想 我的 8位 改怎么显示哦??
      

  3.   

    16位的如下: 本人机器上通过 运行,显示正确:HRESULT CAviFile::AppendFrameFirstTime(HBITMAP hBitmap)
    {
    int nMaxWidth=GetSystemMetrics(SM_CXSCREEN),nMaxHeight=GetSystemMetrics(SM_CYSCREEN); BITMAPINFO bmpInfo; m_hAviDC=CreateCompatibleDC(NULL);
    if(m_hAviDC==NULL)
    {
    MessageBox(NULL,"Unable to Carete Compatible DC","Error",MB_OK|MB_ICONERROR);
    goto TerminateInit;
    } ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
    bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

    GetDIBits(m_hAviDC,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); bmpInfo.bmiHeader.biCompression=BI_RGB;

    if(bmpInfo.bmiHeader.biHeight>nMaxHeight) nMaxHeight=bmpInfo.bmiHeader.biHeight;
    if(bmpInfo.bmiHeader.biWidth>nMaxWidth) nMaxWidth=bmpInfo.bmiHeader.biWidth; m_hHeap=HeapCreate(HEAP_NO_SERIALIZE,nMaxWidth*nMaxHeight*2,0);
    if(m_hHeap==NULL)
    {
    MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
    goto TerminateInit;
    }

    m_lpBits=HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE,nMaxWidth*nMaxHeight*2);
    if(m_lpBits==NULL)
    {
    MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
    goto TerminateInit;
    } if(FAILED(AVIFileOpen(&m_pAviFile,m_szFileName,OF_CREATE|OF_WRITE,NULL)))
    {
    MessageBox(NULL,"Unable to Create the Movie File","Error",MB_OK|MB_ICONERROR);
    goto TerminateInit;
    } ZeroMemory(&m_AviStreamInfo,sizeof(AVISTREAMINFO));
    m_AviStreamInfo.fccType=streamtypeVIDEO;
    m_AviStreamInfo.fccHandler=mmioFOURCC('M','P','G','4');
    m_AviStreamInfo.dwScale=1;
    m_AviStreamInfo.dwRate=1; //15fps
    m_AviStreamInfo.dwQuality=-1; //Default Quality
    ///m_AviStreamInfo.dwSuggestedBufferSize=nMaxWidth*nMaxHeight*1;
    m_AviStreamInfo.dwSuggestedBufferSize=nMaxWidth*nMaxHeight*2;
        SetRect(&m_AviStreamInfo.rcFrame,0,0,bmpInfo.bmiHeader.biWidth,bmpInfo.bmiHeader.biHeight);
    strcpy(m_AviStreamInfo.szName,"Video Stream"); if(FAILED(AVIFileCreateStream(m_pAviFile,&m_pAviStream,&m_AviStreamInfo)))
    {
    MessageBox(NULL,"Unable to Create Stream","Error",MB_OK|MB_ICONERROR);
    goto TerminateInit; } ZeroMemory(&m_AviCompressOptions,sizeof(AVICOMPRESSOPTIONS));
    m_AviCompressOptions.fccType=streamtypeVIDEO;
    m_AviCompressOptions.fccHandler=m_AviStreamInfo.fccHandler;
    m_AviCompressOptions.dwFlags=AVICOMPRESSF_KEYFRAMES|AVICOMPRESSF_VALID;//|AVICOMPRESSF_DATARATE;
    m_AviCompressOptions.dwKeyFrameEvery=15;
    //m_AviCompressOptions.dwBytesPerSecond=1000/8;
    //m_AviCompressOptions.dwQuality=100; if(FAILED(AVIMakeCompressedStream(&m_pAviCompressedStream,m_pAviStream,&m_AviCompressOptions,NULL)))
    {
    MessageBox(NULL,"Unable to Create Compressed Stream","Error",MB_OK);
    goto TerminateInit;
    } if(FAILED(AVIStreamSetFormat(m_pAviCompressedStream,0,(LPVOID)&bmpInfo,sizeof(BITMAPINFOHEADER))))
    {
    MessageBox(NULL,"Unable to Set Format","Error",MB_OK);
    goto TerminateInit;
    } nAppendFuncSelector=2; //Point to UsualAppend Function return AppendFrameUsual(hBitmap);TerminateInit: ReleaseMemory(); MessageBox(NULL,"Error Occured While Rendering the Movie","Error",MB_OK|MB_ICONERROR); return E_FAIL;
    }HRESULT CAviFile::AppendFrameUsual(HBITMAP hBitmap)
    {
    BITMAPINFO bmpInfo; bmpInfo.bmiHeader.biBitCount=0;
    bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

    GetDIBits(m_hAviDC,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); bmpInfo.bmiHeader.biCompression=BI_RGB; GetDIBits(m_hAviDC,hBitmap,0,bmpInfo.bmiHeader.biHeight,m_lpBits,&bmpInfo,DIB_RGB_COLORS); if(FAILED(AVIStreamWrite(m_pAviCompressedStream,m_lSample++,1,m_lpBits,bmpInfo.bmiHeader.biSizeImage,0,NULL,NULL)))
    return E_FAIL;    return S_OK;
    }