スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ライブカメラのキャプチャソフト(その1)

掲載している動画のキャプチャソフトは自作です。
ソースを見たいと某所で書き込みを頂いたので掲載します。

※タイトルに「その1」と有りますが、その2はまだ有りません。

実行時の状態
・メインフォーム(TForm_Main)
TForm_Main

・サブフォーム(TForm_WMPが4つ、下はサムネイルなので実際の画像を見る場合ははクリックしてください)
TForm_WMP 1TForm_WMP 2
TForm_WMP 3TForm_WMP 4

以下追記に続きます

・ソフトの概要
 桜島ライブカメラがWindowsMediaPlayer(以下WMP)でしたので、これをActiveXコントロールとして
取り込んで、一定の間隔でスクリーンショットを撮り1枚の画像にして動画を作成する。
 動画はAVIコンテナで圧縮形式は適当なコーデックを利用できるようにする。
 タイムスタンプもつける。

・フロー
 1:初期化
 2:ファイル(ini)より設定を読み込み、子フォームを作成
 3:アイドルループを利用して1秒毎に静止画を作成、動画に随時変換
 4:終了時に子フォームをリリース、設定などを保存

・開発言語
 Delphi5.0 (既に廃盤・サポート終了してます)

・フリーのコンポーネント・ユニット
 AVIファイルの作成にはAlireza Tadayoni氏のCompressed AVI Read/Write unitsを使用しています。
 (配布時の状態:フリー・ユニット・ソースコード有り)
 既にサイトを閉められているのでDelphi関連のサイトを廻れば再配布サイトがあると思います。
 コンポーネントは標準のものばかりです。



・プログラムソース(LiveCamRec.pas)
 特に変わった事は行っていません。
 メインフォームだけ自動生成で子フォームは生成していません。

program LiveCamRec;

uses
 Forms,
 Unit_FormMain in 'Unit_FormMain.pas' {Form_Main},
 Unit_FormWMP in 'Unit_FormWMP.pas' {Form_WMP};

{$R *.RES}

begin
 Application.Initialize;
 Application.CreateForm(TForm_Main, Form_Main);
 Application.Run;
end.



・メインフォーム(Unit_FormMain)ソースコード
AVICompression, AVIFile32, AVIReading, vfwがAlireza Tadayoni氏のユニットです。
フォームソースは書きませんがコンポーネント名から想像してください。

・フォームのメソッド
 TForm_Main.FormCreate 初期化
  大きく分けて三つの処理
   iniファイルから基本設定を読み込む
   iniファイルの子ウィンドウ情報から作成、WMPの初期値設定
   AVI出力の為の初期化
 TForm_Main.FormDestroy 終了処理
 TForm_Main.FormShow メインフォーム表示時に子フォームを表示
 TForm_Main.ApplicationEvents1Idle アイドルループのイベントハンドラ  
  大きく分けて三つの処理
   前回から1秒経過したのかの判断
   DIBの生成と子ウィンドウのスクリーンショットメソッドの呼び出し
   タイムスタンプの埋め込み

   AVIファイルへの出力
 TForm_Main.GetHandlerList 利用できる圧縮(コーデック)形式の一覧作成
 TForm_Main.DwFourCCtoStr 32bit(DWORD)からFourCC文字列を作成
 他はボタン操作とかのハンドラです。

ソースはここから↓(インデントが全角になっています)
unit Unit_FormMain;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Unit_FormWMP, StdCtrls, Inifiles, ExtCtrls, AppEvnts, Jpeg,
 AVICompression, AVIFile32, AVIReading, vfw, ComCtrls, Math, Spin, FileCtrl;

