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为单声道或立体声