查看: 1587|回复: 4

录制视频

[复制链接]

该用户从未签到

发表于 2010-11-4 10:46:18 | 显示全部楼层 |阅读模式
我想用代码实现把场景中的动画路径录制成动画,现在用image->readPixels()能够输出一系列图片了,在网上找了下应该是把这些图片存入一个列表中,然后再把序列输出为各种视频格式,就是不知道怎样把它导成视频?最好推荐下一些资料

该用户从未签到

发表于 2010-11-4 13:41:12 | 显示全部楼层
我认为之前已经回答过这个问题了,有很多种方法可供您选择,例如Windows SDK的函数,ffmpeg,甚至一些截屏工具。

该用户从未签到

 楼主| 发表于 2010-11-4 16:03:19 | 显示全部楼层
恩,谢谢array大哥,下面是bmp转成avi的代码:
//生成avi
void Cbmp2aviDlg::BMPtoAVI(CString szAVIName, CString strBmpDir)
{
        CFileFind finder;
        strBmpDir += _T("\\*.*");
        AVIFileInit();
        AVISTREAMINFO strhdr;
        PAVIFILE pfile;
        PAVISTREAM ps;
        int nFrames =0;
        HRESULT hr;
        BOOL bFind = finder.FindFile(strBmpDir);
        while(bFind)
        {
                bFind = finder.FindNextFile();
                if(!finder.IsDots() && !finder.IsDirectory())
                {
                        CString str = finder.GetFilePath();
                        FILE *fp = fopen(str,"rb");
                        BITMAPFILEHEADER bmpFileHdr;
                        BITMAPINFOHEADER bmpInfoHdr;
                        fseek( fp,0,SEEK_SET);
                        fread(&bmpFileHdr,sizeof(BITMAPFILEHEADER),1, fp);
                        fread(&bmpInfoHdr,sizeof(BITMAPINFOHEADER),1, fp);
                        BYTE *tmp_buf = NULL;
                        if(nFrames ==0 )
                        {
                                AVIFileOpen(&pfile,szAviName,OF_WRITE | OF_CREATE,NULL);
                                _fmemset(&strhdr, 0, sizeof(strhdr));
                                strhdr.fccType = streamtypeVIDEO;// stream type
                                strhdr.fccHandler = 0;
                                strhdr.dwScale = 1;
                                strhdr.dwRate = 15; // 15 fps
                                strhdr.dwSuggestedBufferSize = bmpInfoHdr.biSizeImage ;
                                SetRect(&strhdr.rcFrame, 0, 0, bmpInfoHdr.biWidth, bmpInfoHdr.biHeight);
                                // And create the stream;
                                hr = AVIFileCreateStream(pfile,&ps,&strhdr);
                                // hr = AVIStreamSetFormat(ps,nFrames,&bmpInfoHdr,sizeof(bmpInfoHdr));
                        }
                        tmp_buf = new BYTE[bmpInfoHdr.biWidth * bmpInfoHdr.biHeight * 3];
                        fread(tmp_buf, 1, bmpInfoHdr.biWidth * bmpInfoHdr.biHeight * 3, fp);
                        hr = AVIStreamSetFormat(ps,nFrames,&bmpInfoHdr,sizeof(bmpInfoHdr));
                        hr = AVIStreamWrite(ps, // stream pointer
                                                                nFrames , // time of this frame
                                                                1, // number to write
                                                                (LPBYTE) tmp_buf,
                                                                bmpInfoHdr.biSizeImage , // size of this frame
                                                                AVIIF_KEYFRAME, // flags....
                                                                NULL,
                                                                NULL);
                        nFrames ++;
                        fclose(fp);
                }
        }
        AVIStreamClose(ps);
        if(pfile != NULL)
                AVIFileRelease(pfile);
        AVIFileExit();
}

该用户从未签到

发表于 2010-11-14 18:19:05 | 显示全部楼层
我们的项目里面早就实现了这个功能。当初用的好像是xvid压缩。上面的代码生成的可能不是压缩格式,生成的avi文件非常大,导致程序大部分时候都在磁盘IO,场景可能会比较卡。

该用户从未签到

发表于 2010-11-15 09:59:45 | 显示全部楼层
要是实时压缩会更卡巴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表