![]() |
Fmx: VideoCaptureDevice Framerate
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. ![]() aber da läuft es mit 30 fps - während ![]() 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 |
AW: Fmx: VideoCaptureDevice Framerate
**puuuush** :oops:
Hat noch Niemand mal seine Kamera gecaptchert, mit dem ![]() Wäre gut ein paar Meinungen zu bekommen ob das wohl irgendwie läuft oder ob ich bei VCL beliben muss. Rollo |
AW: Fmx: VideoCaptureDevice Framerate
Ich weiß nicht, ob dich das weiter bringt:
Das Firemonkey VideoCaptureHD-Beispiel von XE8 läuft auf meinen normalen Windows 7 PC sehr flüssig. Kamera ist eine Logitech HD Webcam C525 laut Geräte-Manager. Ich teste es gleich mal in einer Windows 10 VM. |
AW: Fmx: VideoCaptureDevice Framerate
Zitat:
Ggf. mal auf anderen Rechnern testen? Vielleicht eine ungünstige Kombination aus Webcam, VM und MacBook? |
AW: Fmx: VideoCaptureDevice Framerate
Hallo Rollo
ich habe den von dir geposteten Code laufen lassen unter Windows 10 / Seattle / FMX mit der im Notebook eingebauten WebCam - (Prozessor: i7-3632QM). Bei mir läuft das Beispiel flüssig mit 30fps, was wohl genau dem Wert entspricht, den die Kamera auch liefert. Für die Ermittlung der fps habe ich diesen (sehr einfachen) Counter verwendet:
Delphi-Quellcode:
var lcounter : integer = 0;
counter : integer = 0; ltim : DWORD = 0; function fps : integer; var gtc : DWORD; begin inc( counter ); gtc := TThread.GetTickCount; if ltim div 1000 <> gtc div 1000 then begin ltim := gtc; lcounter := counter; counter := 0; end; Result := lcounter; end; procedure TForm21.EvOnSampleBufferReady(Sender: TObject; const ATime: TMediaTime); begin FCapVideo.SampleBufferToBitmap( Image1.Bitmap, True); label1.Text := inttostr( fps ); end; |
AW: Fmx: VideoCaptureDevice Framerate
Hallo zusammen,
dankesehr für die Antworten. Das hilft mir schon weiter, dann liegt es irgendwie an meiner Konfiguration. Aber nicht nur in der VM ist es lahm, auch auf dem eigentlichen Zielrechner, für ein Kiosksystem mit XP. Naja, dann bleibe ich eben bei VCL bis ich das klären kann, da weiss ich wenigstens was ich habe. Rollo |
AW: Fmx: VideoCaptureDevice Framerate
Hallo Rollo
soeben habe ich das Programm noch auf ein "Uralt-XP Notebook" kopiert und lasse es nun mit einer via USB angeschlossenen Kamera laufen. Ich erhalte ein ruckelfreies Bild mit 30fps. Delphi Seattle Notebook: Dell inspiron mit Intel T2400 Kamera: Logitech QuickCam Pro 4000 [ Was auffällt: Der Clientbereich von Form1, welcher nicht von Image1 abgedeckt wird, wird nicht korrekt angezeigt/refresht: Wenn man mit einem anderen Fenster über Form1 fährt, dann bleiben gewisse Dinge von diesem anderen Fenster auf Form1 kleben. Aber das lässt sich ja leicht lösen. ] Gruss aus Wabern, CH Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz