作者在 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)的来源(如何获得,存放在计算机的什么位置)
我使用了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)的来源(如何获得,存放在计算机的什么位置)