BMP to AVI 及其压缩的实现

  <script type="text/javascript"> srcString = contentarea.value; srcString = ubbReplace(srcString, 'all'); document.write(srcString); srcString = signaturearea.value; showSign(srcString); </script>1.设计方案的产生
   这个设计方案是物光院嵌入式系统试验室的基于CDMA技术的无线视频传输监控系统的设计的一部分。我简要说明此系统的原理。系统单片机部分主要模块由CDMA、DSP与ARM处理器、FLASH、ROM组成。此单片机用来获取监控所在地视频图像,经过DSP中的H264协议压缩,通过arm再到CDMA,最后把数据包发送到主机端的网卡。最后通过主机端的函数接口:
LONG WINAPI Decode(void *DecHeap,void *CodBuf,int CodLen,void *ResBuf,int *imgtype,int *imgw,int *imgh);把压缩视频包解码存储于ResBuf。
2.为什么要用到BMP to AVI
   单片机提供的本地存储图像函数接口:LONG API SaveImgToBmpFile(CHAR *BmpFileName,
void *ImgBuf,LONG Img_Width,LONG Img_Height,LONG Img_ClrBits);是将图像帧按BITMAP格式文件存盘。而我们实际的目标是要把实时视频录制成AVI文件格式,并且实现压缩。这样才不至于在录了几十分钟硬盘就多了好几个G。
3.BMP to AVI方案的具体实施
   本来以为可以很轻松的找到例子。可是我翻阅了百度的几乎所有相关中文网站,没有找到BMP 转换成 AVI的例子。唯一的一个例子是用VB写的,它的缺点是张数有限,不支持动态添加,而且没有压缩,数据量很大。最后,我在参考了国外网站上的两个类似的AVI类,经过我的修改,于是有了现在这个程序。
步骤(1)了解AVI (定义在AVIFMT.H文件中)
微软公司的AVI格式是一种由RIFF指定的应用程序,用来对音频/视频流进行捕捉、编辑和播放的文件格式。大体上,AVI文件包含不同类型的多重数据流。大多数的AVI文件里都包含音频和视频流。有些简单的AVI文件里只包含视频流而不包含音频流。而有些更特殊的AVI文件可能包括一个控制通道或MIDI道作为一个附加的数据流。控制道可以控制如MCI影碟播放器的外部器件,MIDI声道可以为视频流播放背景音乐。要完全播放出这种特殊的数据流效果,需要播放程序有特殊的插件,但一般的播放程序也可以播放,只不过把特殊数据忽略AVI文件使用AVI RIFF格式。AVI的RIFF格式通过文件开始的”AVI ”字符来识别。所有的AVI文件包括两个必须的LIST块。这些数据块定义了视频和音频流的格式数据。AVI文件也可能包括一个索引数据块。这个可选块包含了可选数据在文件中的位置。一个AVI文件具有以下形式:
  RIFF(’AVI ’ 
        LIST  (‘hdrl’)    //定义数据格式
        LIST(‘movi’)     //包含AVI流数据
       [‘idx1’<AVI Index>]//索引
          )
     LIST块和索引数据块是RIFF”AVI”数据块的子数据块。“AVI”数据块用来辨认文件是一个AVI RIFF文件。LIST“hdrl”数据块定义数据的格式,它被放在第一个位置。LIST “movi”数据块包含AVI流的数据,它被放在第二个位置。LIST“idx1”数据块是可选择的索引数据块。AVI文件一定要以适当的顺序保存这三个分量。LIST”hdrl”和LIST”movi”又使用子数据块作为它们的数据。
RIFF('AVI' 
 *       LIST(‘hdrl‘//多上数据流存在
 *     avih(<MainAVIHeader>)//AVI主首部
 *                  LIST ('strl'
 *                      strh(<Stream header>)//流首部
 *                      strf(<Stream format>)//流格式
 *   ... additional header data//格式由压缩解压驱动器定义
 *            LIST(‘movi‘//数据直接位于数据块中  
 *         { LIST(‘rec’ //编组成REC数据块放入movi
 *             SubChunk...//用于磁盘存取文件
 *          )
 *             | SubChunk } ....     
 *            )
 *            [ <AVIIndex> ]
 *      )
LIST”movi”数据块包含一个用于标示数据块类型的四字符编码,由二字符流编号和定义信息类型的二字符组成
数据流一些块定义:
 *           Video Streams:
 *                  ##db: RGB DIB bits(未压缩)
 *                  ##dc: RLE8 compressed DIB bits
 *                  ##pc: Palette Change
 *
 *           Audio Streams:
 *                  ##wb: waveform audio bytes
AVI主首部定义:
typedef struct
{
    DWORD  dwMicroSecPerFrame; // frame display rate (or 0L)
    DWORD  dwMaxBytesPerSec; // max. transfer rate
    DWORD  dwPaddingGranularity; // pad to multiples of this
                                                // size; normally 2K.
    DWORD dwFlags; // the ever-present flags
    DWORD dwTotalFrames; // # frames in file
    DWORD dwInitialFrames;
    DWORD dwStreams;
    DWORD dwSuggestedBufferSize;
    
    DWORD dwWidth;
    DWORD dwHeight;
    
    DWORD dwReserved[4];
} MainAVIHeader;
AVI流首部:
typedef struct {
    FOURCC fccType;
    FOURCC fccHandler;
    DWORD dwFlags; /* Contains AVITF_* flags */
    WORD wPriority;
    WORD wLanguage;
    DWORD dwInitialFrames;
    DWORD dwScale;
    DWORD dwRate;/* dwRate / dwScale == samples/second */
    DWORD dwStart;
    DWORD dwLength; /* In units above... */
    DWORD dwSuggestedBufferSize;
    DWORD dwQuality;
    DWORD dwSampleSize;
    RECT rcFrame;
} AVIStreamHeader;
步骤(2)BMP to AVI流程(定义在AVIFILE文件中)
主要有6步:

遍历文件夹-->建立AVI文件-->取得位图句柄

设置压缩参数-->压缩-->装帧-->释放位图句柄

相关函数接口和类接口:
IAVIFile    AVIFileInit(); AVIFileOpen(); AVIFileExit();
DIBSECTION  AVISTREAMINFO
AVICOMPRESSOPTIONS AVISaveOptions
AVISaveOptionsFree AVIMakeCompressedStream
AVIStreamSetFormat 
步骤(3)实时数据读取
现在只能读固定文件:( 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值