AVI实时压缩方法

作者在 2008-07-29 23:52:28 发布以下内容
一个难题:要求实时将BMP格式的数据压缩为AVI文件.其中每帧BMP数据存放在指定内存中,格式为768*576,32位真彩,未压缩(即每帧大小为768*576*4)   
  我使用了vfw库的AVI*函数族,但效率太差,最快只能达到4-5帧/秒,我的机器配置是奔腾366,128M内存   
      
  我初步分析原因可能有以下几种:   
  1.方法不得当   
  AVIStreamWrite中有一个参数(lSamples)指明每次压几帧,但我给出多帧数据,返回的帧数(plSampWritten)总是一帧   
  我选择了每帧都是关键帧,这样似乎是压缩最快,不知道对不对。   
  我看到了有的压缩器有VIDCF_FASTTEMPORALD(快速临时压缩)的属性,但试过以后,效率有一点点提高,不很明显,不知道是不是我用错了.     
  2.选用的压缩器效率差   
          我机器上的压缩器(Compressor)好像太少,只有以下几种:   
                *Cinepak   Codec   by   Radius     
                  Intel   Indeo(R)   Video   R3.2     
                  Microsoft   RLE     
                *Microsoft   Video   1     
                  Microsoft   H.263   Video   Codec     
                  Microsoft   H.261   Video   Codec     
                  Intel   4:2:0   Video   V2.50     
                  Indeo?   video   5.10   
          而且只有打*的两种可用,其中Cinepak   Codec   by   Radius的压缩比较高一些,但效率更差.   
  3.将单帧数据压缩后再放入AVI效果会更好   
          我使用了vfw库的IC*函数族,但效率并未提高。   
  4.我的基本指导思想错误   
          不应该使用vfw库函数,但我试过LeadTools和OpenGL的压缩库,效果还不如vfw;   
          MCI的函数库我没试过,不知道会怎么样   
          DirectShow我不会用,而且好像内部也是调用的vfw   
      
  我的需要是:   
  把BMP格式的内存数据(768*576,32位)压缩成AVI文件   
  压缩速率:10-15帧/秒   
  压缩比:1:10   
  压缩质量:一般   
  函数接口参考下面   
  class   CAVIFile{   
          Save(CString   strFileName,LPBITMAPINFO   pbih);//strFileName为存储的文件名,pbih是AVI的格式(主要内容是AVI帧的长宽(最大为   768*576))   
          AddFrame(LPBYTE   pdata,int   frames)//pdata是数据块的首地址(即BMP去掉信息头的数据块首地址),每帧数据长度已经定下来了,可以不用传入数据长度;frames是指每次压多少帧   
          Close();   
  }   
      
  给出具体程序或方案都可以,还有希望得到压缩器(Compressor)的来源(如何获得,存放在计算机的什么位置)
编码 | 阅读 7919 次
文章评论,共0条
游客请输入验证码
浏览1970284次