Hallo zusammen,
ich versuche die VideoKamera unter FMX zu benutzen, (in VM: MacBook, VmWare Fusion 8, Win8.1, RadXE8 Upd1).
Dazu gibt es ein paar Beispiele im Netz und Xe8-Samples, die im Wesentlichen immer auf den gleichen Kern hinausgehen: OnSampleBufferReady( Bitmap, Time);
In älteren Versionen (ab XE3) wird noch ein TThread.Synchronize dazwischengebaut zu werden, dies scheint
in XE8 aber schon im SampleBufferReady intern benutzt zu werden.
Jedenfalls macht es auch keinen Unterschied bei mir.
Wenn ich unter denselben Bedingungen mit
VCL-
DirectX Komponenten oder meinetwegen auch dem VLC-Player
das Capture mache bekomme ich ein normales, schnelles Video.
Unter FMX s.o. ist es so wie beschreiben aber extrem langsam: Framerate ca. 1 Sek.
Also der Code sieht so aus:
Code:
unit US4CaptureVid;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects
, FMX.Media, FMX.ImgList, FMX.MaterialSources
;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FCapVideo: TVideoCaptureDevice;
procedure EvOnSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.EvOnSampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
FCapVideo.SampleBufferToBitmap( Image1.Bitmap, True);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FCapVideo := TCaptureDeviceManager.Current.DefaultVideoCaptureDevice;
if Assigned(FCapVideo) then
begin
FCapVideo.OnSampleBufferReady := EvOnSampleBufferReady;
FCapVideo.StartCapture;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FCapVideo) then
begin
FCapVideo.StopCapture;
end;
end;
end.
Der Code oben zeigt mir das Video prinzipiell an, allerdings
- es nimmt anscheinend im Default nur 160x120 Pixel dafür
(da kann man andere Auflösungen auswählen, das bringt aber bzgl. Framerate gar nichts)
- die Framerate ist und bleibt ca. 1 Sek.
* Ich habe auch schon die Capture Parameter angeschaut, daran geändert, etc. dort wird zwar 30 fps angezeigt
was aber so nicht als Video ankommt.
* Ich habe auch mit dem zusätzlichen TThread.Synchronize gearbeitet, wie in älteren Tutorials beschrieben,
keine Verbesserung
* Ich habe auch versucht statt in Image1 erst über ein TBitmap zu schreiben,
keine Verbesserung
* Ich habe auch das Zielbitmap vordefiniert mit festen Dimensionen:
keine Verbesserung
Also ich finde z.B. mehrere ähnliche Tutorials im Netz:
- wobei z.B.
Allister Christie ein Demo 1:1 wie oben zeigt,
aber da läuft es mit 30 fps
- während
DavidI ein Demo hat das genauso ruckelt wie bei mir
Liegt das Problem vielleicht an der VM, kann ich nicht wirklich glauben ?
Ich habe es aber auch auf dem eigentlichen Zielrechner mit WinXP getestet: keine Verbesserung
Die
VCL-
DirectX Lösung läuft damit aber wie gewollt.
Mache ich hier generell etwas falsch, das FMX basiert doch intern auch auf
DirectX und die Ergebnisse sollten
zumindest ähnlich sein ?
Gibt es evtl. eine Komponente für FMX die das richtig hinbekommt (Boian Mitov hat kein FMX) ?
Rollo