djlittle2002
asked on
Capture video, interval images from a webcam (USB)
Hi, i am trying to create a delphi 7 project which can capture an image from a webcam at intervals and save them on the local hard drive. As BMP/JPG files. how do i go about starting this without paying for delphi plug-ins/components?
Thanks, Dave.
Thanks, Dave.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Prodigy IS DSPack :-)
ASKER
can anyone post a simple example script that i caould use/adapt please?
Thanks
Thanks
Below is the source for a demo app which comes with DSPack called VideoCap.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DSPack, DSUtil, DirectShow9, ComCtrls, ExtCtrls;
type
TMainForm = class(TForm)
CaptureGraph: TFilterGraph;
VideoWindow: TVideoWindow;
VideoCapFilters: TListBox;
VideoSourceFilter: TFilter;
StartButton: TButton;
CapFileButton: TButton;
SaveDialog: TSaveDialog;
OutPutFileName: TLabel;
StatusBar: TStatusBar;
Timer: TTimer;
StopButton: TButton;
AudioCapFilters: TListBox;
AudioSourceFilter: TFilter;
Label1: TLabel;
Label2: TLabel;
VideoFormats: TListBox;
AudioFormats: TListBox;
Label3: TLabel;
Label4: TLabel;
InputLines: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure VideoCapFiltersClick(Sende r: TObject);
procedure StartButtonClick(Sender: TObject);
procedure CapFileButtonClick(Sender: TObject);
procedure StopButtonClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure AudioCapFiltersClick(Sende r: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
CapEnum: TSysDevEnum;
VideoMediaTypes, AudioMediaTypes: TEnumMediaType;
CapFile: WideString = 'c:\capture.avi';
implementation
{$R *.dfm}
{ TMainForm }
procedure TMainForm.FormCreate(Sende r: TObject);
var i: integer;
begin
CapEnum := TSysDevEnum.Create(CLSID_V ideoInputD eviceCateg ory);
for i := 0 to CapEnum.CountFilters - 1 do
VideoCapFilters.Items.Add( CapEnum.Fi lters[i].F riendlyNam e);
CapEnum.SelectGUIDCategory (CLSID_Aud ioInputDev iceCategor y);
for i := 0 to CapEnum.CountFilters - 1 do
AudioCapFilters.Items.Add( CapEnum.Fi lters[i].F riendlyNam e);
VideoMediaTypes := TEnumMediaType.Create;
AudioMediaTypes := TEnumMediaType.Create;
end;
procedure TMainForm.FormDestroy(Send er: TObject);
begin
CapEnum.Free;
VideoMediaTypes.Free;
AudioMediaTypes.Free;
end;
// Select the video Source
procedure TMainForm.VideoCapFiltersC lick(Sende r: TObject);
var
PinList: TPinList;
i: integer;
begin
CapEnum.SelectGUIDCategory (CLSID_Vid eoInputDev iceCategor y);
if VideoCapFilters.ItemIndex <> -1 then
begin
VideoSourceFilter.BaseFilt er.Moniker := CapEnum.GetMoniker(VideoCa pFilters.I temIndex);
VideoSourceFilter.FilterGr aph := CaptureGraph;
CaptureGraph.Active := true;
PinList := TPinList.Create(VideoSourc eFilter as IBaseFilter);
VideoFormats.Clear;
VideoMediaTypes.Assign(Pin List.First );
for i := 0 to VideoMediaTypes.Count - 1 do
VideoFormats.Items.Add(Vid eoMediaTyp es.MediaDe scription[ i]);
CaptureGraph.Active := false;
PinList.Free;
StartButton.Enabled := true;
end;
end;
// Select the audio Source
procedure TMainForm.AudioCapFiltersC lick(Sende r: TObject);
var
PinList: TPinList;
i, LineIndex: integer;
ABool: LongBool;
begin
CapEnum.SelectGUIDCategory (CLSID_Aud ioInputDev iceCategor y);
if AudioCapFilters.ItemIndex <> -1 then
begin
AudioSourceFilter.BaseFilt er.Moniker := CapEnum.GetMoniker(AudioCa pFilters.I temIndex);
AudioSourceFilter.FilterGr aph := CaptureGraph;
CaptureGraph.Active := true;
PinList := TPinList.Create(AudioSourc eFilter as IBaseFilter);
AudioFormats.Clear;
i := 0;
while i < PinList.Count do
if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
begin
AudioMediaTypes.Assign(Pin List.Items [i]);
PinList.Delete(i);
end else inc(i);
for i := 0 to AudioMediaTypes.Count - 1 do
begin
AudioFormats.Items.Add(Aud ioMediaTyp es.MediaDe scription[ i]);
end;
CaptureGraph.Active := false;
InputLines.Clear;
LineIndex := -1;
for i := 0 to PinList.Count - 1 do
begin
InputLines.Items.Add(PinLi st.PinInfo [i].achNam e);
with (PinList.Items[i] as IAMAudioInputMixer) do get_Enable(ABool);
if ABool then LineIndex := i;
end;
InputLines.ItemIndex := LineIndex;
PinList.Free;
StartButton.Enabled := true;
end;
end;
// Start Capture
procedure TMainForm.StartButtonClick (Sender: TObject);
var
multiplexer: IBaseFilter;
Writer: IFileSinkFilter;
PinList: TPinList;
i: integer;
begin
// Activate the filter graph, at this stage the source filters are added to the graph
CaptureGraph.Active := true;
// configure output Audio media type + source
if AudioSourceFilter.FilterGr aph <> nil then
begin
PinList := TPinList.Create(AudioSourc eFilter as IBaseFilter);
i := 0;
while i < PinList.Count do
if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
begin
if AudioFormats.ItemIndex <> -1 then
with (PinList.Items[i] as IAMStreamConfig) do
SetFormat(AudioMediaTypes. Items[Audi oFormats.I temIndex]. AMMediaTyp e^);
PinList.Delete(i);
end else inc(i);
if InputLines.ItemIndex <> -1 then
with (PinList.Items[InputLines. ItemIndex] as IAMAudioInputMixer) do
put_Enable(true);
PinList.Free;
end;
// configure output Video media type
if VideoSourceFilter.FilterGr aph <> nil then
begin
PinList := TPinList.Create(VideoSourc eFilter as IBaseFilter);
if VideoFormats.ItemIndex <> -1 then
with (PinList.First as IAMStreamConfig) do
SetFormat(VideoMediaTypes. Items[Vide oFormats.I temIndex]. AMMediaTyp e^);
PinList.Free;
end;
// now render streams
with CaptureGraph as IcaptureGraphBuilder2 do
begin
// set the output filename
SetOutputFileName(MEDIASUB TYPE_Avi, PWideChar(CapFile), multiplexer, Writer);
// Connect Video preview (VideoWindow)
if VideoSourceFilter.BaseFilt er.DataLen gth > 0 then
RenderStream(@PIN_CATEGORY _PREVIEW, nil, VideoSourceFilter as IBaseFilter,
nil , VideoWindow as IBaseFilter);
// Connect Video capture streams
if VideoSourceFilter.FilterGr aph <> nil then
RenderStream(@PIN_CATEGORY _CAPTURE, nil, VideoSourceFilter as IBaseFilter,
nil, multiplexer as IBaseFilter);
// Connect Audio capture streams
if AudioSourceFilter.FilterGr aph <> nil then
begin
RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,
nil, multiplexer as IBaseFilter);
end;
end;
CaptureGraph.Play;
StopButton.Enabled := true;
StartButton.Enabled := false;
AudioFormats.Enabled := false;
AudioCapFilters.Enabled := false;
VideoFormats.Enabled := false;
VideoCapFilters.Enabled := false;
Timer.Enabled := true;
end;
// Select the Ouput file
procedure TMainForm.CapFileButtonCli ck(Sender: TObject);
begin
if SaveDialog.Execute then
begin
CapFile := SaveDialog.FileName;
OutPutFileName.Caption := 'c:\capture.avi';
end;
end;
// Stop Capture
procedure TMainForm.StopButtonClick( Sender: TObject);
begin
Timer.Enabled := false;
StopButton.Enabled := false;
StartButton.Enabled := true;
CaptureGraph.Stop;
CaptureGraph.Active := False;
AudioFormats.Enabled := true;
AudioCapFilters.Enabled := true;
VideoFormats.Enabled := true;
VideoCapFilters.Enabled := true;
end;
// Timer
procedure TMainForm.TimerTimer(Sende r: TObject);
var
position: int64;
Hour, Min, Sec, MSec: Word;
const MiliSecInOneDay = 86400000;
begin
if CaptureGraph.Active then
begin
with CaptureGraph as IMediaSeeking do
GetCurrentPosition(positio n);
DecodeTime(position div 10000 / MiliSecInOneDay, Hour, Min, Sec, MSec);
StatusBar.SimpleText := Format('%d:%d:%d:%d',[Hour , Min, Sec, MSec]);
end;
end;
end.
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DSPack, DSUtil, DirectShow9, ComCtrls, ExtCtrls;
type
TMainForm = class(TForm)
CaptureGraph: TFilterGraph;
VideoWindow: TVideoWindow;
VideoCapFilters: TListBox;
VideoSourceFilter: TFilter;
StartButton: TButton;
CapFileButton: TButton;
SaveDialog: TSaveDialog;
OutPutFileName: TLabel;
StatusBar: TStatusBar;
Timer: TTimer;
StopButton: TButton;
AudioCapFilters: TListBox;
AudioSourceFilter: TFilter;
Label1: TLabel;
Label2: TLabel;
VideoFormats: TListBox;
AudioFormats: TListBox;
Label3: TLabel;
Label4: TLabel;
InputLines: TComboBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure VideoCapFiltersClick(Sende
procedure StartButtonClick(Sender: TObject);
procedure CapFileButtonClick(Sender:
procedure StopButtonClick(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure AudioCapFiltersClick(Sende
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
CapEnum: TSysDevEnum;
VideoMediaTypes, AudioMediaTypes: TEnumMediaType;
CapFile: WideString = 'c:\capture.avi';
implementation
{$R *.dfm}
{ TMainForm }
procedure TMainForm.FormCreate(Sende
var i: integer;
begin
CapEnum := TSysDevEnum.Create(CLSID_V
for i := 0 to CapEnum.CountFilters - 1 do
VideoCapFilters.Items.Add(
CapEnum.SelectGUIDCategory
for i := 0 to CapEnum.CountFilters - 1 do
AudioCapFilters.Items.Add(
VideoMediaTypes := TEnumMediaType.Create;
AudioMediaTypes := TEnumMediaType.Create;
end;
procedure TMainForm.FormDestroy(Send
begin
CapEnum.Free;
VideoMediaTypes.Free;
AudioMediaTypes.Free;
end;
// Select the video Source
procedure TMainForm.VideoCapFiltersC
var
PinList: TPinList;
i: integer;
begin
CapEnum.SelectGUIDCategory
if VideoCapFilters.ItemIndex <> -1 then
begin
VideoSourceFilter.BaseFilt
VideoSourceFilter.FilterGr
CaptureGraph.Active := true;
PinList := TPinList.Create(VideoSourc
VideoFormats.Clear;
VideoMediaTypes.Assign(Pin
for i := 0 to VideoMediaTypes.Count - 1 do
VideoFormats.Items.Add(Vid
CaptureGraph.Active := false;
PinList.Free;
StartButton.Enabled := true;
end;
end;
// Select the audio Source
procedure TMainForm.AudioCapFiltersC
var
PinList: TPinList;
i, LineIndex: integer;
ABool: LongBool;
begin
CapEnum.SelectGUIDCategory
if AudioCapFilters.ItemIndex <> -1 then
begin
AudioSourceFilter.BaseFilt
AudioSourceFilter.FilterGr
CaptureGraph.Active := true;
PinList := TPinList.Create(AudioSourc
AudioFormats.Clear;
i := 0;
while i < PinList.Count do
if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
begin
AudioMediaTypes.Assign(Pin
PinList.Delete(i);
end else inc(i);
for i := 0 to AudioMediaTypes.Count - 1 do
begin
AudioFormats.Items.Add(Aud
end;
CaptureGraph.Active := false;
InputLines.Clear;
LineIndex := -1;
for i := 0 to PinList.Count - 1 do
begin
InputLines.Items.Add(PinLi
with (PinList.Items[i] as IAMAudioInputMixer) do get_Enable(ABool);
if ABool then LineIndex := i;
end;
InputLines.ItemIndex := LineIndex;
PinList.Free;
StartButton.Enabled := true;
end;
end;
// Start Capture
procedure TMainForm.StartButtonClick
var
multiplexer: IBaseFilter;
Writer: IFileSinkFilter;
PinList: TPinList;
i: integer;
begin
// Activate the filter graph, at this stage the source filters are added to the graph
CaptureGraph.Active := true;
// configure output Audio media type + source
if AudioSourceFilter.FilterGr
begin
PinList := TPinList.Create(AudioSourc
i := 0;
while i < PinList.Count do
if PinList.PinInfo[i].dir = PINDIR_OUTPUT then
begin
if AudioFormats.ItemIndex <> -1 then
with (PinList.Items[i] as IAMStreamConfig) do
SetFormat(AudioMediaTypes.
PinList.Delete(i);
end else inc(i);
if InputLines.ItemIndex <> -1 then
with (PinList.Items[InputLines.
put_Enable(true);
PinList.Free;
end;
// configure output Video media type
if VideoSourceFilter.FilterGr
begin
PinList := TPinList.Create(VideoSourc
if VideoFormats.ItemIndex <> -1 then
with (PinList.First as IAMStreamConfig) do
SetFormat(VideoMediaTypes.
PinList.Free;
end;
// now render streams
with CaptureGraph as IcaptureGraphBuilder2 do
begin
// set the output filename
SetOutputFileName(MEDIASUB
// Connect Video preview (VideoWindow)
if VideoSourceFilter.BaseFilt
RenderStream(@PIN_CATEGORY
nil , VideoWindow as IBaseFilter);
// Connect Video capture streams
if VideoSourceFilter.FilterGr
RenderStream(@PIN_CATEGORY
nil, multiplexer as IBaseFilter);
// Connect Audio capture streams
if AudioSourceFilter.FilterGr
begin
RenderStream(nil, nil, AudioSourceFilter as IBaseFilter,
nil, multiplexer as IBaseFilter);
end;
end;
CaptureGraph.Play;
StopButton.Enabled := true;
StartButton.Enabled := false;
AudioFormats.Enabled := false;
AudioCapFilters.Enabled := false;
VideoFormats.Enabled := false;
VideoCapFilters.Enabled := false;
Timer.Enabled := true;
end;
// Select the Ouput file
procedure TMainForm.CapFileButtonCli
begin
if SaveDialog.Execute then
begin
CapFile := SaveDialog.FileName;
OutPutFileName.Caption := 'c:\capture.avi';
end;
end;
// Stop Capture
procedure TMainForm.StopButtonClick(
begin
Timer.Enabled := false;
StopButton.Enabled := false;
StartButton.Enabled := true;
CaptureGraph.Stop;
CaptureGraph.Active := False;
AudioFormats.Enabled := true;
AudioCapFilters.Enabled := true;
VideoFormats.Enabled := true;
VideoCapFilters.Enabled := true;
end;
// Timer
procedure TMainForm.TimerTimer(Sende
var
position: int64;
Hour, Min, Sec, MSec: Word;
const MiliSecInOneDay = 86400000;
begin
if CaptureGraph.Active then
begin
with CaptureGraph as IMediaSeeking do
GetCurrentPosition(positio
DecodeTime(position div 10000 / MiliSecInOneDay, Hour, Min, Sec, MSec);
StatusBar.SimpleText := Format('%d:%d:%d:%d',[Hour
end;
end;
end.