type
 TForm_Main = class(TForm)
  ApplicationEvents1: TApplicationEvents;
  StatusBar1: TStatusBar;
  GroupBox_FourCC: TGroupBox;
  ComboBox_FourCC: TComboBox;
  GroupBox_FrameRate: TGroupBox;
  SpinEdit_FrameRate: TSpinEdit;
  Label1: TLabel;
  GroupBox_KeyFrameEvery: TGroupBox;
  Label2: TLabel;
  SpinEdit_KeyFrameEvery: TSpinEdit;
  Label3: TLabel;
  GroupBox_Quality: TGroupBox;
  TrackBar_Quality: TTrackBar;
  Label_Quality: TLabel;
  GroupBox_KBytesPerSecond: TGroupBox;
  SpinEdit_KBytesPerSecond: TSpinEdit;
  Label_KBytesPerSecond: TLabel;
  GroupBox_SampleSec: TGroupBox;
  SpinEdit_SampleSec: TSpinEdit;
  Label_SampleSec: TLabel;
  GroupBox_Title: TGroupBox;
  Edit_Title: TEdit;
  Button_Save: TButton;
  Button_Exit: TButton;
  GroupBox_Dir: TGroupBox;
  Edit_Dir: TEdit;
  Button_Dir: TButton;
  SaveDialog_Dir: TSaveDialog;
  Label_Rec: TLabel;
  CheckBox_RecStartOnStart: TCheckBox;
  GroupBox1: TGroupBox;
  Label5: TLabel;
  Label6: TLabel;
  SpinEdit_RecLength: TSpinEdit;
  Button_Rec: TButton;
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure FormShow(Sender: TObject);
  procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
  procedure TrackBar_QualityChange(Sender: TObject);
  procedure SpinEdit_KBytesPerSecondChange(Sender: TObject);
  procedure Button_ExitClick(Sender: TObject);
  procedure Button_SaveClick(Sender: TObject);
  procedure Button_DirClick(Sender: TObject);
  procedure Button_RecClick(Sender: TObject);
 private
  { Private 宣言 }
  FFormWMP : Array of TForm_WMP;
  FSampSec : Integer;
  FTimeStampHeight : Integer;
  FTimeStampFormat : String;
  FBefTime : integer;
  FSaveWidth : integer;
  FSaveHeight : integer;
  FStartTime : TDateTime;
  FRecLen : integer;
  FAVIOk : boolean;
  FAVIFileOptions : TAVIFileOptions;
  FAVICompressor : TAVICompressor;
  FFileDate : integer;
  FFileName : String;
  FFrameCount : integer;
  FDir : String;
  procedure GetHandlerList;
  function DwFourCCtoStr(FourCC : DWORD) : string;
 public
  { Public 宣言 }
 end;

var
 Form_Main: TForm_Main;

implementation

{$R *.DFM}

procedure TForm_Main.FormCreate(Sender: TObject);
var
 MemIniFile : TMemIniFile;
 loop,count,top,left : Integer;
 SectionName : String;
