AVI创建AVI文件的示例代码解析

  • 格式:doc
  • 大小:91.00 KB
  • 文档页数:14

AVI创建AVI文件的示例代码

(C)2002 卢西恩Wischik。此代码是免费的,任何人都可以用它做为所欲为,包括纳入商业产品。

此代码创建的AVI文件,包括视频和音频。视频可以压缩使用您的计算机上安装过滤器 - 你可以把它弹出一个系统对话框,要求用户过滤使用,或者你能记住这些信息,以避免在未来的对话框,你可以假设无压缩和完全避免的对话框。为压缩音频,我相信这是不可能使用的AVI功能。相反,你必须创建一个非压缩音频的AVI文件,然后压缩它使用像Windows Movie

Maker中的一些外部工具。

包括七个功能,编写的代码(阶级)的C + +和使用用于Windows的视频(已建立到所有版本的Windows)。我用这段代码添加到自己的项目单位(avi_utils.cpp,avi_utils.h)。此网页包含如何使用函数来创建的AVI文件,头文件和源代码的例子。你应该复制代码,粘贴到自己的项目。是普通的Win32代码,并编译下用Borland C + + builder5中和Visual

Studio。NET干净,和其他的编译器应该没有问题。

Borland的编译器通常允许的FPU异常。这可能会导致一个问题,因为一些过滤器(如DivX)提出的FPU异常。因此,Borland用户应使用此代码在某个时刻之前创建的AVI - 我在WinMain的开始。(这是没有必要的Visual C + +,因为默认情况下禁用的例外)。

#包括的

_control87(MCW_EM,MCW_EM); / /改编的FPU,因此它不会引发异常

如何创建AVI文件的例子

要创建一个AVI从一堆文件。下面的代码创建一个5位图AVI(1.bmp,2.bmp,... 5.bmp)和WAV文件(wav.wav)。

常量字符* FNS [] = {“1.bmp”,“2.bmp”,“3.bmp”,“4.bmp”,“5.bmp”};

夏晖AVI = CreateAvi(“test.avi” 1000年,NULL); / / 1000毫秒帧之间的时期

(I = 0;

的HBITMAP HBM =(HBITMAP句柄)的LoadImage(NULL,FNS [I],IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);

AddAviFrame(AVI,HBM);

DeleteObject的(HBM);

} (AVI,“wav.wav”,SND_FILENAME); AddAviWav

CloseAvi(AVI);

要创建与DivX压缩的AVI。此代码创建的相同与DivX视频压缩的AVI,没有音频。代码其实只是表明DivX和弹出一个对话框,让用户控制的更多细节(HWND是一些可以使用该对话框的父窗口)。您可能会保留一份副本OPTS结构,以提供相同的默认用户下一次。或您可以通过虚假的SetAviVideoCompression功能抑制的用户界面“对话框中,如果OPTS结构已经填写正确。

常量字符* FNS [] = {“1.bmp”,“2.bmp”,“3.bmp”,“4.bmp”,“5.bmp”};

夏晖AVI = CreateAvi(“test.avi”,1000,NULL);

(I = 0;

的HBITMAP HBM =(HBITMAP句柄)的LoadImage(NULL,FNS [I],IMAGE_BITMAP,0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);

(我== 0) / /设置压缩前的第一帧

{AVICOMPRESSOPTIONS OPTS;

AddAviFrame(AVI,HBM);

DeleteObject的(HBM);

}

CloseAvi(AVI);

要创建一个动态绘制的图像的AVI文件。此代码显示了如何利用自己的动画,而不是仅仅依靠现有的位图文件为AVI文件。注意:你必须使用DIBSections,而不是正常依赖于设备的位图。

(0)hdcscreen的HDC = GetDC的,HDC = CreateCompatibleDC(hdcscreen); ReleaseDC(0,hdcscreen);

为BITMAPINFO双向; ZeroMemory(&BI,sizeof(BI)的);的BITMAPINFOHEADER和波黑=

bi.bmiHeader;

bih.biSize = sizeof(波黑)的;

bih.biWidth = 200;

bih.biHeight = 200;

bih.biPlanes = 1; bih.biBitCount = 24;

bih.biCompression = BI_RGB;

bih.biSizeImage =((bih.biWidth * bih.biBitCount / 8 +3)的&0xFFFFFFFC)*

bih.biHeight;

bih.biXPelsPerMeter = 10000;

bih.biYPelsPerMeter = 10000;

bih.biClrUsed = 0;

bih.biClrImportant = 0;

的HBITMAP无效*位; HBM = CreateDIBSection(HDC,(BITMAPINFO *)和波黑,DIB_RGB_COLORS,&位,空,空);

/ /

HGDIOBJ holdb = SelectObject的(HDC,HBM);

HPEN马力的CreatePen(PS_SOLID,16,RGB(255255128));

HGDIOBJ holdp = SelectObject的(HDC,马力);

/ /

夏晖AVI = CreateAvi(“test.avi”,100,空);

(帧= 0;帧<50;帧+)

{ / /静态背景

DWORD种子=的GetTickCount();的DWORD * dbits =(DWORD *)位;

(unsigned int类型I = 0;我

[I] =种子;种子+ = 79;}

/ /行

MoveToEx(HDC,0,0,NULL);的LineTo(HDC,帧* 3100);

AddAviFrame(AVI,HBM);

}

CloseAvi(AVI);

/ /

SelectObject的(HDC holdb)的SelectObject的(HDC holdp)的;

DeleteDC(HDC); DeleteObject的(HBM); DeleteObject的(HP);

头文件“avi_utils.h

#IFNDEF _avi_utils_H

#定义_avi_utils_H服务

/ /的AVI事业-创建AVI文件

/ /(C)2002卢西恩Wischik。对使用没有任何限制。

DECLARE_HANDLE(夏晖);

/ /标识夏晖正在创建一个AVI文件

夏晖CreateAvi(常量字符* FN,INT frameperiod一个WAVEFORMATEX * WFX);

/ / CreateAvi -调用此开始创建的AVI文件

/ /这一时期是MS之间的每个位图帧的数量。

/ /的waveformat的可以为null,如果你不会添加任何音频,

/ /或如果你要添加音频文件。

,HRESULT AddAviFrame(夏晖AVI,HBM的HBITMAP);

,HRESULT AddAviAudio(夏晖AVI,无效* DAT,无符号长numbytes);

/ / AddAviFrame -这个位图添加到AVI文件。HBM点必须是一个DIBSection。

/ /这是调用者的责任,以释放HBM。

/ / AddAviAudio的-添加此音频的垃圾。被指定在音频格式

。这将失败,如果为NULL。

/ /两个返回S_OK,如果没事,否则的AVI错误之一。

HRESULT的AddAviWav(夏晖AVI,常量字符* WAV,DWORD标志);

/ / AddAviWav -一个方便的方式来增加整个波形文件到AVI

/ / wav文件可能会在内存中(在这种情况下,标志= SND_MEMORY)

/ /或磁盘上的文件(在这种情况下,标志= SND_FILENAME)

/ /此功能需要,无论是空WAVEFORMATEX传递到CreateAvi的,

/ /或波形文件现在被添加具有相同的格式为

/ /前面添加。

HRESULT的SetAviVideoCompression(AVI夏晖,HBM的HBITMAP,AVICOMPRESSOPTIONS *

OPTS,布尔的ShowDialog,hParent为HWND的);

/ / SetAviVideoCompression的-允许视频压缩。如果需要压缩,

/ /那么这个函数必须被调用之前已被添加任何位图帧

/ /位图HBM必须是一个DIBSection(AVI知道什么格式/大小,你给它),

/ /但实际上不会被加入到电影。

/ /这个函数可以显示一个对话框让用户选择压缩。在这种情况下, / /设置ShowDialog的真实和指定的父窗口。如果OPTS非NULL和其

/ /的dwFlags财产包括AVICOMPRESSF_VALID的,然后OPTS将被用来给初始

/ /值。OPTS是如果非NULL,则选择的选项将被放置在。

/ /这个函数也可以用一个对话框,选择不压缩。在这个

/ /的情况下,ShowDialog的设置为false,hParent为忽略,并指定压缩

在/ /“OPTS'的,而且也没有需要调用GotAviVideoCompression,事后。

HRESULT CloseAvi(夏晖AVI);

/ / CloseAvi - AVI,必须关闭此消息。

unsigned int类型FormatAviMessage(HRESULT,代码的char * buf中,unsigned int类型LEN);

给定/ / FormatAviMessage -一个错误代码,格式字符串

/ /它返回的错误消息的长度。如果BUF / len个百分点

,那么它也写入尽可能到那里。

#ENDIF

源代码“avi_utils.cpp”

#定义严格

#定义WIN32_LEAN_AND_MEAN

#包括楼得分

#包括

包括“avi_utils.h”

/ /首先,我们将定义为WAV文件格式。

#包括

typedef结构

{字符ID [4] / / =“FMT”

无符号长的大小; = 16的

短wFormatTag; / / / / = WAVE_FORMAT_PCM = 1

无符号短wChannels; / / = 1或2为单声道或立体声