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.