怎么自己写avi的文件?

capboy 2002-03-08 04:18:23
最近要做个录像的程序...使用avi的格式.可是没有做过:(
(自己做个mepg4 video+mp3 Audio的录像)

看了文档,都是说如何保存bmp的,当然也有办法保存压缩的,AVIMakeCompressedStream.

我现在获得的数据已经是压缩的了...所以在建立stream的时候,就设置了:
strhdr.fccType = streamtypeVIDEO;// stream type
strhdr.fccHandler = mmioFOURCC('D','I','V','X');
strhdr.dwScale = 1;
strhdr.dwRate = 25;
strhdr.dwSuggestedBufferSize = 0;
SetRect(&strhdr.rcFrame, 0, 0, // rectangle for stream
384,
288);

可是使用hr = AVIStreamWrite(psVideo, lVideoStreamSize, 1, data,
len, dwFlags, NULL, NULL);
保存的文件不对...根本不能够播放.:(

还有个问题是怎么把压缩的声音部分也一起写到avi文件中呢?

烦恼中!
...全文
60 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atl_lover 2002-03-13
  • 打赏
  • 举报
回复
sky_horse(),我用用GraphEdit 模拟bmp->avi,成功了。但是,我还有几个疑问,还望赐教。 这个方法,仅仅是压缩,一幅图多张图,一起压缩呢??
capboy 2002-03-12
  • 打赏
  • 举报
回复
呵呵。。。
我是想知道标准avi函数是怎么做的。。。
sky_horse 2002-03-11
  • 打赏
  • 举报
回复
使用directshow filter,将输出的压缩流接到-->avi mux filter--->file write filter即可。如果不愿意,也可以自己写avi文件,avi文件格式很简单,只是一种封装格式,处理并不困难。
capboy 2002-03-10
  • 打赏
  • 举报
回复
谢谢
保存图片格式的我也做成功了.?我现在是想写入压缩后的数据,这样可以做自己的mepg4的avi文件了.:)
依然困惑中!
casobug 2002-03-08
  • 打赏
  • 举报
回复
很久前做过这种工作,给你几个函数看看是否有参考价值。
//-------------------------
BeginWriteAvi(HWND hWnd,LPCTSTR lpAviFileName)
{
int Width,Height;
Width=this->ScrnWidth;
Height=this->ScrnHeight;

AVIFileOpen(&pAviWfile, lpAviFileName, OF_CREATE, NULL);
biNew=bmih;
biNew.biWidth=Width;
biNew.biHeight=Height;
biNew.biSizeImage=Height*((Width*24+31)/32*4);

memset(&strhdr,0,sizeof(AVISTREAMINFO));
strhdr.fccType=streamtypeVIDEO;
strhdr.dwScale=1;
strhdr.dwRate=25;
strhdr.dwSuggestedBufferSize=biNew.biSizeImage;
strcpy(strhdr.szName,"测试AVI视频流");
SetRect(&strhdr.rcFrame, 0, 0, (int) biNew.biWidth,
(int) biNew.biHeight);

AVIFileCreateStream(pAviWfile, &psProcess, &strhdr);
AVICOMPRESSOPTIONS opts;
LPAVICOMPRESSOPTIONS aopts[1];
memset(&opts,0,sizeof(AVICOMPRESSOPTIONS));
aopts[0]=&opts;
AVISaveOptions(hWnd, 0, 1, &psProcess,&aopts[0]);
AVIMakeCompressedStream(&psCompressed, psProcess, &opts, NULL);
AVIStreamSetFormat(psCompressed, 0, &biNew, sizeof(biNew));
return true;
}

//-------------------------
WriteGLScnToAvi()
{
static int frame=0;
BYTE *bmp;
int Width,Height;
Width=this->ScrnWidth;
Height=this->ScrnHeight;
bmp=new BYTE[(Width+1)*Height*3];
glReadPixels(0,0,Width,Height,GL_BGR_EXT,GL_BYTE,bmp);
AVIStreamWrite(psCompressed, frame, 1, bmp,
biNew.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
delete bmp;
frame++;
}
//-------------------------
EndWriteAvi()
{
AVIStreamRelease(psProcess);
AVIStreamRelease(psCompressed);
AVIFileRelease(pAviWfile);
}

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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