AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fmx: VideoCaptureDevice Framerate

Ein Thema von Rollo62 · begonnen am 15. Sep 2015 · letzter Beitrag vom 16. Sep 2015
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.103 Beiträge
 
Delphi 12 Athens
 
#1

Fmx: VideoCaptureDevice Framerate

  Alt 15. Sep 2015, 09:10
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
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.103 Beiträge
 
Delphi 12 Athens
 
#2

AW: Fmx: VideoCaptureDevice Framerate

  Alt 15. Sep 2015, 20:36
**puuuush**

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
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Fmx: VideoCaptureDevice Framerate

  Alt 16. Sep 2015, 09:30
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Fmx: VideoCaptureDevice Framerate

  Alt 16. Sep 2015, 09:43
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?
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Fmx: VideoCaptureDevice Framerate

  Alt 16. Sep 2015, 10:14
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;
Michael Gasser

Geändert von mkinzler (16. Sep 2015 um 10:21 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.103 Beiträge
 
Delphi 12 Athens
 
#6

AW: Fmx: VideoCaptureDevice Framerate

  Alt 16. Sep 2015, 12:40
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
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
763 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Fmx: VideoCaptureDevice Framerate

  Alt 16. Sep 2015, 13:45
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
Michael Gasser
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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