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にアップデートした方が良さそうですね〜
2024-08-14 11:00:24 32400