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.