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

Delphi控件源码

开发平台:

Delphi

  1. unit main;
  2. interface
  3. uses   
  4.   Windows, Messages, SysUtils, Variants, 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. begin
  51.   FilterGraph.ClearGraph;
  52.   FilterGraph.Active := false;
  53.   Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
  54.   FilterGraph.Active := true;
  55.   with FilterGraph as ICaptureGraphBuilder2 do
  56.     RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
  57.   FilterGraph.Play;
  58. end;
  59. procedure TVideoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  60. begin
  61.   CallBack.Checked := False;
  62.   SysDev.Free;
  63.   FilterGraph.ClearGraph;
  64.   FilterGraph.Active := false;
  65. end;
  66. procedure TVideoForm.SnapShotClick(Sender: TObject);
  67. begin
  68.   SampleGrabber.GetBitmap(Image.Picture.Bitmap);
  69. end;
  70. procedure TVideoForm.SampleGrabberBuffer(sender: TObject;
  71.   SampleTime: Double; pBuffer: Pointer; BufferLen: Integer);
  72. begin
  73.   if CallBack.Checked then
  74.   begin
  75.     Image.Canvas.Lock;
  76.     try
  77.       SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen);
  78.     finally
  79.       Image.Canvas.Unlock;
  80.     end;
  81.   end;
  82. end;
  83. end.