Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Fmx: VideoCaptureDevice Framerate (https://www.delphipraxis.net/186587-fmx-videocapturedevice-framerate.html)

Rollo62 15. Sep 2015 08:10

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. 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

Rollo62 15. Sep 2015 19:36

AW: Fmx: VideoCaptureDevice Framerate
 
**puuuush** :oops:

Hat noch Niemand mal seine Kamera gecaptchert, mit dem Standardbeispiel von Firemonkey ?
Wäre gut ein paar Meinungen zu bekommen ob das wohl irgendwie läuft oder ob ich bei VCL beliben muss.

Rollo

TiGü 16. Sep 2015 08:30

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.

TiGü 16. Sep 2015 08:43

AW: Fmx: VideoCaptureDevice Framerate
 
Zitat:

Zitat von TiGü (Beitrag 1315934)
Ich teste es gleich mal in einer Windows 10 VM.

Auch hier läuft es sehr flüssig im VMWare Player.
Ggf. mal auf anderen Rechnern testen?
Vielleicht eine ungünstige Kombination aus Webcam, VM und MacBook?

Michael II 16. Sep 2015 09:14

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;

Rollo62 16. Sep 2015 11:40

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

Michael II 16. Sep 2015 12:45

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 00:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz