用Delphi编写视频捕捉程序

Author: Bold Date: 2001年 7期

?牐牭蔽颐窃谛郎兔烂畹亩保遣皇窍M芙厝∑渲凶约合不兜囊环婺兀克淙环椒ㄓ卸嘀郑杂谖颐潜喑贪谜呃此担比皇窍胪ü约罕嘈吹某绦蚶赐瓿桑揖陀肈elphi编写了这样一个程序,希望与大家分享。
  ?牐犑紫龋诖疤逯蟹湃隩MediaPlayer组件、TMainMenu组件,TOpenDialog组件和TButton组件各一个,并调整好各组件位置。
  ?牐犖思釉孛教逦募枰谥鞑说ド辖?立一个Open选项,当用户打开并加载一个新的文件时,调用事件处理器,它决定将在什么位置播放该视频文件,并启动媒体播放器组件。为了确定打开哪个文件,需要用到OpenDialog组件。当在OpenDialog组件中执行execute方法时,它显示标准的打开对话框,并返回一个布尔值,表示用户已经选择了“OK”还是“Cancel”。如用户选取了一个有效文件,那么设置MediaPlayer上的FileName属性,使其等于OpenDialog的FileName属性,代码如下:
  ?牐燤ediaplayer.filename:=opendialog1.filename;??
  ?牐牻酉吕矗ü饔肙pen方法来打开并启动媒体播放器:
  ?牐燤ediaPlayer1.open;??
  ?牐犠急冈诵惺悠导艏淖詈笠徊绞侵付ㄔ贔orm1上要运行的图形及画面应该显示的区域。这是必要的,因为这样才会知道在什么位置捕捉图像。代码如下:
  ?牐燤ediaplayer1.display:=form1;??
  ?牐燤ediaplayer1.displayrect:=rect(10,10,200,200)?牔?
  ?牐犎缓蠼玊Button组件的caption属性改为“Capture”,这个按钮用来获取当前画面,并将其拷贝到内存中的一个位图中。但是把位图存储到什么位置呢?我们可以在TForm类说明的Private添加位图。虽然主窗体中引用了这个位图,但加载窗体时,仍需要调用create方法和定位图的尺寸。类似地,在关闭窗体时,通过删除这个位图来完成清理工作。捕捉的图像的显示是这样来完成的:将PaintBox组件放置于窗体上,每当调用OnPaint事件时,使用这个窗体的OnPaint事件将位图拷贝到PaintBox中,代码如下:
  ?牐爌rocedure TForm1.PaintBox1Paint(Sender: TObject);?牔?
  ?牐燽egin
  ?牐爌aintbox1.Canvas.copyrect(rect(0,0,200,200);imgbitmap.canvas,rect(0,0,200,200));?牐牐牐爀nd??
  ?牐犝龀绦虻耐暾肴缦拢?
  ?牐爑nit capture1;??
  ?牐爄nterface
  ?牐爑ses
  ?牐燱indows, Messages,SysUtils,Classes,Graphics,Controls,Forms, Dialogs,
  ?牐燤enus, MPlayer, ExtCtrls, StdCtrls;??
  ?牐爐ype
  ?牐燭Form1 = class(TForm)??
  ?牐燘utton1:TButton;??
  ?牐燩aintBox1:TPaintBox;??
  ?牐燤ediaPlayer1: TMediaPlayer;??
  ?牐燨penDialog1: TOpenDialog;??
  ?牐燤ainMenu1:TMainMenu;??
  ?牐燜ile1:TMenuItem;??
  ?牐燨pen1:TMenuItem;??
  ?牐燦1:TMenuItem;??
  ?牐爌rocedure Open1Click(Sender: TObject);?牔?
  ?牐爌rocedure Button1Click(Sender: TObject);?牔?
  ?牐爌rocedure FormPain(Sender: TObject);?牐牔?
  ?牐爌rocedure FormCreate(Sender: TObject);??
  ?牐爌rocedure FormClose(Sender:TObject;var Action:TCloseAction);?牔?
  ?牐爌rocedure PaintBox1Paint(Sender: TObject);??
  ?牐爌rocedure Exit1Click(Sender: TObject);?牔?
  ?牐爌rivate
  ?牐爄mgbitmap:tbitmap;??
  ?牐爗Private declarations}??
  ?牐爌ublic
  ?牐爗Private declarations} ??
  ?牐爀nd;??
  ?牐爒ar
  ?牐燜orm1:TForm1;??
  ?牐爄mplementation
  ?牐爗$R *.DFM}??
  ?牐爌rocedure TForm1.Open1Click(Sender: TObject);?牔?
  ?牐燽egin
  ?牐爄f opendialog1.execute then
  ?牐燽egin
  ?牐爉ediaplayer1.filename:=opendialog1.filename;??
  ?牐爉ediaplayer1.open;??
  ?牐爉ediaplayer1.display:=form1;??
  ?牐爉ediaplayer1.displayrect;=rect(10,10,200,200);?牔?
  ?牐爀nd;??
  ?牐爀nd;??
  ?牐爌rocedure TForm1.Button1Click(Sender: TObject);??
  ?牐燽egin
  ?牐爄mgbitmap.canvas.copyrect(rect(0,0,200,200),form1.canvas,rect(10,10,210,210));?牐牐牐爌aintbox1.invalidate;??
  ?牐爀nd;??
  ?牐爌rocedure TForm1.FormPaint(Sender: TObject);?牔?
  ?牐燽egin
  ?牐燾anvas.FrameRect(rect(8,8,212,212))?牐?
  ?牐爀nd;??
  ?牐爌rocedure TForm1.FormCreate(Sender: TObject);?牔?
  ?牐燽egin
  ?牐爄mgbitmap:=tbitmap.create;??
  ?牐爄mgbitmap.height:=200;??
  ?牐爄mgbitmap.width:=200;??
  ?牐爄mgbitmap.canvas.rectangle(0,0,200,200)??
  ?牐爀nd;??
  ?牐爌rocedure TForm1.FormClose(Sender:TObject;var Action:TCloseAction);?牐牔?
  ?牐燽egin
  ?牐爄mgbitmap.free;??
  ?牐爀nd;??
  ?牐爌rocedure TForm1.PaintBox1Paint(Sender: TObject);?牔?
  ?牐燽egin
  ?牐爌aintbox1.Canvas.copyrect(rect(0,0,200,200),imgbitmap.canvas,rect(0,0,200,200));?牐牐牐爀nd;??
  ?牐爀nd.