begin
 GetHandlerList;
 MemIniFile := TMemIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
 try
  SectionName := 'Main';
  count := MemIniFile.ReadInteger(SectionName,'WindowCount',0);
  left := MemIniFile.ReadInteger(SectionName,'WindowLeft',-1);
  top := MemIniFile.ReadInteger(SectionName,'WindowTop',-1);
  FSampSec := MemIniFile.ReadInteger(SectionName,'SampleSec',1);
  SpinEdit_SampleSec.Value := FSampSec;
  FRecLen := MemIniFile.ReadInteger(SectionName,'RecLen',SpinEdit_RecLength.Value);
  SpinEdit_RecLength.Value := FRecLen;
  FTimeStampHeight := MemIniFile.ReadInteger(SectionName,'TimeStampHeight',0);
  FTimeStampFormat := MemIniFile.ReadString(SectionName,'TimeStampFormat','yyyy/mm/dd hh:nn:ss');
  FSaveWidth := MemIniFile.ReadInteger(SectionName,'SaveWidth',640);
  FSaveHeight := MemIniFile.ReadInteger(SectionName,'SaveHeight',480);
  CheckBox_RecStartOnStart.Checked := MemIniFile.ReadBool(SectionName,'AutoRecStart',false);
  Button_Rec.Enabled := not CheckBox_RecStartOnStart.Checked;

  Self.Caption := MemIniFile.ReadString(SectionName,'Title','ライブカメラ');
  Edit_Title.Text := Self.Caption;
  FDir := IncludeTrailingBackslash(MemIniFile.ReadString(SectionName,'Dir',GetCurrentDir));
  if (FDir='\') or (not DirectoryExists(FDir)) then FDir := IncludeTrailingBackslash(GetCurrentDir);
  Edit_Dir.Text := FDir;
  SaveDialog_Dir.InitialDir := FDir;
  if (left > 0) and (left < Screen.Width) and (top > 0) and (top < Screen.Height) then
  begin
   Self.Position := poDesigned;
   Self.Left := left;
   Self.Top := Top;
  end
  else Self.Position := poDefaultPosOnly;


  SetLength(FFormWMP,count);
  for loop := 0 to count-1 do
  begin
   if assigned(FFormWMP[loop]) then continue;
   SectionName := 'Window'+IntTostr(loop);
   FFormWMP[loop] := TForm_WMP.Create(Self);
   FFormWMP[loop].Name := 'Rec'+SectionName;
   FFormWMP[loop].WindowsMediaPlayer1.uiMode := 'none';
   FFormWMP[loop].WindowsMediaPlayer1.Left := 0;
   FFormWMP[loop].WindowsMediaPlayer1.Top := 0;
   FFormWMP[loop].WindowsMediaPlayer1.Width := MemIniFile.ReadInteger(SectionName,'Width',320);
   FFormWMP[loop].WindowsMediaPlayer1.Height := MemIniFile.ReadInteger(SectionName,'Height',240);
   FFormWMP[loop].WindowsMediaPlayer1.stretchToFit := true;
   FFormWMP[loop].WindowsMediaPlayer1.URL := MemIniFile.ReadString(SectionName,'URL','');
   FFormWMP[loop].Caption := MemIniFile.ReadString(SectionName,'Title','');
   left := MemIniFile.ReadInteger(SectionName,'WindowLeft',-1);
   top := MemIniFile.ReadInteger(SectionName,'WindowTop',-1);
   if (left > 0) and (left < Screen.Width) and (top > 0) and (top < Screen.Height) then
   begin
    FFormWMP[loop].Position := poDesigned;
    FFormWMP[loop].Left := left;
    FFormWMP[loop].Top := Top;
   end
   else FFormWMP[loop].Position := poDefaultPosOnly;
   FFormWMP[loop].Fx := MemIniFile.ReadInteger(SectionName,'SavePosX',0);
   FFormWMP[loop].Fy := MemIniFile.ReadInteger(SectionName,'SavePosY',0);
   FFormWMP[loop].WindowsMediaPlayer1.controls.play;
  end;

  FAVIFileOptions.Init;
  SectionName := 'Video';
  FAVIFileOptions.Compress := MemIniFile.ReadBool(SectionName,'Compress',true);
  FAVIFileOptions.Handler := MemIniFile.ReadString(SectionName,'FourCC','MPG4');
  ComboBox_FourCC.ItemIndex := 0;
  for loop := 0 to ComboBox_FourCC.Items.Count-1 do
  begin
   if DwFourCCtoStr(DWORD(ComboBox_FourCC.Items.Objects[loop])) = FAVIFileOptions.Handler then
   begin
    ComboBox_FourCC.ItemIndex := loop;
    break;
   end;
  end;
  FAVIFileOptions.Handler := DwFourCCtoStr(DWORD(ComboBox_FourCC.Items.Objects[ComboBox_FourCC.ItemIndex]));
  FAVIFileOptions.ShowDialog := false;
  FAVIFileOptions.FrameRate := MemIniFile.ReadInteger(SectionName,'FrameRate',30);
  SpinEdit_FrameRate.Value := FAVIFileOptions.FrameRate;
  FAVIFileOptions.Width := FSaveWidth;
  FAVIFileOptions.Height := FSaveHeight+FTimeStampHeight;
  FAVIFileOptions.BytesPerSecond := MemIniFile.ReadInteger(SectionName,'KBytesPerSecond',100)*1024;
  SpinEdit_KBytesPerSecond.Value := FAVIFileOptions.BytesPerSecond div 1024;
  FAVIFileOptions.Quality := MemIniFile.ReadInteger(SectionName,'Quality',80)*100;
  TrackBar_Quality.Position := FAVIFileOptions.Quality div 100;
  FAVIFileOptions.KeyFrameEvery := MemIniFile.ReadInteger(SectionName,'KeyFrameEvery',60);
  SpinEdit_KeyFrameEvery.Value := FAVIFileOptions.KeyFrameEvery;
 finally
  MemIniFile.Free;
 end;
 FStartTime := now;
 if not assigned(FAVICompressor) then FAVICompressor := TAVICompressor.Create;

 SpinEdit_KBytesPerSecondChange(self);
 TrackBar_QualityChange(Self);
end;

procedure TForm_Main.FormDestroy(Sender: TObject);
var
 MemIniFile : TMemIniFile;
 loop : Integer;
 SectionName : String;
begin
 if FAVIOk then FAVICompressor.Close;

 FAVICompressor.Free;
 MemIniFile := TMemIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
 MemIniFile.WriteInteger('Main','WindowLeft',Self.Left);
 MemIniFile.WriteInteger('Main','WindowTop',Self.Top);

 try
  for loop := 0 to length(FFormWMP)-1 do
   if Assigned(FFormWMP[loop]) then
   begin
    SectionName := 'Window'+IntTostr(loop);
    MemIniFile.WriteInteger(SectionName,'WindowLeft',FFormWMP[loop].Left);
    MemIniFile.WriteInteger(SectionName,'WindowTop',FFormWMP[loop].Top);
    FFormWMP[loop].WindowsMediaPlayer1.controls.stop;
    FFormWMP[loop].Release;
   end;
 finally
  MemIniFile.UpdateFile;
  MemIniFile.Free;
 end;
end;

procedure TForm_Main.FormShow(Sender: TObject);
var
 loop : Integer;
begin
 for loop := 0 to length(FFormWMP)-1 do FFormWMP[loop].Show;
end;

procedure TForm_Main.ApplicationEvents1Idle(Sender: TObject;
 var Done: Boolean);
var
 Sectime,loop : integer;
 NowTime : TDateTime;
 BitMap : TBitmap;
begin
 Done := false;
 NowTime := Now;
 Sectime := StrToIntDef(FormatDateTime('hh',NowTime),0)*3600 +
  StrToIntDef(FormatDateTime('nn',NowTime),0)*60 +
  StrToIntDef(FormatDateTime('ss',NowTime),0);
 if (Sectime = FBefTime) or ((Sectime mod FSampSec)>0) then
 begin
  sleep(100);
  exit;
 end;

 if Button_Rec.Enabled then exit;
 SetPriorityClass(GetCurrentProcess, HIGH_PRIORITY_CLASS);
 FBefTime := Sectime;
 BitMap := TBitmap.Create;
 try
  SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
  BitMap.Width := FSaveWidth;
  BitMap.Height := FSaveHeight+FTimeStampHeight;
  BitMap.HandleType := bmDIB;
  BitMap.PixelFormat := pf24bit;
  BitMap.Canvas.Brush.Color :=clBlack;
  BitMap.Canvas.Brush.Style := bsSolid;
  BitMap.Canvas.FillRect(Rect(0,0,FSaveWidth,BitMap.Height));
  for loop := 0 to length(FFormWMP)-1 do
   if Assigned(FFormWMP[loop]) then FFormWMP[loop].CapBitMap(BitMap);
  if FTimeStampHeight > 2 then
  begin
   BitMap.Canvas.Font.Color := clWhite;
   BitMap.Canvas.Font.Height := FTimeStampHeight-2;
   BitMap.Canvas.Font.Style := [fsBold];
   BitMap.Canvas.TextOut(10,FSaveHeight+1,'['+Self.Caption +'] '+ FormatDateTime(FTimeStampFormat,NowTime));
  end;

  if (FFileDate <> Floor(NowTime*24/FRecLen)) or (not FAVIOk) then
  begin
   FFileDate := Floor(NowTime*24/FRecLen);
   if FAVIOk then FAVICompressor.Close;
   FFileName := Self.Caption +FormatDateTime(' yyyy-mm-dd hh-nn',now)+'.avi';
   FAVIOk := FAVICompressor.Open(FDir+ FFileName,FAVIFileOptions) >= 0;
   FFrameCount := 0;
  end;
  Label_Rec.Visible := FAVIOk;
  Button_Rec.Enabled := not FAVIOk;
  if FAVIOk then
  begin
   FAVICompressor.WriteFrame(BitMap);
   Inc(FFrameCount);
   StatusBar1.SimpleText := FFileName+':'+IntToStr(FFrameCount)+'Frame wrote';
  end
  else StatusBar1.SimpleText := 'AVI write error:'+FFileName;

 finally
  BitMap.Free;
  SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
 end;
end;

procedure TForm_Main.GetHandlerList;
var
ii: TICINFO;
i: DWord;
ic: THandle;
BitmapInfoHeader: TBitmapInfoHeader;
Name: WideString;
j: integer;
begin
 ComboBox_FourCC.Clear;
 FillChar(BitmapInfoHeader, SizeOf(BitmapInfoHeader), 0);
 with BitmapInfoHeader do
 begin
  biSize := SizeOf(BitmapInfoHeader);
  biWidth := FSaveWidth;
  biHeight := FSaveHeight;
  biPlanes := 1;
  biCompression := BI_RGB;
  biBitCount := 24;
 end;

 ii.dwSize := SizeOf(ii);
 for i := 0 to 200 do
 begin
  if ICInfo(ICTYPE_VIDEO, i, @ii) then
  begin
   ic := ICOpen(ICTYPE_VIDEO, ii.fccHandler, ICMODE_QUERY);
   try
    if ic <> 0 then
    begin
     if ICCompressQuery(ic, @BitmapInfoHeader, nil) = 0 then
     begin
      ICGetInfo(ic, @ii, SizeOf(ii));
      Name := '';
      for j := 0 to 15 do Name := Name + ii.szName[j];
      j := ComboBox_FourCC.Items.add(string(Name));
      ComboBox_FourCC.Items.Objects[j] := Pointer(ii.fccHandler);
     end;
    end;
   finally
    ICClose(ic);
   end;
  end;
 end;
end;

function TForm_Main.DwFourCCtoStr(FourCC: DWORD): string;
begin
 Result := Chr(FourCC and 255);    FourCC := FourCC shr 8;
 Result := Result+Chr(FourCC and 255); FourCC := FourCC shr 8;
 Result := Result+Chr(FourCC and 255); FourCC := FourCC shr 8;
 Result := Result+Chr(FourCC and 255);
end;

procedure TForm_Main.TrackBar_QualityChange(Sender: TObject);
begin
 Label_Quality.Caption := IntToStr(TrackBar_Quality.Position);
end;

procedure TForm_Main.SpinEdit_KBytesPerSecondChange(Sender: TObject);
begin
 Label_KBytesPerSecond.Caption := 'KByte/sec (1日約'+
  IntToStr(ceil(SpinEdit_KBytesPerSecond.Value*24*3600/1024/SpinEdit_SampleSec.Value))+'MB)' ;
end;

procedure TForm_Main.Button_ExitClick(Sender: TObject);
begin
 Application.Terminate;
end;

procedure TForm_Main.Button_SaveClick(Sender: TObject);
var
 MemIniFile : TMemIniFile;
 SectionName : String;
begin
 Label_Rec.Visible := false;
 if FAVIOk then FAVICompressor.Close;
 FAVIOk := false;
 MemIniFile := TMemIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
 try
  SectionName := 'Main';
  MemIniFile.WriteString(SectionName,'Title',Edit_Title.Text);
  MemIniFile.WriteInteger(SectionName,'SampleSec',SpinEdit_SampleSec.Value);
  MemIniFile.WriteString(SectionName,'Dir',Edit_Dir.Text);
  MemIniFile.WriteBool(SectionName,'AutoRecStart',CheckBox_RecStartOnStart.Checked);
  MemIniFile.WriteInteger(SectionName,'RecLen',SpinEdit_RecLength.Value);
  SectionName := 'Video';
  MemIniFile.WriteString(SectionName,'FourCC',DwFourCCtoStr(DWORD(ComboBox_FourCC.Items.Objects[ComboBox_FourCC.ItemIndex])));
  MemIniFile.WriteInteger(SectionName,'FrameRate',SpinEdit_FrameRate.Value);
  MemIniFile.WriteInteger(SectionName,'KBytesPerSecond',SpinEdit_KBytesPerSecond.Value);
  MemIniFile.WriteInteger(SectionName,'Quality',TrackBar_Quality.Position);
  MemIniFile.WriteInteger(SectionName,'KeyFrameEvery',SpinEdit_KeyFrameEvery.Value);

 finally
  MemIniFile.UpdateFile;
  MemIniFile.Free;
 end;
 FormCreate(Self);
 Button_Rec.Enabled := true;
end;

procedure TForm_Main.Button_DirClick(Sender: TObject);
begin
 if SaveDialog_Dir.Execute then
  Edit_Dir.Text := IncludeTrailingBackslash(ExtractFileDir(SaveDialog_Dir.FileName));
end;

procedure TForm_Main.Button_RecClick(Sender: TObject);
begin
 Button_Rec.Enabled := false;
end;

end.



・子フォーム(Unit_FormWMP)のソースコード

・フォームのメソッド
 TForm_WMP.CapBitMap(Bitmap: TBitmap) WMPをキャプチャする
  キャプチャする前に必ず最前のフォームになるようにしています。
  WMPのウィンドウハンドルを得てサイズを取得してメインフォームから
  渡されたDIBにコピーしています。
  if FPlaying and (FPStatus <> 3) then ・・・ はライブカメラサーバとの
  接続が切れた場合に再接続する部分です。

 WindowsMediaPlayer1PlayStateChange
 WindowsMediaPlayer1OpenStateChange
  WMPのイベントハンドラです。直接ステータスを示すプロパティが無いようなので
  イベント発生時に更新しています。


ソースはここから↓(インデントが全角になっています)
unit Unit_FormWMP;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 OleCtrls, WMPLib_TLB;

type
 TForm_WMP = class(TForm)
  WindowsMediaPlayer1: TWindowsMediaPlayer;
  procedure FormShow(Sender: TObject);
  procedure WindowsMediaPlayer1PlayStateChange(Sender: TObject;
   NewState: Integer);
  procedure WindowsMediaPlayer1OpenStateChange(Sender: TObject;
   NewState: Integer);
 private
  { Private 宣言 }
 public
  { Public 宣言 }
  Fx : Integer;
  Fy : Integer;
  FPStatus : Integer;
  FOStatus : Integer;
  FPlaying : boolean;
  FInSave : boolean;
  function CapBitMap(Bitmap : TBitmap):boolean;
 end;

var
 Form_WMP: TForm_WMP;

implementation

{$R *.DFM}

function TForm_WMP.CapBitMap(Bitmap: TBitmap): boolean;
var
 hWnd: THandle;
 media_screen_DC: HDC;
 Rect: TRect;

begin
 SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
 Self.Refresh;

 hWnd := WindowsMediaPlayer1.Handle;
 if hWnd <> 0 then
 begin
  GetWindowRect(hWnd, Rect);
  media_screen_DC:= GetDC(hWnd);
  try
   BitBlt(Bitmap.Canvas.Handle,Fx,Fy,Rect.Right - Rect.Left,Rect.Bottom - Rect.Top,media_screen_DC,0,0,SRCCOPY);
  finally
   ReleaseDC(hWnd, media_screen_DC);
  end;
 end;
 if FPlaying and (FPStatus <> 3) then
 begin
  WindowsMediaPlayer1.controls.stop;
  WindowsMediaPlayer1.controls.play;
 end;
 FPlaying := (FPStatus = 3) and (FOStatus = 13);
 Result := FPlaying;
end;


procedure TForm_WMP.FormShow(Sender: TObject);
begin
 Self.ClientWidth := 320;
 Self.ClientHeight := 240;
end;

procedure TForm_WMP.WindowsMediaPlayer1PlayStateChange(Sender: TObject;
 NewState: Integer);
begin
 FPStatus := NewState;
end;

procedure TForm_WMP.WindowsMediaPlayer1OpenStateChange(Sender: TObject;
 NewState: Integer);
begin
 FOStatus := NewState;
end;

end.



・iniファイルの内容
 全ての設定はiniファイルに書いてあります。
 セクション:MAIN
  子ウィンドウの数、仕上がり動画のサイズ、キャプチャ間隔
  終了時のウィンドウの位置等
 セクション:VIDEO
  出力AVIファイルの設定
 セクション:Window0~3
  各カメラのURLやサイズ、仕上がり画像へコピーする位置
  終了時のウィンドウの位置等

[Main]
WindowCount=4
SaveWidth=640
SaveHeight=480
SampleSec=1
WindowLeft=387
WindowTop=588
TimeStampHeight=20
TimeStampFormat=yyyy/mm/dd hh:nn:ss
Title=桜島ライブカメラ
RecLen=4
Dir=R:\My Document\My Videos\sakura\
AutoRecStart=1

[Video]
FourCC=MPG4
FrameRate=30
Compress=1
KBytesPerSecond=10
Quality=60
KeyFrameEvery=60

[Window0]
Title=海潟(10カメ)
URL=http://122.20.254.201:443/Camera10
SavePosX=0
SavePosY=0
Width=320
Height=240
WindowLeft=13
WindowTop=4

[Window1]
Title=黒神橋(6カメ)
URL=http://122.20.254.201:443/Camera06
SavePosX=320
SavePosY=0
Width=320
Height=240
WindowLeft=14
WindowTop=268

[Window2]
Title=黒神川1号ダム上流左岸(9カメ)
URL=http://122.20.254.201:443/Camera09
SavePosX=0
SavePosY=240
Width=320
Height=240
WindowLeft=13
WindowTop=799

[Window3]
Title=黒神川1号ダム上流右岸(8カメ)
URL=http://122.20.254.201:443/Camera08
SavePosX=320
SavePosY=240
Width=320
Height=240
WindowLeft=13
WindowTop=534

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

Author:YeloowCable
不定期に桜島ライブカメラの動画を掲載しています

カレンダー
03 | 2017/03 | 04
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
カテゴリ
月別アーカイブ
管理
最新記事
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。