Delphi で クラウド対応ネットワークカメラ を使ってみました。
外出先から家の中のペットとか、子供の様子を 「ほぼ」 リアルタイムで見ることができる・・・というアレです。
いろいろな有名メーカーから出ていますが、テスト用に KDLinX (協立電機株式会社様)の一番安価な製品を使ってみました。
固定 IP にすると、普通の IP カメラとして使用できます。この場合は、「ほぼ」 ではなく 「かなり」 リアルタイムです。
■クラウドで使う
Android タブレット(Nexus7 2013) からもOKでした。
iPad / iPhone からは、画像の表示の仕方が違うようで、画像が途切れることがありました。
■IP カメラとして使う
ブラウザで IP アドレスを開くと、リアルタイムで画像が表示されます。
IE の場合は、ActiveX が必要ですが、インストールされていない場合は、ワンクリックでインストールされます。
IE の場合、起動時にエラーが出ます。Google Chrome だと安定しています。
■Delphi で IP カメラを使う
ActiveX をインストールすると、レジストリに DVM IPCam2 ActiveX Control module (IPCam902.ocx) が登録されます。
ActiveX なので、 Delphi でも使えます。
一応、表示は出来ましたが、Delphi から普通に(デバッグを使って)実行すると、終了時にエラーが発生します。
デバッグを使わずに実行すると、特に問題は無いようですが、よく分かりません...。(^^;
スナップショット、録画、写真、メール送信、FTPアップロード、スケジュール、外部入力、動態検知...など、すべての機能を、
OCX からも使えるようです。根気があれば・・・。(^^;
OCXの標準機能でスナップショットを保存
※ダイアログを出さずに保存する方法が分からないので、下のサンプルコードでは、画面キャプチャを使っています。
OCXの標準機能で動画を保存
※今のところ、ダイアログを出さずに保存する方法は、不明です。
unit ipcamUnit; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, DVM_IPCAM2Lib_TLB, Vcl.StdCtrls, Vcl.ExtCtrls, Jpeg; type TForm1 = class(TForm) DVM_IPCam21: TDVM_IPCam2; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button9Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; const R160_120 = 2; R320_240 = 8; R640_480 = 32; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var ret: integer; begin // 接続(IPアドレス, ポート, ユーザー名, パスワード) ret := DVM_IPCam21.MonitorConnect('192.168.0.13', 80, 'wysview', '1234'); //どういう訳か、必要 ShowMessage('カメラを起動します.'); if ret = 0 then begin ret := DVM_IPCam21.MonitorStatus; if ret = 2 then begin // 1台であれば、不要と思う //DVM_IPCam21.SetFocus(1); DVM_IPCam21.Resolution := R640_480; DVM_IPCam21.PlayVideo; end else ShowMessage('MonitorStatus = ' + ret.ToString); end else // IP 間違い = -11, // パスワード間違いは検出できない ShowMessage('MonitorConnect = ' + ret.ToString); end; procedure TForm1.Button2Click(Sender: TObject); begin // 切断処理 DVM_IPCam21.StopVideo; DVM_IPCam21.MonitorDisconnect; end; procedure TForm1.Button3Click(Sender: TObject); begin // スナップショットを保存 // ファイル保存ダイアログが表示される // 拡張子は、.jpg のみ DVM_IPCam21.Photo; end; procedure TForm1.Button4Click(Sender: TObject); begin // 録画開始 // ファイル保存ダイアログが表示される // 拡張子は、.avi のみ DVM_IPCam21.StartRecord; end; procedure TForm1.Button5Click(Sender: TObject); begin // 録画停止 DVM_IPCam21.StopRecord; end; //**************************************** //画面の指定位置をBitmapに変換 //**************************************** procedure CaptureToBmp(Lf, Tp, W, H: Integer; bmp: TBitmap); const CAPTUREBLT = $40000000; var hdcScreen : HDC; begin bmp.Width := W; bmp.Height := H; hdcScreen := CreateDC('DISPLAY', nil, nil, nil); try BitBlt( bmp.Canvas.Handle, 0, 0, W, H, hdcScreen, Lf, Tp, SRCCOPY or CAPTUREBLT); finally DeleteDC(hdcScreen); end; end; procedure TForm1.Button9Click(Sender: TObject); const CAPTUREBLT = $40000000; var ARect : TRect; bmp : TBitmap; jpg : TJpegImage; begin // 画面キャプチャで、スナップショットを撮る // ウィンドウのサイズと位置を取得 GetWindowRect(DVM_IPCam21.Handle, ARect); bmp := TBitmap.Create; try jpg :=TJpegImage.Create; try bmp.PixelFormat := pf32bit; bmp.Width := ARect.Right - ARect.Left; bmp.Height := ARect.Bottom - ARect.Top; // キャプチャー CaptureToBmp(ARect.Left, ARect.Top, bmp.Width, bmp.Height, bmp); // Jpeg 変換 jpg.Assign(bmp); // Jpeg 保存 // 400x300ピクセル で 32.0KB jpg.SaveToFile('D:\Test.jpg'); finally jpg.Free; end; finally bmp.Free; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin ShowMessage('終了します.'); end; end.