<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)实时数据读取
现在只能读固定文件:(
这个设计方案是物光院嵌入式系统试验室的基于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)实时数据读取
现在只能读固定文件:(