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

Delphi控件源码

开发平台:

Delphi

  1. unit main;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, DSPack, DSUtil, DirectShow9, ComCtrls, ExtCtrls;
  6. type
  7.   TMainForm = class(TForm)
  8.     CaptureGraph: TFilterGraph;
  9.     VideoWindow: TVideoWindow;
  10.     VideoCapFilters: TListBox;
  11.     VideoSourceFilter: TFilter;
  12.     StartButton: TButton;
  13.     CapFileButton: TButton;
  14.     SaveDialog: TSaveDialog;
  15.     OutPutFileName: TLabel;
  16.     StatusBar: TStatusBar;
  17.     Timer: TTimer;
  18.     StopButton: TButton;
  19.     AudioCapFilters: TListBox;
  20.     AudioSourceFilter: TFilter;
  21.     Label1: TLabel;
  22.     Label2: TLabel;
  23.     VideoFormats: TListBox;
  24.     AudioFormats: TListBox;
  25.     Label3: TLabel;
  26.     Label4: TLabel;
  27.     InputLines: TComboBox;
  28.     procedure FormCreate(Sender: TObject);
  29.     procedure FormDestroy(Sender: TObject);
  30.     procedure VideoCapFiltersClick(Sender: TObject);
  31.     procedure StartButtonClick(Sender: TObject);
  32.     procedure CapFileButtonClick(Sender: TObject);
  33.     procedure StopButtonClick(Sender: TObject);
  34.     procedure TimerTimer(Sender: TObject);
  35.     procedure AudioCapFiltersClick(Sender: TObject);
  36.   private
  37.     { Private declarations }
  38.   public
  39.     { Public declarations }
  40.   end;
  41. var
  42.   MainForm: TMainForm;
  43.   CapEnum: TSysDevEnum;
  44.   VideoMediaTypes, AudioMediaTypes: TEnumMediaType;
  45.   CapFile: WideString = 'c:capture.avi';
  46. implementation
  47. {$R *.dfm}
  48. { TMainForm }
  49. procedure TMainForm.FormCreate(Sender: TObject);
  50. var i: integer;
  51. begin
  52.   CapEnum := TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
  53.   for i := 0 to CapEnum.CountFilters - 1 do
  54.     VideoCapFilters.Items.Add(CapEnum.Filters[i].FriendlyName);
  55.   CapEnum.SelectGUIDCategory(CLSID_AudioInputDeviceCategory);
  56.   for i := 0 to CapEnum.CountFilters - 1 do
  57.     AudioCapFilters.Items.Add(CapEnum.Filters[i].FriendlyName);
  58.   VideoMediaTypes := TEnumMediaType.Create;
  59.   AudioMediaTypes := TEnumMediaType.Create;
  60. end;
  61. procedure TMainForm.FormDestroy(Sender: TObject);
  62. begin
  63.   CapEnum.Free;
  64.   VideoMediaTypes.Free;
  65.   AudioMediaTypes.Free;
  66. end;
  67. // Select the video Source
  68. procedure TMainForm.VideoCapFiltersClick(Sender: TObject);
  69. var
  70.   PinList: TPinList;
  71.   i: integer;
  72. begin
  73.   CapEnum.SelectGUIDCategory(CLSID_VideoInputDeviceCategory);
  74.   if VideoCapFilters.ItemIndex <> -1 then
  75.   begin
  76.     VideoSourceFilter.BaseFilter.Moniker := CapEnum.GetMoniker(VideoCapFilters.ItemIndex);
  77.     VideoSourceFilter.FilterGraph := CaptureGraph;
  78.     CaptureGraph.Active := true;
  79.     PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
  80.     VideoFormats.Clear;
  81.     VideoMediaTypes.Assign(PinList.First);
  82.     for i := 0 to VideoMediaTypes.Count - 1 do
  83.       VideoFormats.Items.Add(VideoMediaTypes.MediaDescription[i]);
  84.     CaptureGraph.Active := false;
  85.     PinList.Free;
  86.     StartButton.Enabled := true;
  87.   end;
  88. end;
  89. // Select the audio Source
  90. procedure TMainForm.AudioCapFiltersClick(Sender: TObject);
  91. var
  92.   PinList: TPinList;
  93.   i, LineIndex: integer;
  94.   ABool: LongBool;
  95. begin
  96.   CapEnum.SelectGUIDCategory(CLSID_AudioInputDeviceCategory);
  97.   if AudioCapFilters.ItemIndex <> -1 then
  98.   begin
  99.     AudioSourceFilter.BaseFilter.Moniker := CapEnum.GetMoniker(AudioCapFilters.ItemIndex);
  100.     AudioSourceFilter.FilterGraph := CaptureGraph;
  101.     CaptureGraph.Active := true;
  102.     PinList := TPinList.Create(AudioSourceFilter as IBaseFilter);
  103.     AudioFormats.Clear;
  104.     i := 0;
  105.     while i < PinList.Count do
  106.       if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
  107.         begin
  108.           AudioMediaTypes.Assign(PinList.Items[i]);
  109.           PinList.Delete(i);
  110.         end else inc(i);
  111.     for i := 0 to AudioMediaTypes.Count - 1 do
  112.     begin
  113.       AudioFormats.Items.Add(AudioMediaTypes.MediaDescription[i]);
  114.     end;
  115.     CaptureGraph.Active := false;
  116.     InputLines.Clear;
  117.     LineIndex := -1;
  118.     for i := 0 to PinList.Count - 1 do
  119.     begin
  120.       InputLines.Items.Add(PinList.PinInfo[i].achName);
  121.       with (PinList.Items[i] as IAMAudioInputMixer) do get_Enable(ABool);
  122.       if ABool then LineIndex := i;
  123.     end;
  124.     InputLines.ItemIndex := LineIndex;
  125.     PinList.Free;
  126.     StartButton.Enabled := true;
  127.   end;
  128. end;
  129. // Start Capture
  130. procedure TMainForm.StartButtonClick(Sender: TObject);
  131. var
  132.   multiplexer: IBaseFilter;
  133.   Writer: IFileSinkFilter;
  134.   PinList: TPinList;
  135.   i: integer;
  136. begin
  137.   // Activate the filter graph, at this stage the source filters are added to the graph
  138.   CaptureGraph.Active := true;
  139.   // configure output Audio media type + source
  140.   if AudioSourceFilter.FilterGraph <> nil then
  141.   begin
  142.     PinList := TPinList.Create(AudioSourceFilter as IBaseFilter);
  143.     i := 0;
  144.     while i < PinList.Count do
  145.       if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
  146.         begin
  147.           if AudioFormats.ItemIndex <> -1 then
  148.             with (PinList.Items[i] as IAMStreamConfig) do
  149.               SetFormat(AudioMediaTypes.Items[AudioFormats.ItemIndex].AMMediaType^);
  150.           PinList.Delete(i);
  151.         end else inc(i);
  152.     if InputLines.ItemIndex <> -1 then
  153.       with (PinList.Items[InputLines.ItemIndex] as IAMAudioInputMixer) do
  154.         put_Enable(true);
  155.     PinList.Free;
  156.   end;
  157.   // configure output Video media type
  158.   if VideoSourceFilter.FilterGraph <> nil then
  159.   begin
  160.     PinList := TPinList.Create(VideoSourceFilter as IBaseFilter);
  161.     if VideoFormats.ItemIndex <> -1 then
  162.       with (PinList.First as IAMStreamConfig) do
  163.         SetFormat(VideoMediaTypes.Items[VideoFormats.ItemIndex].AMMediaType^);
  164.     PinList.Free;
  165.   end;
  166.   // now render streams
  167.   with CaptureGraph as IcaptureGraphBuilder2 do
  168.   begin
  169.     // set the output filename
  170.     SetOutputFileName(MEDIASUBTYPE_Avi, PWideChar(CapFile), multiplexer, Writer);
  171.     // Connect Video preview (VideoWindow)
  172.     if VideoSourceFilter.BaseFilter.DataLength > 0 then
  173.       RenderStream(@PIN_CATEGORY_PREVIEW, nil, VideoSourceFilter as IBaseFilter,
  174.         nil , VideoWindow as IBaseFilter);
  175.     // Connect Video capture streams
  176.     if VideoSourceFilter.FilterGraph <> nil then
  177.       RenderStream(@PIN_CATEGORY_CAPTURE, nil, VideoSourceFilter as IBaseFilter,
  178.         nil, multiplexer as IBaseFilter);
  179.     // Connect Audio capture streams
  180.     if AudioSourceFilter.FilterGraph <> nil then
  181.     begin
  182.       RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,
  183.         nil, multiplexer as IBaseFilter);
  184.     end;
  185.   end;
  186.   CaptureGraph.Play;
  187.   StopButton.Enabled := true;
  188.   StartButton.Enabled := false;
  189.   AudioFormats.Enabled := false;
  190.   AudioCapFilters.Enabled := false;
  191.   VideoFormats.Enabled := false;
  192.   VideoCapFilters.Enabled := false;
  193.   Timer.Enabled := true;
  194. end;
  195. // Select the Ouput file
  196. procedure TMainForm.CapFileButtonClick(Sender: TObject);
  197. begin
  198.   if SaveDialog.Execute then
  199.   begin
  200.     CapFile := SaveDialog.FileName;
  201.     OutPutFileName.Caption := 'c:capture.avi';
  202.   end;
  203. end;
  204. // Stop Capture
  205. procedure TMainForm.StopButtonClick(Sender: TObject);
  206. begin
  207.   Timer.Enabled := false;
  208.   StopButton.Enabled := false;
  209.   StartButton.Enabled := true;
  210.   CaptureGraph.Stop;
  211.   CaptureGraph.Active := False;
  212.   AudioFormats.Enabled := true;
  213.   AudioCapFilters.Enabled := true;
  214.   VideoFormats.Enabled := true;
  215.   VideoCapFilters.Enabled := true;
  216. end;
  217. // Timer
  218. procedure TMainForm.TimerTimer(Sender: TObject);
  219. var
  220.   position: int64;
  221.   Hour, Min, Sec, MSec: Word;
  222. const MiliSecInOneDay = 86400000;
  223. begin
  224.   if CaptureGraph.Active then
  225.   begin
  226.     with CaptureGraph as IMediaSeeking do
  227.       GetCurrentPosition(position);
  228.     DecodeTime(position div 10000 / MiliSecInOneDay, Hour, Min, Sec, MSec);
  229.     StatusBar.SimpleText := Format('%d:%d:%d:%d',[Hour, Min, Sec, MSec]);
  230.   end;
  231. end;
  232. end.