Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.095 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