main.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:3k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit main;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  5.   Dialogs, DSUtil, StdCtrls, DSPack, DirectShow9, Menus, ExtCtrls;
  6. type
  7.   TVideoForm = class(TForm)
  8.     FilterGraph: TFilterGraph;
  9.     VideoWindow: TVideoWindow;
  10.     MainMenu1: TMainMenu;
  11.     Devices: TMenuItem;
  12.     Filter: TFilter;
  13.     Image: TImage;
  14.     SampleGrabber: TSampleGrabber;
  15.     SnapShot: TButton;
  16.     CallBack: TCheckBox;
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  19.     procedure SnapShotClick(Sender: TObject);
  20.     procedure SampleGrabberBuffer(sender: TObject; SampleTime: Double;
  21.       pBuffer: Pointer; BufferLen: Integer);
  22.   private
  23.     { D閏larations priv閑s }
  24.   public
  25.     { D閏larations publiques }
  26.     procedure OnSelectDevice(sender: TObject);
  27.   end;
  28. var
  29.   VideoForm: TVideoForm;
  30.   SysDev: TSysDevEnum;
  31. implementation
  32. {$R *.dfm}
  33. procedure TVideoForm.FormCreate(Sender: TObject);
  34. var
  35.   i: integer;
  36.   Device: TMenuItem;
  37. begin
  38.   SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
  39.   if SysDev.CountFilters > 0 then
  40.     for i := 0 to SysDev.CountFilters - 1 do
  41.     begin
  42.       Device := TMenuItem.Create(Devices);
  43.       Device.Caption := SysDev.Filters[i].FriendlyName;
  44.       Device.Tag := i;
  45.       Device.OnClick := OnSelectDevice;
  46.       Devices.Add(Device);
  47.     end;
  48. end;
  49. procedure TVideoForm.OnSelectDevice(sender: TObject);
  50. var
  51.   CaptureGraph: ICaptureGraphBuilder2;
  52.   SourceFilter, SampleFilter, DestFilter: IBaseFilter;
  53. begin
  54.   FilterGraph.ClearGraph;
  55.   FilterGraph.Active := false;
  56.   Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
  57.   FilterGraph.Active := true;
  58.   FilterGraph.QueryInterface(ICaptureGraphBuilder2, CaptureGraph);
  59.   Filter.QueryInterface(IBaseFilter, SourceFilter);
  60.   SampleGrabber.QueryInterface(IBaseFilter, SampleFilter);
  61.   VideoWindow.QueryInterface(IBaseFilter, DestFilter);
  62.   CaptureGraph.RenderStream(nil, nil, SourceFilter, SampleFilter, DestFilter);
  63.   FilterGraph.Play;
  64.   CaptureGraph := nil;
  65.   SourceFilter := nil;
  66.   SampleFilter := nil;
  67.   DestFilter   := nil;
  68. end;
  69. procedure TVideoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  70. begin
  71.   CallBack.Checked := False;
  72.   SysDev.Free;
  73.   FilterGraph.ClearGraph;
  74.   FilterGraph.Active := false;
  75. end;
  76. procedure TVideoForm.SnapShotClick(Sender: TObject);
  77. begin
  78.   SampleGrabber.GetBitmap(Image.Picture.Bitmap);
  79. end;
  80. procedure TVideoForm.SampleGrabberBuffer(sender: TObject;
  81.   SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
  82. begin
  83.   if CallBack.Checked then
  84.   begin
  85.     Image.Canvas.Lock;
  86.     try
  87.       SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen);
  88.     finally
  89.       Image.Canvas.Unlock;
  90.     end;
  91.   end;
  92. end;
  93. end.