AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firemonkey - ungültige Zeigeroperation

Ein Thema von blawen · begonnen am 16. Feb 2014 · letzter Beitrag vom 26. Feb 2014
Antwort Antwort
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
696 Beiträge
 
Delphi 12 Athens
 
#1

AW: Firemonkey - ungültige Zeigeroperation

  Alt 26. Feb 2014, 11:05
Beim ausführen des Programms bekomme ich nun keine Fehlermeldung mehr (beim beenden des Programms hingegen schon).

Ein grundlegendes Problem bleibt bei mir trotzdem (bei beiden Varianten):
Das Bild wird nach kurzer Zeit kurz eingefroren und geht dann wieder weiter. Das nächste Einfrieren findet anschliessend etwas früher statt, dafür dauert es aber etwas länger. Nach einer Minute oder so findet ein Bildwechsel nur noch alle x-Sekunden statt.
Roland
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Firemonkey - ungültige Zeigeroperation

  Alt 26. Feb 2014, 22:33
Ich denke wir haben hier primär ein Timing-Problem. Das hat Harry ja schon versucht mit dem Sleep in den Griff zu bekommen.

Das könnte sich aber auch wiederum negativ auf die Kommunikation mit der Kamera selber auswirken.

Um dem System jetzt wirklich Luft zu verschaffen, sollte es nicht für 100ms schlafen geschickt werden, sondern nur alle 100ms ein Bild von der Kamera auslesen.
Delphi-Quellcode:
type
  TForm2 = class( TForm )
    ...
  private
    FLastRead : TDateTime;
    ...
  end;

procedure TForm2.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
  if MilliSecondsBetween( FLastRead, Now ) < 100 then
    Exit;

   VideoCamera.SampleBufferToBitmap(Image1.Bitmap, True);

  //Resize the image so that the video is buffered in its original size
  if (Image1.Width <> Image1.Bitmap.Width) or (Image1.Height <> Image1.Bitmap.height) then begin
    Image1.Width:=Image1.Bitmap.Width;
    Image1.Height:=Image1.Bitmap.Height;
  end;

  FLastRead := Now;
end;
Ungetestet aber einen Blick wert.

Auch wäre es einen Versuch wert den SampleBuffer nicht direkt in die Image-Komponente zu blasen, sondern in eine unabhängige TBitmap -Instanz zu laden und dann erst der Image-Komponente zuzuweisen. Macht aber nur Sinn, wenn diese Instanz von der Form vorgehalten wird und somit nicht ständig erzeugt und zerstört wird.

Ich habe jetzt nicht im Source nachgeschaut wie der SampleBuffer in das Bitmap geschoben wird, aber es ist denkbar, dass dabei ein mehrfaches Neuzeichnen der Image-Komponente provoziert wird.

Mit der Bitmap-Instanz dazwischen müsste man das zuverlässig auf ein Neuzeichnen reduzieren können.

Eine weitere Option wäre es das VideoCaptureDevice in einem eigenen Thread zu starten und auch dort den SampleBuffer auszulesen. Hier ist jetzt noch eine geschickte Logik gefragt, wie die Image-Komponente an das Bild kommt ohne den Capture-Thread auszubremsen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:57 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