无法使用avimakecompressedstream创建压缩流 [英] Unable to create compressed stream with avimakecompressedstream
本文介绍了无法使用avimakecompressedstream创建压缩流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试从位图文件创建avi
我无法创建压缩流
我正在使用64位操作系统
我尝试了win32和x64的调试和发布选项
程序正在编译成功但运行时间错误...
我尝试过:
I'm trying to create avi from bitmap files
I'm not able to create compressed stream
I'm using 64 bit os
I tried both debug and release option's with win32 and x64
Program is compiling successfully but getting run time error...
What I have tried:
HRESULT CAviFile::AppendFrameFirstTime(int nWidth, int nHeight, LPVOID pBits,int nBitsPerPixel)
{
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 TerminateInitBits;
}
ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biWidth=nWidth;
bmpInfo.bmiHeader.biHeight=nHeight;
bmpInfo.bmiHeader.biCompression=BI_RGB;
bmpInfo.bmiHeader.biBitCount=nBitsPerPixel;
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*bmpInfo.bmiHeader.biHeight*bmpInfo.bmiHeader.biBitCount/8;
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*4,0);
if(m_hHeap==NULL)
{
//MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
goto TerminateInitBits;
}
m_lpBits=HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE,nMaxWidth*nMaxHeight*4);
if(m_lpBits==NULL)
{
//MessageBox(NULL,"Unable to Allocate Memory","Error",MB_OK);
goto TerminateInitBits;
}
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 TerminateInitBits;
}
ZeroMemory(&m_AviStreamInfo,sizeof(AVISTREAMINFO));
m_AviStreamInfo.fccType=streamtypeVIDEO;
m_AviStreamInfo.fccHandler=VIDEOCODEC;
m_AviStreamInfo.dwScale=1;
m_AviStreamInfo.dwRate= FPS; //Frames Per Second;
m_AviStreamInfo.dwQuality=-1; //Default Quality
m_AviStreamInfo.dwSuggestedBufferSize=nMaxWidth*nMaxHeight*4;
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 TerminateInitBits;
}
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)))
{
//////////////////////////////////////////////////////////////////////
//Here I'm this msgbox is showing......
MessageBox(NULL,"Unable to Create Compressed Stream","Error",MB_OK);
goto TerminateInitBits;
//////////////////////////////////////////////////////////////////////
}
if(FAILED(AVIStreamSetFormat(m_pAviCompressedStream,0,(LPVOID)&bmpInfo,bmpInfo.bmiHeader.biSize)))
{
//MessageBox(NULL,"Unable to Set Format","Error",MB_OK);
goto TerminateInitBits;
}
nAppendFuncSelector=2; //Point to UsualAppend Function
return AppendFrameUsual(nWidth,nHeight,pBits,nBitsPerPixel);
TerminateInitBits:
ReleaseMemory(); MessageBox(NULL,"Error Occured While Rendering the Movie","Error",MB_OK|MB_ICONERROR);
return E_FAIL;
}
推荐答案
您没有告诉我们发生了什么样的运行时错误。
错误的可能来源可能是您计算 BITMAPINFOHEADER [ ^ ]biSizeImage
成员错误。请参阅上面链接中的计算表面步幅。
You did not tell us what kind of runtime error occurs.
A possible source of the error might be that that your calculation of the BITMAPINFOHEADER[^]biSizeImage
member is wrong. See "Calculating Surface Stride" at the above link.
这篇关于无法使用avimakecompressedstream创建压缩流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文