DelphiでDSPackを使ったWebカメラ動画撮影アプリの実装|USBカメラからWMV形式で保存する方法
DelphiでDSPackを使い、USB接続のWebカメラから動画を撮影してWMV形式で保存するアプリケーションを作成する方法を紹介します。
TFilterGraph、TFilter、TASFWriter、TVideoWindowなどのDirectShowコンポーネントを使用し、ICaptureGraphBuilder2を介してプレビュー表示と録画処理を構成。
撮影ボタンで録画を開始し、停止ボタンで保存処理を完了する一連の流れを、サンプルコード付きで解説しています。
VCLアプリケーションとして構築可能で、USBカメラを使った簡易録画ツールのベースになります。
DelphiにDSPackをインストールしていることが前提
DSPackのインストールはhttps://mam-mam.net/delphi/dspack_install.html
を参照してください。
新規アプリケーションの準備
Delphiを起動し
「ファイル」→「新規作成「→「VCLフォームアプリケーション - Delphi」を選択します。
以下のようにフォームに配置します。
TVideoWindow(名前はデフォルトのままのVideoWindow1)をドラッグ&ドロップでフォーム上に配置しします。
TFilterGraph(名前はデフォルトのままのFilterGraph1)、TFilter(名前はデフォルトのままのFilter1)、
TASFWriter(名前はデフォルトのままASFWriter1)をドラッグ&ドロップします。
TSaveDialog(名前はデフォルトのままのSaviDialog1、DefaultExtプロパティをwmvに、
Filterプロパティを wmv|*.wmv にします)、
TButton(名前はデフォルトのままのButton1、Captionを「撮影」にするとよいでしょう)、
もう1つTButton(名前はデフォルトのButton2、EnabledプロパティをFalseに、Captionを「停止」にするとよいでしょう。)を
ドラッグ&ドロップで配置します。
ソースコードの記述1
F12キー、または下部にあるタブ「コード」を選択してデザインモードからコードモードに切り替えます。
ソースコードの上部5行目あたりにあるuses部分を以下のようにします。
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, DSPack , DXSUtil, DirectShow9;
ソースコードの記述2
F12キー、または下部にあるタブ「デザイン」を選択し、Button1(撮影)をダブルクリックして以下のソースを入力します。
procedure TForm1.Button1Click(Sender: TObject); var ICapB:ICaptureGraphBuilder2; VideoDevices:TSysDevEnum; begin VideoDevices:=TSysDevEnum.Create(CLSID_VideoInputDeviceCategory); if VideoDevices.CountFilters=0 then begin showmessage('有効なUSBカメラがありません'); VideoDevices.Free; exit; end; if not SaveDialog1.Execute then exit; Filter1.FilterGraph:=FilterGraph1; Filter1.BaseFilter.Moniker:=VideoDevices.GetMoniker(0); VideoWindow1.FilterGraph:=FilterGraph1; ASFWriter1.FilterGraph:=FilterGraph1; ASFWriter1.FileName:=SaveDialog1.FileName; ASFWriter1.Profile:=wmp_V80_288VideoOnly; FilterGraph1.Mode:=gmCapture; FilterGraph1.Active:=True; ICapB:=FilterGraph1 as ICaptureGraphBuilder2; ICapB.RenderStream(@PIN_CATEGORY_PREVIEW,nil,Filter1 as IBaseFilter, nil,VideoWindow1 as IBaseFilter); ICapB.RenderStream(@PIN_CATEGORY_CAPTURE,nil,Filter1 as IBaseFilter, nil,ASFWriter1 as IBaseFilter); FilterGraph1.Play; Button1.Enabled:=False; Button2.Enabled:=True; VideoDevices.Free; end;
ソースコードの記述3
F12キー、または下部にあるタブ「デザイン」を選択し、Button2(停止)をダブルクリックして以下のソースを入力します。
procedure TForm1.Button2Click(Sender: TObject);
begin
if FilterGraph1.Active then
begin
FilterGraph1.Stop;
FilterGraph1.Active:=False;
FilterGraph1.ClearGraph;
showmessage('停止しました。');
Button1.Enabled:=True;
Button2.Enabled:=False;
end;
end;
USBカメラを接続して実行する
念のため「すべて保存」なり、SHIFT+Ctrl+Sを押すなりして保存しましょう。(しなくても動きますが)
そろそろ実行しますので、USBカメラをパソコンに取り付けましょう。
取り付けたら、実行ボタンを押して実行します。
「撮影」ボタンを押すと、保存ファイル名を聞いてきますので、デスクトップ等に適当なファイル名を入れて「保存」ボタンを押します。
「停止」ボタンを押すと停止します。動画ファイルがWMV形式で保存されます。
短いソースコードで動画撮影アプリケーションが完成しました。
