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.