![]() |
VFW- Problem
Hallo, Delphi- Freunde !
Wer kennt sich mit VFW aus ? Problem AVI- Capturen: Capturen funktioniert- hab' da schon was zusammenbekommen...Aber ich brauche noch die Anzahl der gecaptureten Frames, sowie der Dropped Frames...VFW bietet dazu unter CAPSTATUS an: DWORD dwCurrentVideoFrame; # of video frames cap'td DWORD dwCurrentVideoFramesDropped; # of video frames dropped Sollte doch dem Namen nach so sein, daß man während des Capturens dort die Anzahl der gecaptureten Frames/ Dropped Frames abgreifen kann. Ein Versuch, etwas anzuzeigen, schlägt aber fehl. Weder die Anzeige in einem Editfeld (zeigt immer "1") noch dasselbe mit Hilfe eines Timers funktioniert (zeigt immer "5346703717930793", egal, welches Timerintervall). Gefunden habe ich auch nichts drüber. Nur einen Trick mit einem Timer, der nebenbei mitläuft und die Anzahl der Frames "künstlich" darstellt (Zeit/ Millisekunden für einen Frame), das kann es doch nicht sein... In einigen Samples, die ich fand, wurde ein Errorstring von der AVICAP- Unit abgegriffen, der steht aber erst nach dem Capture- Vorgang zur Verfügung... Hat da jemand 'ne Idee, was da falsch läuft ? ft16a
Delphi-Quellcode:
procedure TMain.Timer1Timer(Sender: TObject);
VAR _CapStatus: TCapStatus ; _CapturedFrames: Int64 ; begin _CapturedFrames:= _CapStatus.dwCurrentVideoFrame + _CapturedFrames ; Edit_Frame.Text := IntToStr(_CapturedFrames) ; end; |
Re: VFW- Problem
Eventuell findest du hier was:
![]() |
Re: VFW- Problem
ist doch irgendwo auch logich das sich da nix ändert.
Mit
Delphi-Quellcode:
legst du ja nur die Struktur an welche du dann mit
_CapStatus: TCapStatus;
Delphi-Quellcode:
ausliest. Mich wundert eigentlich das der Compiler dir keine Meldung bringt das
_CapturedFrames:= _CapStatus.dwCurrentVideoFrame + _CapturedFrames ;
"CapturedFrames" und "_CapStatus" nie initalisiert wird. Du musst diese Struktur irgendwo dem Capturing-Prozess übergeben ansonsten werden eben diese Variablen nie geändert. Der Wert "5346703717930793" kommt dann auch daher das die Variable nie geschrieben wird und in dem Speicher eben dieser Wert schon drin steht. Das was du vesucht hast kommt folgendem Beispiel gleich
Delphi-Quellcode:
und der Frage "Warum ist i nicht 5983", worauf die Antwort wäre das i nirgends ein Wert zugewiesen wird. Und in deinem Beispiel ist genau das gleiche der Fall, es wird den Variablen nie ein Wert zugewiesen und ich könnte fast wetten das der Compiler eine Warnung ausgegeben hat (Warnungen haben einen Sinn!!!).
var i: Integer;
begin showmessage(inttostr(i)); |
Re: VFW- Problem
Danke für die schnellen Antworten...!
Zur 1. Antwort: Die genannten Samples hatte ich schon, fand darin nichts dazu...Wie eben überhaupt nicht zu dem Thema, außer dem Trick mit dem Timer... Zu 2.: Ja, Warnmeldung gibt es (für _CapturedFrames), ist klar...Ohne Timer hatte ich sie auch initialisiert, das mit dem Timer war nur ein Versuch, wenn ich die Variable global deklariere und in FormCreate mit 0 belege, dann lese ich "0". Wenn eine Variable nicht initialisiert ist, müßte ihr dennoch ein Wert aus einer Funktion zugewiesen werden können...Hier kommt keiner, und dann krieg' ich den Wert, der gerade im Speicher steht. Frage also: Wieso bekomme ich keinen Wert... Zitat:
Delphi-Quellcode:
Klappt auch nicht- Fehlermeldung: Objekt oder Klassentyp erforderlich.
public
_CapStatus: TCapStatus ; var Main: TMain; _CapturedFrames: Int64 ; implementation ... procedure TMain.FormCreate(Sender: TObject); var ... ... begin _CapStatus := TCapStatus.Create ; _CapturedFrames := 0 ; ... procedure TMain.Timer1Timer(Sender: TObject); begin _CapturedFrames:= _CapStatus.dwCurrentVideoFrame + _CapturedFrames ; Edit_Frame.Text := IntToStr(_CapturedFrames) ; end; Ohne den Eintrag in Create: Bleibt der Wert der Variable "O". Eine Struktur dem Cap- Prozeß übergeben, aus dem sie kommt...Grübel... ![]() Könnte mich jemand erleuchten ? |
Re: VFW- Problem
Bei mir im PSDK steht dazu:
Zitat:
|
Re: VFW- Problem
Hallo, Delphi- Freunde !
Ich hab' nun doch eine brauchbare Lösung gefunden: Ich schnappe mir Strings, die von meiner Videocapturing- Komponente (TVideo- Komponente für Delphi 5) erzeugt werden, die Dinger kann man an der Eigenschaft OnError und StatusCallback abgreifen. So sehen die Strings etwa aus (Capture von einer Webcam, deshalb guibt es eine Errorstring- Ausgabe): Zitat:
nicht mit anzeigen will. Das steht dann in der Main:
Delphi-Quellcode:
Nun, das funktioniert...aber ich würde doch gern mal die eigentlich dafür gedachten Ausgaben von
procedure TMain.CaptureWindowStatusCallback(
Sender: TObject; nID: Integer; status: String ); Begin {Status live anzeigen} Edit_Frame.Text := status ; if nID =IDS_CAP_STAT_VIDEOCURRENT then exit; ... ... End ; procedure TMain.CaptureWindowError( sender: TObject; nID: Integer; errorstr: String ); begin Edit_CapturedFrames.Text := errorstr ; end; dwCurrentVideoFrame und dwCurrentDroppedFrames nutzen, die, wie ich schrieb, ja keine Variable mit einem Wert beglücken...Hat da jemand eine Idee, was da undufte ist ? Übrigens funktioniert eine Delphi- Videocapturing- Anwendung (Capturing von VHS- Videokamera) ausgezeichnet...Dropped Frames sind äußerst selten... Deshab brauchte ich ja die Anzeige...greift wohl auf andere Windows- Komponenten zu, mit Virtual Dub gibt es (bei Verwendung der selben Kompressions- Codecs und weitgehend derselben Einstellungen) jede Menge Dropped Frames. ft16a |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 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