将BMP序列为AVI的问题,请高手帮忙看下

gaocumt 2009-01-08 01:39:49
c++写的一个将BMP图片序列为AVI的DLL,代码比较多,这里只贴了关键代码
CreateAviFile()函数可以实现,能够生成AVI文件(没有压缩图片为0 kb)
但是调用AddFrmToAviFile()添加新的图片时就会报 “尝试读取或写入受保护的内存”
请高手帮帮忙


DECLDIR DWORD CreateAviFile(HWND hWnd, char * pFileName, int nWidth, int nHeight, void * pEncodec, DWORD Reserver)
{
AVISTRUCT * pas = new AVISTRUCT();
memset(pas, 0, sizeof(AVISTRUCT));

pas->nHeight = nHeight;
pas->nWidth = nWidth;

AVIFileInit();
// 打开AVI,写入或创建
int result = AVIFileOpen(&pas->pfile, pFileName, OF_WRITE|OF_CREATE, NULL);
if(result)
{
delete pas;
AVIFileExit();
return 0;
}
// 流信息
AVISTREAMINFO Info;
memset(&Info, 0, sizeof(AVISTREAMINFO));

Info.fccType = streamtypeVIDEO;
Info.fccHandler = 0;
Info.dwScale = 1;
Info.dwRate = 25;
Info.dwSuggestedBufferSize = pas->nHeight * pas->nWidth * 3;
SetRect(&Info.rcFrame, 0,0,pas->nWidth, pas->nHeight);
//创建视频流
result= AVIFileCreateStream(pas->pfile, &pas->pavi, &Info);
if(result)
{
AVIFileClose(pas->pfile);
AVIFileExit();
delete pas;
return 0;
}

// 选择编码器
AVICOMPRESSOPTIONS opts;
AVICOMPRESSOPTIONS FAR * aopts[1] = {&opts};
memset(&opts, 0, sizeof(opts));

if(pEncodec)
{
AVICOMPRESSOPTIONS* tmp = (AVICOMPRESSOPTIONS *)pEncodec;
opts = *tmp;
}
else
{
pas->hWnd = hWnd;
//弹出编码器选择框,由用户选择压缩方式
if(!AVISaveOptions(pas->hWnd, 0, 1, &pas->pavi, (LPAVICOMPRESSOPTIONS FAR *) &aopts))
{
AVIStreamClose(pas->pavi);
AVIFileClose(pas->pfile);
AVIFileExit();
delete pas;
return 0;
}
}
// 压缩流
if(AVIMakeCompressedStream(&pas->pcom, pas->pavi, &opts, NULL) != AVIERR_OK)
{

AVIStreamClose(pas->pavi);
AVIFileClose(pas->pfile);

AVIFileExit();
delete pas;
return 0;
}

//头信息
BITMAPINFOHEADER bmh;
bmh.biSize = sizeof(BITMAPINFOHEADER);
bmh.biWidth = pas->nWidth;
bmh.biHeight = pas->nHeight;
bmh.biBitCount = 24;
bmh.biSizeImage = pas->nWidth * pas->nHeight * 3;
bmh.biClrImportant = 0;
bmh.biClrUsed = 0;
bmh.biPlanes = 1;
bmh.biXPelsPerMeter = 0;
bmh.biYPelsPerMeter = 0;
bmh.biCompression = BI_RGB;
//设置流格式
if(AVIStreamSetFormat(pas->pcom, 0, &bmh, sizeof(bmh)))
{
AVIFileExit();
delete pas;
return 0;
}

return (DWORD)pas;//返回pas所指向的内存地址

}

// 增加祯
DECLDIR BOOL AddFrmToAviFile(DWORD hHandle, BYTE * pPicBuffer, int nPicSize, int nNo)
{
AVISTRUCT * pas = (AVISTRUCT *)hHandle; //将CreateAviFile返回的地址负给pas,出错。~!

if(AVIStreamWrite(pas->pcom, nNo, 1, pPicBuffer, nPicSize, AVIIF_KEYFRAME , NULL, NULL))
return FALSE;

return TRUE;

}
...全文
243 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaocumt 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lsd1025 的回复:]
感觉楼主挺牛,帮顶!
[/Quote]
我狂汗啊,我做C#的,C++都不会,没办法公司给的任务,搞了好几天了才搞这么点
我都快崩溃了
gaocumt 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fantast_xue 的回复:]
32位系统还是64位的?
[/Quote]
32位
gaocumt 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wiowei 的回复:]
是不是pas所指向的资源有被占用?AVIStreamClose(pas->pavi);AVIFileClose(pas->pfile);之类
[/Quote]
这个有下面的函数负责释放资源

//完成,关闭文件
DECLDIR void CloseAviFile(DWORD hHandle)
{

AVISTRUCT * pas = (AVISTRUCT *)hHandle;

AVIStreamClose(pas->pavi);
AVIStreamClose(pas->pcom);
AVIFileClose(pas->pfile);

AVIFileExit();

delete pas;
}
wiowei 2009-01-08
  • 打赏
  • 举报
回复
是不是pas所指向的资源有被占用?AVIStreamClose(pas->pavi);AVIFileClose(pas->pfile);之类
微笑的撒旦 2009-01-08
  • 打赏
  • 举报
回复
32位系统还是64位的?
lsd1025 2009-01-08
  • 打赏
  • 举报
回复
感觉楼主挺牛,帮顶!
gaocumt 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ltc_mouse 的回复:]
CreateAviFile 返回的handle是有效的吗,或者是0?
[/Quote]
不是0,是有效的。
ltc_mouse 2009-01-08
  • 打赏
  • 举报
回复
CreateAviFile 返回的handle是有效的吗,或者是0?

64,660

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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