Home New Help Edit

DelphiXE3_FireMonkey_VideoCapture


Suns & Moon Laboratory

はじめに

DelphiXE3,FireMonkey2でビデオキャプチャーを試してみたら上手くいかなかった...orz

DelphiXE4 Trial,FireMonkey3でビデオキャプチャーを試してみたら、なんとか上手くいった。

DelphiXE4製品版でやってみたら、何もしなくてもちゃんと動いた。これにて終了。

サンプルを元にやってみる(XE3)

2013-04-21

サンプルはこれ
C:\Users\Public\Documents\RAD Studio\10.0\Samples\FireMonkey\VideoCaptureHD
とりあえず動くけど、すぐに例外で止まる。
調べてみたら、サンプルが良くないらしい。
スレッドで競合起きてるみたい。
http://blogs.embarcadero.com/teamj/2012/09/26/3484/
FireMonkey Demo - VideoCaptureHD - Video capture rendering stutter or freezes!
SampleBufferToBitmap only seems to work for TImage

という訳で、これをそのままやってみるが、まだ問題が有る。
1.停止が上手くいかない。停止使用とするとハングアップする。
2.画面上部のボタンの描画が発生すると、例外が発生する時が有る。(Layout1を非表示にすると発生しない)

不具合発生環境
Windows7 64bit
DelphiXE3

ちなみにMacOSXでは問題無く動く。

WindowsXPでは例外とか発生しないが、ビデオキャプチャウィンドウが別に開いてしまうので、アプリとして見た目が変わり過ぎてしまいます。

さて...、どうしたものやら。

サンプルを元にやってみる(XE4 Traial)

XE4のTrial版がアップされていたので、XE4で試してみました。
XE4のサンプルを試して見るも、やはり例外が発生する。
C:\Users\Public\Documents\RAD Studio\11.0\Samples\FireMonkey\VideoCaptureHD
で、色々と試して見たところとりあえずの対策が見つかりました。

対策方法発見(XE4 trial)

2013-04-24

下記3点の対策を行って、今のところは、例外が出ずに動いています。
1,2番目のは、例外対策。
3番目の対策しないと、アプリケーション終了時に固まります。

1.SampleBufferReadyでSynchronizeする
procedure TForm240.SampleBufferReady(Sender: TObject; const ATime: TMediaTime); begin VideoCamera.SampleBufferToBitmap(buffer_bmp, True); TThread.Synchronize(nil, image_update); end; procedure TForm240.image1_update; begin Image1.Bitmap.Assign(buffer_bmp); end;
2.SampleBufferReadyでSyncする為のバッファーのBitmapは、関数外に置く
BitmapをFormCreateで生成、FormDestroyで破棄する。

3.FireMonkeyのソースにパッチを当てる
※Trial版はFireMonkeyのソースが入っていなかったので、FireMonkeyのソースは、XE3の物を使いました。
FMX.Media.Win.pasのソースを、VideoCaptureHDプロジェクトフォルダにコピー。
下記関数の中にある「TThread.Synchronize(nil, Sync);」をコメントアウト
procedure TVMRRenderer.SampleBufferToBitmap(const ABitmap: TBitmap; const ASetSize: Boolean); 途中省略 //TThread.Synchronize(nil, Sync);
環境
DelphiXE4 Trial
DelphiXE3のFireMonkeyソース
Windows7 64

まとめ

とりあえずXE4にアップデートした方が良さそうですね〜

Home New Help Edit
2013-05-08 22:27:11 32400